From d4f630d980da24658724135435a5082ea65d9838 Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Fri, 23 Nov 2007 15:15:47 -0500 Subject: [PATCH] Import 2.1.107 --- Documentation/00-INDEX | 4 +- Documentation/Changes | 2 +- Documentation/CodingStyle | 2 +- Documentation/Configure.help | 42 + Documentation/IO-APIC.txt | 3 +- Documentation/IO-mapping.txt | 27 +- Documentation/SMP.txt | 8 +- Documentation/VGA-softcursor.txt | 33 +- Documentation/exception.txt | 10 +- Documentation/fb/00-INDEX | 15 + Documentation/{m68k => fb}/framebuffer.txt | 11 +- Documentation/fb/internals.txt | 86 + Documentation/fb/vesafb.txt | 71 + Documentation/filesystems/00-INDEX | 8 +- Documentation/filesystems/affs.txt | 18 +- Documentation/filesystems/coda.txt | 23 +- Documentation/filesystems/fat_cvf.txt | 16 +- Documentation/filesystems/hpfs.txt | 2 +- Documentation/filesystems/isofs.txt | 8 +- Documentation/filesystems/romfs.txt | 13 +- Documentation/filesystems/vfat.txt | 4 +- Documentation/filesystems/vfs.txt | 18 +- Documentation/hayes-esp.txt | 6 +- Documentation/initrd.txt | 8 +- Documentation/kmod.txt | 6 +- Documentation/mca.txt | 4 +- Documentation/networking/framerelay.txt | 4 +- Documentation/networking/sktr.txt | 147 + Documentation/nfsroot.txt | 10 +- Documentation/ramdisk.txt | 97 +- Documentation/smp.tex | 2 +- Documentation/spinlocks.txt | 2 +- Documentation/svga.txt | 11 +- Documentation/sysctl/README | 1 - Documentation/sysctl/kernel.txt | 15 +- Documentation/sysctl/vm.txt | 15 +- Documentation/sysrq.txt | 2 +- Documentation/watchdog.txt | 2 +- Makefile | 8 +- README | 13 +- Rules.make | 6 +- arch/alpha/config.in | 6 + arch/alpha/kernel/apecs.c | 2 +- arch/alpha/kernel/bios32.c | 12 +- arch/alpha/kernel/cia.c | 2 +- arch/alpha/kernel/irq.c | 2 +- arch/alpha/kernel/lca.c | 2 +- arch/alpha/kernel/mcpcia.c | 2 +- arch/alpha/kernel/osf_sys.c | 10 +- arch/alpha/kernel/process.c | 4 +- arch/alpha/kernel/pyxis.c | 2 +- arch/alpha/kernel/setup.c | 32 +- arch/alpha/kernel/smc37c669.c | 2 +- arch/alpha/kernel/smp.c | 9 +- arch/alpha/kernel/t2.c | 4 +- arch/alpha/kernel/time.c | 2 +- arch/alpha/kernel/tsunami.c | 6 +- arch/alpha/lib/strlen_user.S | 2 +- arch/alpha/mm/fault.c | 2 +- arch/i386/boot/bootsect.S | 2 +- arch/i386/boot/compressed/misc.c | 2 +- arch/i386/boot/setup.S | 32 +- arch/i386/boot/tools/build.c | 2 +- arch/i386/boot/video.S | 135 +- arch/i386/config.in | 9 +- arch/i386/defconfig | 2 +- arch/i386/kernel/io_apic.c | 66 +- arch/i386/kernel/irq.c | 4 +- arch/i386/kernel/mtrr.c | 4 +- arch/i386/kernel/process.c | 4 +- arch/i386/kernel/setup.c | 27 +- arch/i386/kernel/smp.c | 66 +- arch/i386/kernel/sys_i386.c | 2 +- arch/i386/kernel/traps.c | 2 +- arch/i386/kernel/vm86.c | 4 +- arch/i386/lib/checksum.c | 10 +- arch/i386/lib/locks.S | 2 +- arch/i386/math-emu/README | 4 +- arch/i386/math-emu/reg_mul.c | 2 +- arch/m68k/config.in | 3 - arch/ppc/config.in | 22 +- arch/ppc/kernel/chrp_setup.c | 6 +- arch/ppc/kernel/pmac_setup.c | 9 +- arch/ppc/kernel/prep_setup.c | 6 +- drivers/Makefile | 22 +- drivers/block/Config.in | 6 +- drivers/block/README.fd | 6 +- drivers/block/acsi.c | 4 +- drivers/block/floppy.c | 6 +- drivers/block/genhd.c | 2 +- drivers/block/hd.c | 10 +- drivers/block/ht6560b.c | 6 +- drivers/block/md.c | 6 +- drivers/block/paride/epia.c | 6 +- drivers/block/paride/paride.c | 5 + drivers/block/paride/pcd.c | 15 +- drivers/block/paride/pd.c | 24 +- drivers/block/paride/pf.c | 16 +- drivers/block/paride/pg.c | 40 +- drivers/block/paride/pt.c | 16 +- drivers/block/raid1.c | 4 +- drivers/block/rd.c | 63 +- drivers/block/xd.c | 2 +- drivers/char/ChangeLog | 16 +- drivers/char/Makefile | 11 +- drivers/char/console.c | 1278 ++++--- drivers/char/console_macros.h | 65 + drivers/char/fbmem.c | 631 +++- drivers/char/h8.c | 16 +- drivers/char/h8.h | 2 +- drivers/char/i2c.h | 2 +- drivers/char/mem.c | 10 +- drivers/char/msp3400.c | 14 +- drivers/char/random.c | 6 +- drivers/char/rtc.c | 11 +- drivers/char/selection.c | 37 +- drivers/char/tga.c | 1169 ------- drivers/char/vc_screen.c | 40 +- drivers/char/vesa_blank.c | 290 -- drivers/char/vga.c | 635 ---- drivers/char/vt.c | 11 +- drivers/char/wdt.c | 2 +- drivers/macintosh/aty.c | 10 +- drivers/macintosh/chips.c | 5 +- drivers/macintosh/control.c | 3 +- drivers/macintosh/imstt.c | 4 +- drivers/macintosh/platinum.c | 9 +- drivers/macintosh/pmac-cons.c | 7 +- drivers/macintosh/valkyrie.c | 3 +- drivers/net/3c505.c | 6 +- drivers/net/3c505.h | 2 +- drivers/net/Config.in | 1 + drivers/net/Makefile | 8 + drivers/net/Space.c | 3 + drivers/net/eexpress.c | 2 +- drivers/net/sdla_fr.c | 6 +- drivers/net/sdla_ppp.c | 4 +- drivers/net/sdla_x25.c | 36 +- drivers/net/sdladrv.c | 2 +- drivers/net/sktr.c | 2696 +++++++++++++++ drivers/net/sktr.h | 1098 ++++++ drivers/net/sktr_firmware.h | 3616 ++++++++++++++++++++ drivers/net/tlan.c | 4 +- drivers/sbus/audio/cs4215.h | 4 +- drivers/sbus/char/bpp.c | 2 +- drivers/video/Config.in | 32 + drivers/video/Makefile | 32 +- drivers/video/S3triofb.c | 256 +- drivers/video/amifb.c | 32 +- drivers/video/atafb.c | 27 +- drivers/video/aty.h | 123 +- drivers/video/atyfb.c | 1865 ++++++---- drivers/video/compatcon.c | 354 ++ drivers/video/cyberfb.c | 59 +- drivers/video/dnfb.c | 8 +- drivers/video/fbcon-afb.c | 2 +- drivers/video/fbcon-cfb16.c | 4 +- drivers/video/fbcon-cfb2.c | 2 +- drivers/video/fbcon-cfb24.c | 6 +- drivers/video/fbcon-cfb32.c | 2 +- drivers/video/fbcon-cfb4.c | 2 +- drivers/video/fbcon-cfb8.c | 4 +- drivers/video/fbcon-ilbm.c | 2 +- drivers/video/fbcon-iplan2p2.c | 3 +- drivers/video/fbcon-iplan2p4.c | 3 +- drivers/video/fbcon-iplan2p8.c | 3 +- drivers/video/fbcon-mac.c | 2 +- drivers/video/fbcon-mfb.c | 2 +- drivers/video/fbcon-vga.c | 190 + drivers/video/fbcon-vga.h | 15 + drivers/video/fbcon.c | 147 +- drivers/video/fbcon.h | 60 +- drivers/video/fonts.c | 2 +- drivers/video/hpfb.c | 431 +++ drivers/video/macfb.c | 15 +- drivers/video/mdafb.c | 485 +++ drivers/video/offb.c | 53 +- drivers/video/retz3fb.c | 57 +- drivers/video/skeletonfb.c | 4 +- drivers/video/tgafb.c | 11 +- drivers/video/txtcon.c | 14 +- drivers/video/vesafb.c | 538 +++ drivers/video/vfb.c | 8 +- drivers/video/vgacon.c | 45 +- drivers/video/vgafb.c | 746 ++++ drivers/video/virgefb.c | 59 +- fs/Config.in | 11 +- fs/Makefile | 6 +- fs/adfs/Makefile | 6 +- fs/adfs/file.c | 2 +- fs/affs/Changes | 10 +- fs/affs/Makefile | 6 +- fs/affs/amigaffs.c | 2 +- fs/affs/dir.c | 2 +- fs/affs/file.c | 8 +- fs/affs/super.c | 2 +- fs/binfmt_elf.c | 6 +- fs/buffer.c | 2 +- fs/coda/Makefile | 4 +- fs/coda/dir.c | 2 +- fs/devpts/Makefile | 2 +- fs/dquot.c | 18 +- fs/fat/Makefile | 6 +- fs/fat/buffer.c | 2 +- fs/fat/dir.c | 2 +- fs/fat/file.c | 6 +- fs/hfs/ChangeLog | 4 +- fs/hfs/FAQ.txt | 2 +- fs/hfs/Makefile | 6 +- fs/hpfs/Makefile | 6 +- fs/hpfs/hpfs.h | 12 +- fs/inode.c | 6 +- fs/ioctl.c | 2 +- fs/isofs/Makefile | 6 +- fs/isofs/dir.c | 4 +- fs/isofs/file.c | 4 +- fs/isofs/inode.c | 8 +- fs/isofs/joliet.c | 2 +- fs/isofs/namei.c | 2 +- fs/isofs/rock.c | 2 +- fs/isofs/symlink.c | 2 +- fs/isofs/util.c | 4 +- fs/minix/Makefile | 6 +- fs/minix/file.c | 2 +- fs/minix/inode.c | 4 +- fs/minix/truncate.c | 2 +- fs/msdos/Makefile | 4 +- fs/namei.c | 2 +- fs/nfs/Makefile | 6 +- fs/nfs/dir.c | 2 +- fs/nfs/inode.c | 2 +- fs/nfs/write.c | 4 +- fs/nfsd/Makefile | 6 +- fs/nfsd/nfsfh.c | 40 +- fs/nfsd/nfsproc.c | 8 +- fs/nfsd/vfs.c | 8 +- fs/ntfs/attr.c | 2 +- fs/ntfs/dir.c | 2 +- fs/ntfs/inode.c | 2 +- fs/ntfs/support.c | 2 +- fs/pipe.c | 6 +- fs/proc/Makefile | 6 +- fs/proc/array.c | 6 +- fs/proc/net.c | 2 +- fs/romfs/Makefile | 6 +- fs/romfs/inode.c | 2 +- fs/stat.c | 2 +- fs/super.c | 12 +- fs/ufs/Makefile | 6 +- fs/ufs/ufs_inode.c | 2 + include/asm-alpha/apecs.h | 2 +- include/asm-alpha/elf.h | 2 +- include/asm-alpha/io.h | 4 +- include/asm-alpha/linux_logo.h | 69 + include/asm-alpha/pgtable.h | 34 +- include/asm-alpha/signal.h | 2 +- include/asm-alpha/t2.h | 4 +- include/asm-alpha/uaccess.h | 4 +- include/asm-i386/bugs.h | 12 +- include/asm-i386/elf.h | 2 +- include/asm-i386/linux_logo.h | 92 + include/asm-i386/pgtable.h | 2 +- include/asm-i386/smp.h | 2 +- include/asm-i386/softirq.h | 2 +- include/asm-i386/string.h | 2 +- include/asm-i386/vm86.h | 2 +- include/linux/atalk.h | 4 +- include/linux/blk.h | 6 +- include/linux/bpqether.h | 2 +- include/linux/byteorder/generic.h | 2 +- include/linux/byteorder/swab.h | 2 +- include/linux/coda.h | 1 - include/linux/console.h | 39 +- include/linux/console_compat.h | 163 + include/linux/console_struct.h | 88 +- include/linux/elf.h | 6 +- include/linux/fb.h | 56 +- include/linux/fd.h | 2 +- include/linux/kernel_stat.h | 2 +- include/linux/linux_logo.h | 1444 ++++++++ include/linux/msdos_fs_i.h | 2 +- include/linux/netdevice.h | 2 +- include/linux/pci.h | 5 + include/linux/sched.h | 2 +- include/linux/sdla_x25.h | 36 +- include/linux/selection.h | 143 +- include/linux/socket.h | 2 +- include/linux/tty.h | 43 +- include/linux/vt_kern.h | 2 + init/main.c | 2 +- kernel/acct.c | 2 +- kernel/kmod.c | 11 +- kernel/resource.c | 2 +- kernel/sched.c | 6 +- kernel/signal.c | 4 +- kernel/sys.c | 12 +- lib/inflate.c | 12 +- mm/filemap.c | 4 +- mm/page_alloc.c | 2 +- mm/page_io.c | 2 +- mm/slab.c | 82 +- mm/swap.c | 2 +- mm/swapfile.c | 2 +- mm/vmscan.c | 2 +- net/appletalk/aarp.c | 12 +- net/appletalk/ddp.c | 46 +- net/appletalk/sysctl_net_atalk.c | 2 +- net/wanrouter/wanmain.c | 2 +- scripts/Configure | 4 +- scripts/header.tk | 2 +- 310 files changed, 16811 insertions(+), 5080 deletions(-) create mode 100644 Documentation/fb/00-INDEX rename Documentation/{m68k => fb}/framebuffer.txt (98%) create mode 100644 Documentation/fb/internals.txt create mode 100644 Documentation/fb/vesafb.txt create mode 100644 Documentation/networking/sktr.txt create mode 100644 drivers/char/console_macros.h delete mode 100644 drivers/char/tga.c delete mode 100644 drivers/char/vesa_blank.c delete mode 100644 drivers/char/vga.c create mode 100644 drivers/net/sktr.c create mode 100644 drivers/net/sktr.h create mode 100644 drivers/net/sktr_firmware.h create mode 100644 drivers/video/compatcon.c create mode 100644 drivers/video/fbcon-vga.c create mode 100644 drivers/video/fbcon-vga.h create mode 100644 drivers/video/hpfb.c create mode 100644 drivers/video/mdafb.c create mode 100644 drivers/video/vesafb.c create mode 100644 drivers/video/vgafb.c create mode 100644 include/asm-alpha/linux_logo.h create mode 100644 include/asm-i386/linux_logo.h create mode 100644 include/linux/console_compat.h create mode 100644 include/linux/linux_logo.h diff --git a/Documentation/00-INDEX b/Documentation/00-INDEX index 18ec845df839..ed078ac3e1d3 100644 --- a/Documentation/00-INDEX +++ b/Documentation/00-INDEX @@ -66,7 +66,7 @@ logo.gif logo.txt - Info on creator of above logo & site to get additional images from. m68k/ - - directory with info about Linux on Motorola 68k archtecture. + - directory with info about Linux on Motorola 68k architecture. magic-number.txt - list of magic numbers used to mark/protect kernel data structures. mandatory.txt @@ -84,7 +84,7 @@ mtrr.txt nbd.txt - info on a TCP implementation of a network block device. networking/ - - directory with info on various linux networking aspects. + - directory with info on various aspects of networking with Linux. nfsroot.txt - short guide on setting up a diskless box with NFS root filesystem oops-tracing.txt diff --git a/Documentation/Changes b/Documentation/Changes index 2dfc18c92876..15afefdcfa14 100644 --- a/Documentation/Changes +++ b/Documentation/Changes @@ -71,7 +71,7 @@ General Information now performs a cold reboot instead of a warm reboot for increased hardware compatibility. If you want a warm reboot and know it works on your hardware, add a "reboot=warm" command line option -in Lilo. A small number of machines need "reboot=bios" to reboot via +in LILO. A small number of machines need "reboot=bios" to reboot via the BIOS. Also, please remember that cua* devices are now obsolete. Switch to diff --git a/Documentation/CodingStyle b/Documentation/CodingStyle index 4cbac4e70cb3..edba246996be 100644 --- a/Documentation/CodingStyle +++ b/Documentation/CodingStyle @@ -169,7 +169,7 @@ it. Chapter 6: You've made a mess of it -That's ok, we all do. You've probably been told by your long-time unix +That's OK, we all do. You've probably been told by your long-time Unix user helper that "GNU emacs" automatically formats the C sources for you, and you've noticed that yes, it does do that, but the defaults it uses are less than desirable (in fact, they are worse than random diff --git a/Documentation/Configure.help b/Documentation/Configure.help index 738a6715a7bf..814ff969f27d 100644 --- a/Documentation/Configure.help +++ b/Documentation/Configure.help @@ -5407,6 +5407,20 @@ CONFIG_IBMTR The module will be called ibmtr.o. If you want to compile it as a module, say M here and read Documentation/modules.txt. +SysKonnect adapter support +CONFIG_SKTR + This is support for all SysKonnect Token Ring cards. Specificly + SysKonnect TR4/16(+) ISA (SK-4190), SysKonnect TR4/16(+) PCI + (SK-4590), SysKonnect TR4/16 PCI (SK-4591) adapters. + + If you have such an adapter and would like to use it, say Y or M + and read the Token-Ring mini-HOWTO, available via ftp (user:anonymous) + from ftp://sunsite.unc.edu/pub/Linux/docs/HOWTO. + + Also read the sktr.txt in linux/Documentation/networking or check + the Linux-SNA WWW site for the latest information at + http://samba.anu.edu.au/linux-sna/documents/drivers/SysKonnect/ + Traffic Shaper (EXPERIMENTAL) CONFIG_SHAPER The traffic shaper is a virtual network device that allows you to @@ -9169,6 +9183,34 @@ CONFIG_VIDEO_PMS from the running kernel whenever you want). If you want to compile it as a module, say M here and read Documentation/modules.txt. +# drivers/video section +Open Firmware frame buffer device support +CONFIG_FB_OF + Say Y if you want support with Open Firmware for your graphics board. + +S3 Trio frame buffer device support +CONFIG_FB_S3TRIO + If you have a S3 Trio say Y. Say N for S3 Virge. + +ATI Mach64 display support +CONFIG_FB_ATY + This driver supports graphics boards with the ATI Mach64 chips. + +MDA dual-headed support +CONFIG_FB_MDA + Say Y here if you have an old MDA or monochrome Hercules graphics + adapter in your system acting as a second head ( = videocard). Do + not enable this driver if your MDA card is the primary card in your + system; the normal VGA driver will handle it. + + This driver is also available as a module ( = code which can be + inserted and removed from the running kernel whenever you want). + The module will be called mdafb.o. If you want to compile it as + a module, say M here and read Documentation/modules.txt. + + If unsure, say N. + + CPU Optimisation CONFIG_CPU_ARM2 This selects the processor type of your CPU. This is only used to diff --git a/Documentation/IO-APIC.txt b/Documentation/IO-APIC.txt index af089ee9d668..76b939e8a317 100644 --- a/Documentation/IO-APIC.txt +++ b/Documentation/IO-APIC.txt @@ -1,5 +1,4 @@ - -most (all) Intel SMP boards have the so-called 'IO-APIC', which is +Most (all) Intel SMP boards have the so-called 'IO-APIC', which is an enhanced interrupt controller, able to route hardware interrupts to multiple CPUs, or to CPU groups. diff --git a/Documentation/IO-mapping.txt b/Documentation/IO-mapping.txt index bd361f23dc95..b18355ba77b3 100644 --- a/Documentation/IO-mapping.txt +++ b/Documentation/IO-mapping.txt @@ -1,8 +1,7 @@ - -[ This is a mail-message in response to a query on IO mapping, thus the +[ This is a mail message in response to a query on IO mapping, thus the strange format for a "document" ] -The aha1542 is a bus-master device, and your patch makes the driver give the +The AHA-1542 is a bus-master device, and your patch makes the driver give the controller the physical address of the buffers, which is correct on x86 (because all bus master devices see the physical memory mappings directly). @@ -11,9 +10,9 @@ at memory addresses, and in this case we actually want the third, the so-called "bus address". Essentially, the three ways of addressing memory are (this is "real memory", -ie normal RAM, see later about other details): +that is, normal RAM--see later about other details): - - CPU untranslated. This is the "physical" address, ie physical address + - CPU untranslated. This is the "physical" address. Physical address 0 is what the CPU sees when it drives zeroes on the memory bus. - CPU translated address. This is the "virtual" address, and is @@ -27,7 +26,7 @@ ie normal RAM, see later about other details): things any more complex than necessary, so you can assume that all external hardware sees the memory the same way. -Now, on normal PC's the bus address is exactly the same as the physical +Now, on normal PCs the bus address is exactly the same as the physical address, and things are very simple indeed. However, they are that simple because the memory and the devices share the same address space, and that is not generally necessarily true on other PCI/ISA setups. @@ -35,13 +34,13 @@ not generally necessarily true on other PCI/ISA setups. Now, just as an example, on the PReP (PowerPC Reference Platform), the CPU sees a memory map something like this (this is from memory): - 0-2GB "real memory" - 2GB-3GB "system IO" (ie inb/out type accesses on x86) - 3GB-4GB "IO memory" (ie shared memory over the IO bus) + 0-2 GB "real memory" + 2 GB-3 GB "system IO" (inb/out and similar accesses on x86) + 3 GB-4 GB "IO memory" (shared memory over the IO bus) Now, that looks simple enough. However, when you look at the same thing from the viewpoint of the devices, you have the reverse, and the physical memory -address 0 actually shows up as address 2GB for any IO master. +address 0 actually shows up as address 2 GB for any IO master. So when the CPU wants any bus master to write to physical memory 0, it has to give the master address 0x80000000 as the memory address. @@ -53,7 +52,7 @@ PPC, you can end up with a setup like this: virtual address: 0xC0000000 bus address: 0x80000000 -where all the addresses actually point to the same thing, it's just seen +where all the addresses actually point to the same thing. It's just seen through different translations.. Similarly, on the Alpha, the normal translation is @@ -119,7 +118,7 @@ be remapped (the memory management layer doesn't know about devices outside the CPU, so it shouldn't need to know about "bus addresses" etc). NOTE NOTE NOTE! The above is only one part of the whole equation. The above -only talks about "real memory", ie CPU memory, ie RAM. +only talks about "real memory", that is, CPU memory (RAM). There is a completely different type of memory too, and that's the "shared memory" on the PCI or ISA bus. That's generally not RAM (although in the case @@ -160,14 +159,14 @@ For such memory, you can do things like iounmap(baseptr); - copying and clearing: - /* get the 6-byte ethernet address at ISA address E000:0040 */ + /* get the 6-byte Ethernet address at ISA address E000:0040 */ memcpy_fromio(kernel_buffer, 0xE0040, 6); /* write a packet to the driver */ memcpy_toio(0xE1000, skb->data, skb->len); /* clear the frame buffer */ memset_io(0xA0000, 0, 0x10000); -Ok, that just about covers the basics of accessing IO portably. Questions? +OK, that just about covers the basics of accessing IO portably. Questions? Comments? You may think that all the above is overly complex, but one day you might find yourself with a 500 MHz Alpha in front of you, and then you'll be happy that your driver works ;) diff --git a/Documentation/SMP.txt b/Documentation/SMP.txt index 72369fcdb5ec..deac933c8afb 100644 --- a/Documentation/SMP.txt +++ b/Documentation/SMP.txt @@ -1,4 +1,4 @@ -SMP on x86/Linux is now an official feature and is not exprtimental. +SMP on x86/Linux is now an official feature and is not experimental. Experimental SMP support for other architectures is underway. Please view linux/Documentation/smp for more information about enabling SMP. @@ -10,11 +10,11 @@ To fix: o Clean up processor specific/independent split. o Document it all. [PARTLY DONE] -o Halt other CPU's on reset/panic doesn't always work. -o Don't waste page at 4K - don't need it now.(watch the GDT code). +o Halting other CPUs on reset or panic doesn't always work. +o Don't waste page at 4 K--don't need it now (watch the GDT code). o Dump bootup pages once booted somehow. o Clean up warnings/volatiles. o 486 startup code. o How to handle mixed FPU/non FPU processors. o Test IO-APIC on various hardware. -o Seperate IO-APIC from SMP. +o Separate IO-APIC from SMP. diff --git a/Documentation/VGA-softcursor.txt b/Documentation/VGA-softcursor.txt index 17d39fefe32e..8ae014e30912 100644 --- a/Documentation/VGA-softcursor.txt +++ b/Documentation/VGA-softcursor.txt @@ -1,34 +1,33 @@ Software cursor for VGA by Pavel Machek -======================= & Martin Mares +======================= and Martin Mares Linux now has some ability to manipulate cursor appearance. Normally, you -can set the size of hardware cursor (and also work-around some ugly bugs in -those miserable Trident cards -- see #define TRIDENT_GLITCH in drivers/char/ +can set the size of hardware cursor (and also work around some ugly bugs in +those miserable Trident cards--see #define TRIDENT_GLITCH in drivers/char/ vga.c). In case you enable "Software generated cursor" in the system -configuration, you can play few new tricks: you can make your cursor look +configuration, you can play a few new tricks: you can make your cursor look like a non-blinking red block, make it inverse background of the character it's over or to highlight that character and still choose whether the -original hardware cursor should remain visible or not. And maybe other +original hardware cursor should remain visible or not. There may be other things I have never thought of. The cursor appearance is controlled by a "[?1;2;3c" escape sequence where 1, 2 and 3 are parameters described below. If you omit any of them, they will default to zeroes. - Parameter #1 specifies cursor size (0=default, 1=invisible, 2=underline, ..., + Parameter 1 specifies cursor size (0=default, 1=invisible, 2=underline, ..., 8=full block) + 16 if you want the software cursor to be applied + 32 if you -want to always change the background color + 64 if you dislike background same -as foreground. (Highlights are ignored for the last two flags.) +want to always change the background color + 64 if you dislike having the +background the same as the foreground. Highlights are ignored for the last two +flags. The second parameter selects character attribute bits you want to change -(by simple XOR'ing them with the value of this parameter). On standard VGA, -the high 4 bits specify background and the low 4 the foreground. In both -groups, low 3 bits set color (as in normal color codes used by the console) -and the most significant one turns on highlight (or sometimes blinking -- it +(by simply XORing them with the value of this parameter). On standard VGA, +the high four bits specify background and the low four the foreground. In both +groups, low three bits set color (as in normal color codes used by the console) +and the most significant one turns on highlight (or sometimes blinking--it depends on the configuration of your VGA). - And the third parameter consists of character attribute bits you want -to set. Bit setting takes place before bit toggling, so you can simply -clear a bit by including it in both the set mask and the toggle mask. - - + The third parameter consists of character attribute bits you want to set. +Bit setting takes place before bit toggling, so you can simply clear a bit by +including it in both the set mask and the toggle mask. diff --git a/Documentation/exception.txt b/Documentation/exception.txt index 8b57482347e7..ec8727e1b017 100644 --- a/Documentation/exception.txt +++ b/Documentation/exception.txt @@ -14,12 +14,12 @@ addr and of size size was accessible for the operation specified in type (read or write). To do this, verify_read had to look up the virtual memory area (vma) that contained the address addr. In the normal case (correctly working program), this test was successful. -It only failed for the (hopefully) rare, buggy program. In some kernel -profiling tests, this normally unneeded verification used up a -considerable amount of time. +It only failed for a few buggy programs. In some kernel profiling +tests, this normally unneeded verification used up a considerable +amount of time. To overcome this situation, Linus decided to let the virtual memory -hardware present in every Linux capable CPU handle this test. +hardware present in every Linux-capable CPU handle this test. How does this work? @@ -52,7 +52,7 @@ Where does fixup point to? Since we jump to the contents of fixup, fixup obviously points to executable code. This code is hidden inside the user access macros. -I have picked the get_user macro defined in include/asm/uacess.h as an +I have picked the get_user macro defined in include/asm/uaccess.h as an example. The definition is somewhat hard to follow, so let's peek at the code generated by the preprocessor and the compiler. I selected the get_user call in drivers/char/console.c for a detailed examination. diff --git a/Documentation/fb/00-INDEX b/Documentation/fb/00-INDEX new file mode 100644 index 000000000000..4140afb88c26 --- /dev/null +++ b/Documentation/fb/00-INDEX @@ -0,0 +1,15 @@ +Index of files in Documentation/fb. If you think something about frame +buffer devices needs an entry here, needs correction or you've written one +please mail me. + Geert Uytterhoeven + + +00-INDEX + - this file +framebuffer.txt + - introduction to frame buffer devices +internals.txt + - quick overview of frame buffer device internals +vesafb.txt + - info on the VESA frame buffer device + diff --git a/Documentation/m68k/framebuffer.txt b/Documentation/fb/framebuffer.txt similarity index 98% rename from Documentation/m68k/framebuffer.txt rename to Documentation/fb/framebuffer.txt index 858fdd211e62..7f7bafea5a73 100644 --- a/Documentation/m68k/framebuffer.txt +++ b/Documentation/fb/framebuffer.txt @@ -1,9 +1,9 @@ - The Linux/m68k Frame Buffer Device - ---------------------------------- + The Frame Buffer Device + ----------------------- Maintained by Geert Uytterhoeven (Geert.Uytterhoeven@cs.kuleuven.ac.be) -Last revised: January 24, 1998 +Last revised: June 10, 1998 0. Introduction @@ -153,9 +153,6 @@ buffer device. The current X server is part of the XFree86/XFree68 release To tune a video mode, you can use fbset or xvidtune. Note that xvidtune doesn't work 100% with XF68_FBDev: the reported clock values are always incorrect. -There exists also an accelerated X server for the Cybervision 64 graphics -board, but that's not discussed here. - 5. Video Mode Timings --------------------- @@ -315,7 +312,7 @@ applications, please refer to the following documentation: All necessary files can be found at - ftp://ftp.uni-erlangen.de/pub/Linux/680x0/ + ftp://ftp.uni-erlangen.de/pub/Linux/LOCAL/680x0/ and on its mirrors. diff --git a/Documentation/fb/internals.txt b/Documentation/fb/internals.txt new file mode 100644 index 000000000000..6a77a7437fd3 --- /dev/null +++ b/Documentation/fb/internals.txt @@ -0,0 +1,86 @@ + +This is a first start for some documentation about frame buffer device +internals. + +Geert Uytterhoeven , 10 June 1998 + +-------------------------------------------------------------------------------- + + *** STRUCTURES USED BY THE FRAME BUFFER DEVICE API *** + +The following structures play a role in the game of frame buffer devices. They +are defined in . + +1. Outside the kernel (user space) + + - struct fb_fix_screeninfo + + Device independent unchangeable information about a frame buffer device and + a specific video mode. This can be obtained using the FBIOGET_FSCREENINFO + ioctl. + + - struct fb_var_screeninfo + + Device independent changeable information about a frame buffer device and a + specific video mode. This can be obtained using the FBIOGET_VSCREENINFO + ioctl, and updated with the FBIOPUT_VSCREENINFO ioctl. If you want to pan + the screen only, you can use the FBIOPAN_DISPLAY ioctl. + + - struct fb_cmap + + Device independent colormap information. You can get and set the colormap + using the FBIOGETCMAP and FBIOPUTCMAP ioctls. + + +2. Inside the kernel + + - struct fb_info + + Generic information, API and low level information about a specific frame + buffer device instance (slot number, board address, ...). + + - struct `par' + + Device dependent information that uniquely defines the video mode for this + particular piece of hardware. + + - struct display + + Interface between the frame buffer device and the console driver. + + +-------------------------------------------------------------------------------- + + *** VISUALS USED BY THE FRAME BUFFER DEVICE API *** + + +Monochrome (FB_VISUAL_MONO01 and FB_VISUAL_MONO10) +------------------------------------------------- +Each pixel is either black or white. + + +Pseudo color (FB_VISUAL_PSEUDOCOLOR and FB_VISUAL_STATIC_PSEUDOCOLOR) +--------------------------------------------------------------------- +The whole pixel value is fed through a programmable lookup table that has one +color (including red, green, and blue intensities) for each possible pixel +value, and that color is displayed. + + +True color (FB_VISUAL_TRUECOLOR) +-------------------------------- +The pixel value is broken up into red, green, and blue fields, each of which +are looked up in separate red, green, and blue lookup tables. + + +Direct color (FB_VISUAL_DIRECTCOLOR) +------------------------------------ +The pixel value is broken up into red, green, and blue fields. This is what +most people mean when then say `true color'. + + +Grayscale displays +------------------ +Grayscale and static grayscale are special variants of pseudo color and static +pseudo color, where the red, green and blue components are always equal to +each other. + diff --git a/Documentation/fb/vesafb.txt b/Documentation/fb/vesafb.txt new file mode 100644 index 000000000000..d712ac0bcd93 --- /dev/null +++ b/Documentation/fb/vesafb.txt @@ -0,0 +1,71 @@ + +what is vesafb? +=============== + +This is a generic driver for a graphic framebuffer on intel boxes. + +Idea is simple: Turn on graphics mode at boot time with the help of +the BIOS, and use this as framebuffer device /dev/fb0, like the m68k +(and other) ports do. + +This means we decide at boot time whenever we want to run in text or +graphics mode. Switching mode later on (in protected mode) is +impossible, BIOS calls work in real mode only. VESA BIOS Extentions +Version 2.0 are required, becauce we need a linear frame buffer. + +Advantages: + + * It provides a nice large console (128 cols + 48 lines with 1024x768) + without using tiny, unreadable fonts. + * You can run XF68_FBDev on top of /dev/fb0 (=> non-accelerated X11 + support for every VBE 2.0 compilant graphics board). + * Most important: boot logo :-) + +Disadvantages: + + * graphic mode is slower than text mode... + + +How to use it? +============== + +Switching modes is done using the vga=... boot parameter. Read +Documentation/svga.txt for details. With vesafb both text and +graphics modes work. Text modes are handled by vgafb, graphic modes +by the new vesafb.c. + +The graphic modes are not in the list which you get if you boot with +vga=ask and hit return. Here are some mode numbers: + + | 640x480 800x600 1024x768 +----+--------------------------- +256 | 0x101 0x103 0x105 +32k | 0x110 0x113 0x116 +64k | 0x111 0x114 0x117 +16M | 0x112 0x115 0x118 + +Note 1: this are the VESA mode numbers. The video mode select code + expects 0x200 + VESA mode number. +Note 2: lilo can't handle hex, for booting with "vga=??" you have to + transform the numbers to decimal. + + +Speed it up! +============ + +Check /usr/src/linux/Documentation/mtrr.txt, enabling write-combining +for the framebuffer memory gives a performance boost. + +There are two ways to do console scrolling: redraw the screen +completely, or by copying around the video memory. You can select one +of them using the kernel command line: video=vesa:redraw or +video=vesa:memmove. redraw is the default, becauce this one works +faster on my box. + + +Have fun! + + Gerd + +-- +Gerd Knorr diff --git a/Documentation/filesystems/00-INDEX b/Documentation/filesystems/00-INDEX index 0b88a67556d5..f6b5cbad5697 100644 --- a/Documentation/filesystems/00-INDEX +++ b/Documentation/filesystems/00-INDEX @@ -9,20 +9,20 @@ fat_cvf.txt hpfs.txt - info and mount options for the OS/2 HPFS. isofs.txt - - info and mount options for the ISO9660 (CDROM) filesystem. + - info and mount options for the ISO 9660 (CDROM) filesystem. ncpfs.txt - info on Novell Netware(tm) filesystem using NCP protocol. ntfs.txt - - info and mount options for the NTFS filesystem (Win NT). + - info and mount options for the NTFS filesystem (Windows NT). romfs.txt - Description of the ROMFS filesystem. smbfs.txt - - info on using filesystems with the SMB protocol (Win 3.11, Win NT) + - info on using filesystems with the SMB protocol (Windows 3.11 and NT) sysv-fs.txt - info on the SystemV/Coherent filesystem. umsdos.txt - info on the umsdos extensions to the msdos filesystem. vfat.txt - - info on using the VFAT filesystem used in Win NT and Win 95 + - info on using the VFAT filesystem used in Windows NT and Windows 95 vfs.txt - Overview of the Virtual File System diff --git a/Documentation/filesystems/affs.txt b/Documentation/filesystems/affs.txt index 9cb9408fc613..f63a6e3aa9b8 100644 --- a/Documentation/filesystems/affs.txt +++ b/Documentation/filesystems/affs.txt @@ -1,8 +1,8 @@ -Amiga filesystems Overview -========================== +Overview of Amiga Filesystems +============================= Not all varieties of the Amiga filesystems are supported for reading and -writing. The Amiga currently knows 6 different filesystems: +writing. The Amiga currently knows six different filesystems: DOS\0 The old or original filesystem, not really suited for hard disks and normally not used on them, either. @@ -67,7 +67,7 @@ verbose The volume name, file system type and block size will be written to the syslog when the filesystem is mounted. mufs The filesystem is really a muFS, also it doesn't - identify itself as one. This option is neccessary if + identify itself as one. This option is necessary if the filesystem wasn't formatted as muFS, but is used as one. @@ -99,9 +99,9 @@ The Amiga protection flags RWEDRWEDHSPARWED are handled as follows: User id and group id will be used unless set[gu]id are given as mount options. Since most of the Amiga file systems are single user systems -they will be owned by root. The root directory of the Amiga filesystem -(i. e. the mount point) will be owned by the user who actually mounts -the filesystem (the root directory doesn't have uid/gid fields). +they will be owned by root. The root directory (the mount point) of the +Amiga filesystem will be owned by the user who actually mounts the +filesystem (the root directory doesn't have uid/gid fields). Linux -> Amiga: @@ -116,7 +116,7 @@ The Linux rwxrwxrwx file mode is handled as follows: - All other flags (suid, sgid, ...) are ignored and will not be retained. -Newly created files and directories will get the user and group id +Newly created files and directories will get the user and group ID of the current user and a mode according to the umask. Symbolic links @@ -126,7 +126,7 @@ Although the Amiga and Linux file systems resemble each other, there are some, not always subtle, differences. One of them becomes apparent with symbolic links. While Linux has a file system with exactly one root directory, the Amiga has a separate root directory for each -file system (e.g. partition, floppy disk, ...). With the Amiga, +file system (for example, partition, floppy disk, ...). With the Amiga, these entities are called "volumes". They have symbolic names which can be used to access them. Thus, symbolic links can point to a different volume. AFFS turns the volume name into a directory name diff --git a/Documentation/filesystems/coda.txt b/Documentation/filesystems/coda.txt index 0c88ce6dc914..b198ba4e527c 100644 --- a/Documentation/filesystems/coda.txt +++ b/Documentation/filesystems/coda.txt @@ -1,4 +1,3 @@ - NOTE: This is one of the technical documents describing a component of Coda -- this document describes the client kernel-Venus interface. @@ -9,7 +8,7 @@ For user level software needed to run Coda: ftp://ftp.coda.cs.cmu.edu To run Coda you need to get a user level cache manager for the client, -named Venus, as well as tools to manipulate ACL's, to log in etc. The +named Venus, as well as tools to manipulate ACLs, to log in, etc. The client needs to have the Coda filesystem selected in the kernel configuration. @@ -27,7 +26,7 @@ kernel support. v1.0, Nov 9, 1997 This document describes the communication between Venus and kernel - level file system code needed for the operation of the Coda filesys- + level filesystem code needed for the operation of the Coda file sys- tem. This document version is meant to describe the current interface (version 1.0) as well as improvements we envisage. ______________________________________________________________________ @@ -177,7 +176,7 @@ kernel support. The interface between the kernel and Venus is very similar to the BSD VFS interface. Similar functionality is provided, and the format of the parameters and returned data is very similar to the BSD VFS. This - leads to an almost natural environment for implementing a kernel level + leads to an almost natural environment for implementing a kernel-level filesystem driver for Coda in a BSD system. However, other operating systems such as Linux and Windows 95 and NT have virtual filesystem with different interfaces. @@ -359,7 +358,7 @@ kernel support. 33..11.. IImmpplleemmeennttaattiioonn ddeettaaiillss The Unix implementation of this mechanism has been through the - implemenation of a character device associated with Coda. Venus + implementation of a character device associated with Coda. Venus retrieves messages by doing a read on the device, replies are sent with a write and notification is through the select system call on the file descriptor for the device. The process P is kept waiting on an @@ -369,7 +368,7 @@ kernel support. call is used. The DeviceIoControl call is designed to copy buffers from user memory to kernel memory with OPCODES. The sendmsg_to_kernel is issued as a synchronous call, while the getmsg_from_kernel call is - asynchrounous. Windows EventObjects are used for notification of + asynchronous. Windows EventObjects are used for notification of message arrival. The process P is kept waiting on a KernelEvent object in NT and a semaphore in Windows 95. @@ -429,7 +428,7 @@ kernel support. for the Windows environment when these mature. struct CodaCred { - vuid_t cr_uid, cr_euid, cr_suid, cr_fsuid; /* Real, efftve, set, fs uid*/ + vuid_t cr_uid, cr_euid, cr_suid, cr_fsuid; /* Real, effective, set, fs uid*/ vgid_t cr_gid, cr_egid, cr_sgid, cr_fsgid; /* same for groups */ vgid_t cr_groups[NGROUPS]; /* Group membership for caller */ }; @@ -514,7 +513,7 @@ kernel support. Coda specific requests can be made by application through the pioctl interface. The pioctl is implemented as an ordinary ioctl on a - ficticious file /coda/.CONTROL. The pioctl call opens this file, gets + fictitious file /coda/.CONTROL. The pioctl call opens this file, gets a file handle and makes the ioctl call. Finally it closes the file. The kernel involvement in this is limited to providing the facility to @@ -721,7 +720,7 @@ kernel support. access will be granted. It is important to remember that Coda uses ACLs to enforce protection and that ultimately the servers, not the clients enforce the security of the system. The result of this call - will depend on wether a _t_o_k_e_n is held by the user. + will depend on whether a _t_o_k_e_n is held by the user. EErrrroorrss The object may not exist, or the ACL describing the protection may not be accessible. @@ -765,7 +764,7 @@ kernel support. are set by converting the CodaCred to a uid using a macro CRTOUID (this macro is platform dependent). Upon success the VFid and attributes of the file are returned. The Coda FS Driver will normally - instantiate a vnode, inode or filehandle at kernel level for the new + instantiate a vnode, inode or file handle at kernel level for the new object. @@ -780,7 +779,7 @@ kernel support. to return a file descriptor. The trunctate and exclusive options, together with the mode, could simply be part of the mode as it is under Unix. There should be no flags argument; this is used in open - (2) to return a filedescriptor for READ or WRITE mode. + (2) to return a file descriptor for READ or WRITE mode. The attributes of the directory should be returned too, since the size and mtime changed. @@ -1221,7 +1220,7 @@ kernel support. DDeessccrriippttiioonn Ask Venus to update RVM attributes of object VFid. This should be called as part of kernel level fsync type calls. The - result indicates if the synching was successful. + result indicates if the syncing was successful. EErrrroorrss diff --git a/Documentation/filesystems/fat_cvf.txt b/Documentation/filesystems/fat_cvf.txt index ef598932c518..7eef569b6583 100644 --- a/Documentation/filesystems/fat_cvf.txt +++ b/Documentation/filesystems/fat_cvf.txt @@ -20,7 +20,7 @@ Compressed Volume Files in FAT partitions. Popular CVF software, for example, are Microsoft's Doublespace/Drivespace and Stac's Stacker. Using the CVF-FAT interface, it is possible to load a module that handles all the low-level disk access that has to do with on-the-fly compression -and decompression. All other part of FAT filesystem access is still handled +and decompression. Any other part of FAT filesystem access is still handled by the FAT, MSDOS or VFAT or even UMSDOS driver. CVF access works by redirecting certain low-level routines from the FAT @@ -46,16 +46,16 @@ like compression and decompression silently. might be persuaded to implement it :). CVF-FAT is already prepared for using readpage. -- DOSEMU users attention +- attention, DOSEmu users - You may have to unmount all CVF partitions before running DOSEMU depending - on your configuration. If DOSEMU is configured to use wholedisk or - partition access (this is often the case to let DOSEMU access + You may have to unmount all CVF partitions before running DOSEmu depending + on your configuration. If DOSEmu is configured to use wholedisk or + partition access (this is often the case to let DOSEmu access compressed partitions) there's a risk of destroying your compressed partitions or crashing your system because of confused drivers. Note that it is always safe to redirect the compressed partitions with - lredir or emufs.sys. Refer to the DOSEMU documentation for details. + lredir or emufs.sys. Refer to the DOSEmu documentation for details. 3. Mount options @@ -88,7 +88,7 @@ driver's standard options: ------------------------------------------------------------------------------ Assuming you want to write your own CVF module, you need to write a lot of -interface funtions. Most of them are covered in the kernel documentation +interface functions. Most of them are covered in the kernel documentation you can find on the net, and thus won't be described here. They have been marked with "[...]" :-) Take a look at include/linux/fat_cvf.h. @@ -169,7 +169,7 @@ int register_cvf_format(struct cvf_format*cvf_format); call this function to introduce your CVF format to the FAT/CVF-FAT driver. This is usually done in init_module. Be sure to check the return value. Zero means success, everything else causes a kernel - message printed in the syslog describing the error that occured. + message printed in the syslog describing the error that occurred. Typical errors are: - a module with the same version id is already registered or - too many CVF formats. Hack fs/fat/cvf.c if you need more. diff --git a/Documentation/filesystems/hpfs.txt b/Documentation/filesystems/hpfs.txt index 03e0481bb952..a14e813418d4 100644 --- a/Documentation/filesystems/hpfs.txt +++ b/Documentation/filesystems/hpfs.txt @@ -5,7 +5,7 @@ Mount options are the same as for msdos partitions. uid=nnn All files in the partition will be owned by user id nnn. gid=nnn All files in the partition will be in group nnn. umask=nnn The permission mask (see umask(1)) for the partition. - conv=binary Data is returned exactly as is, with CRLF's. [default] + conv=binary Data is returned exactly as is, with CRLFs. [default] conv=text (Carriage return, line feed) is replaced with newline. conv=auto Chooses, file by file, conv=binary or conv=text (by guessing) diff --git a/Documentation/filesystems/isofs.txt b/Documentation/filesystems/isofs.txt index 20f984687c90..c186c405021d 100644 --- a/Documentation/filesystems/isofs.txt +++ b/Documentation/filesystems/isofs.txt @@ -13,17 +13,17 @@ when using discs encoded using Microsoft's Joliet extensions. utf8 option. utf8 Encode Unicode names in UTF8 format. Default is no. -Mount options that are unique to the isofs filesystem. +Mount options unique to the isofs filesystem. block=512 Set the block size for the disk to 512 bytes block=1024 Set the block size for the disk to 1024 bytes block=2048 Set the block size for the disk to 2048 bytes check=relaxed Matches filenames with different cases check=strict Matches only filenames with the exact same case cruft Try to handle badly formatted CDs. - map=off Do not map non-rockridge filenames to lowercase - map=normal Map non-rockridge filenames to lowecase + map=off Do not map non-Rock Ridge filenames to lower case + map=normal Map non-Rock Ridge filenames to lower case map=acorn As map=normal but also apply Acorn extensions if present mode=xxx Sets the permissions on files to xxx nojoliet Ignore Joliet extensions if they are present. - norock Ignore rockridge extensions if they are present. + norock Ignore Rock Ridge extensions if they are present. unhide Show hidden files. diff --git a/Documentation/filesystems/romfs.txt b/Documentation/filesystems/romfs.txt index 7df713201bc9..2d2a7b2a16b9 100644 --- a/Documentation/filesystems/romfs.txt +++ b/Documentation/filesystems/romfs.txt @@ -1,7 +1,6 @@ - ROMFS - ROM FILE SYSTEM -This is a quite dumb, read only filesystem, mainly for initial ram +This is a quite dumb, read only filesystem, mainly for initial RAM disks of installation disks. It has grown up by the need of having modules linked at boot time. Using this filesystem, you get a very similar feature, and even the possibility of a small kernel, with a @@ -29,13 +28,13 @@ However, the main purpose of romfs is to have a very small kernel, which has only this filesystem linked in, and then can load any module later, with the current module utilities. It can also be used to run some program to decide if you need SCSI devices, and even IDE or -floppy drives can be loaded later if you use the "initrd" -- initial -ram disk -- feature of the kernel. This would not be really news +floppy drives can be loaded later if you use the "initrd"--initial +RAM disk--feature of the kernel. This would not be really news flash, but with romfs, you can even spare off your ext2 or minix or maybe even affs filesystem until you really know that you need it. For example, a distribution boot disk can contain only the cd disk -drivers (and possibly the SCSI drivers), and the ISO filesystem +drivers (and possibly the SCSI drivers), and the ISO 9660 filesystem module. The kernel can be small enough, since it doesn't have other filesystems, like the quite large ext2fs module, which can then be loaded off the CD at a later stage of the installation. Another use @@ -148,7 +147,7 @@ please contact me. However, think twice before wanting me to add features and code, because the primary and most important advantage of this file system is the small code. On the other hand, don't be alarmed, I'm not getting that much romfs related mail. Now I can -understand why Avery wrote poems in the arcnet docs to get some more +understand why Avery wrote poems in the ARCnet docs to get some more feedback. :) romfs has also a mailing list, and to date, it hasn't received any @@ -167,7 +166,7 @@ I have never found this limiting, but others might. one would want to write _anything_ to a file system, he still needs a writable file system, thus negating the size advantages. Possible solutions: implement write access as a compile-time option, or a new, -similarly small writable filesystem for ram disks. +similarly small writable filesystem for RAM disks. - Since the files are only required to have alignment on a 16 byte boundary, it is currently possibly suboptimal to read or execute files diff --git a/Documentation/filesystems/vfat.txt b/Documentation/filesystems/vfat.txt index 1a0da9d40dc6..b475d510aeaf 100644 --- a/Documentation/filesystems/vfat.txt +++ b/Documentation/filesystems/vfat.txt @@ -34,7 +34,7 @@ uni_xlate= -- Translate unhandled Unicode characters to special posix= -- Allow names of same letters, different case such as 'LongFileName' and 'longfilename' to coexist. This has some problems currently because 8.3 conflicts are not handled - correctly for Posix filesystem compliance. + correctly for POSIX filesystem compliance. nonumtail= -- When creating 8.3 aliases, normally the alias will end in '~1' or tilde followed by some number. If this option is set, then if the filename is @@ -61,7 +61,7 @@ TODO a get next directory entry approach. The only thing left that uses raw scanning is the directory renaming code. -* Fix the Posix filesystem support to work in 8.3 space. This involves +* Fix the POSIX filesystem support to work in 8.3 space. This involves renaming aliases if a conflict occurs between a new filename and an old alias. This is quite a mess. diff --git a/Documentation/filesystems/vfs.txt b/Documentation/filesystems/vfs.txt index 9dfe8dc27c31..7d0951cff5cc 100644 --- a/Documentation/filesystems/vfs.txt +++ b/Documentation/filesystems/vfs.txt @@ -2,22 +2,22 @@ A Brief Overview of the Virtual File System =========================================== by Benjamin LaHaise (blah@dot.superaje.com) -Noone else seems to be writing this, so here's a quick description of what -I've learned while writing lofs... +No one else seems to be writing this, so here's a quick description of what +I've learned while writing lofs. The VFS is relatively simple, but it is nice not to have to browse through pages of code to determine what is expected when writing a filesystem. -Hopefully this helps anyone attempting such a feat, as well as clearing up -a few important points/dependencies. +This document is meant to help anyone attempting such a feat, and to clarify +a few important points and dependencies. register_filesystem (struct file_system_type *fstype) ===================================================== -All filesystems are created equal... or at least they start out that way. -A filesystem, be it in module form, or linked into the kernel, needs to add +All filesystems are created equal, or at least they start out that way. +A filesystem, whether in module form or linked into the kernel, needs to add itself to the table of filesystems by calling register_filesystem with an initialized file_system_type structure. Any further functions of the -filesystem are accessed through the following function tables... +filesystem are accessed through the following function tables: struct file_system_type @@ -101,8 +101,8 @@ struct inode_operations int (*lookup) (struct inode *dir, const char *name, int len, struct inode **result); [optional] lookup is called when the VFS wishes to have the filesystem resolve a name - into an inode. Dir is a directory on the filesystem that [hopefully] contains - the zero terminated string name (length len). A return value of zero indicates + into an inode. Dir is a directory on the filesystem that--we hope--contains + the zero-terminated string name (length len). A return value of zero indicates that there is a valid inode stored in *result. *** Note: lofs assumes that any filesystem returns an inode within the filesystem diff --git a/Documentation/hayes-esp.txt b/Documentation/hayes-esp.txt index 4ee770e3cf2f..3a6d42e4523c 100644 --- a/Documentation/hayes-esp.txt +++ b/Documentation/hayes-esp.txt @@ -28,7 +28,7 @@ ESP card. The drivers are basically a modified version of the serial drivers. Features: - Uses the enhanced mode of the ESP card, allowing a wider range of - interrupts and features than compatibilty mode + interrupts and features than compatibility mode - Uses DMA and 16 bit PIO mode to transfer data to and from the ESP's FIFOs, reducing CPU load - Supports primary and secondary ports @@ -71,12 +71,12 @@ insmod esp divisor=0,0,0,0,0,0,0x84,0 The dma= option can be used to set the DMA channel. The channel can be either 1 or 3. Specifying any other value will force the driver to use PIO mode. -For example, to set the dma channel to 3, the insmod command would be: +For example, to set the DMA channel to 3, the insmod command would be: insmod esp dma=3 The rx_trigger= and tx_trigger= options can be used to set the FIFO trigger -levels. They specifie when the ESP card should send an interrupt. Larger +levels. They specify when the ESP card should send an interrupt. Larger values will decrease the number of interrupts; however, a value too high may result in data loss. Valid values are 1 through 1023, with 768 being the default. For example, to set the receive trigger level to 512 bytes and the diff --git a/Documentation/initrd.txt b/Documentation/initrd.txt index d5680b389775..acc2315a451d 100644 --- a/Documentation/initrd.txt +++ b/Documentation/initrd.txt @@ -84,7 +84,7 @@ initrd adds the following new options: the intermediate step of going via initrd adds a little speed advantage and it allows the use of a compressed file system. Also, together with LOADLIN you may load the RAM disk directly from - CDrom or disk, hence having a floppyless boot from CD, + CDROM or disk, hence having a floppyless boot from CD, e.g.: E:\loadlin E:\bzImage root=/dev/ram initrd=E:\rdimage @@ -256,9 +256,9 @@ boot time, but the system loaded from initrd can use a user-friendly dialog and it can also perform some sanity checks (or even some form of auto-detection). -Last not least, CDrom distributors may use it for better installation from CD, -either using a LILO boot floppy and bootstrapping a bigger ramdisk via -initrd from CD, or using LOADLIN to directly load the ramdisk from CD +Last not least, CDROM distributors may use it for better installation from CD, +either using a LILO boot floppy and bootstrapping a bigger RAM disk via +initrd from CD, or using LOADLIN to directly load the RAM disk from CD without need of floppies. Since initrd is a fairly generic mechanism, it is likely that additional diff --git a/Documentation/kmod.txt b/Documentation/kmod.txt index 87a03429f9b3..759a300b18cb 100644 --- a/Documentation/kmod.txt +++ b/Documentation/kmod.txt @@ -34,8 +34,8 @@ myself). If kerneld worked, why replace it? -- kerneld used sysv ipc, which can now be made into a module. Besides, - sysv ipc is ugly and should therefore be avoided (well, certainly for +- kerneld used SysV IPC, which can now be made into a module. Besides, + SysV IPC is ugly and should therefore be avoided (well, certainly for kernel level stuff) - both kmod and kerneld end up doing the same thing (calling modprobe), @@ -44,4 +44,4 @@ If kerneld worked, why replace it? - removing kerneld related stuff from ipc/msg.c made it 40% smaller - kmod reports errors through the normal kernel mechanisms, which avoids - the chicken and egg problem of kerneld and modular unix domain sockets + the chicken and egg problem of kerneld and modular Unix domain sockets diff --git a/Documentation/mca.txt b/Documentation/mca.txt index 23df12b57d65..75facdf98975 100644 --- a/Documentation/mca.txt +++ b/Documentation/mca.txt @@ -159,12 +159,12 @@ Currently, there are a number of MCA-specific device drivers. 3) 3c523 drivers/net/3c523.c drivers/net/3c523.h - 3Com 3c523 Etherlink/MC ethernet driver. + 3Com 3c523 Etherlink/MC Ethernet driver. 4) SMC Ultra/MCA drivers/net/smc-mca.c drivers/net/smc-mca.h - Elite/A (8013EP/A) and Elite10T/A (8013WP/A) ethernet driver + Elite/A (8013EP/A) and Elite10T/A (8013WP/A) Ethernet driver As well, drivers/char/psaux.c was modified to support IRQ sharing (it's #ifdef CONFIG_MCA'ed, for your convenience, although PCI users might be diff --git a/Documentation/networking/framerelay.txt b/Documentation/networking/framerelay.txt index f02b133d1dfb..1a0b720440dd 100644 --- a/Documentation/networking/framerelay.txt +++ b/Documentation/networking/framerelay.txt @@ -8,8 +8,8 @@ Each DLCI is a point-to-point link between your machine and a remote one. As such, a separate device is needed to accommodate the routing. Within the net-tools archives is 'dlcicfg'. This program will communicate with the base "DLCI" device, and create new net devices named 'dlci00', 'dlci01'... -The configuration script will ask you how many DLCI's you need, as well as -how many DLCI's you want to assign to each Frame Relay Access Device (FRAD). +The configuration script will ask you how many DLCIs you need, as well as +how many DLCIs you want to assign to each Frame Relay Access Device (FRAD). The DLCI uses a number of function calls to communicate with the FRAD, all of which are stored in the FRAD's private data area. assoc/deassoc, diff --git a/Documentation/networking/sktr.txt b/Documentation/networking/sktr.txt new file mode 100644 index 000000000000..a35332af14c9 --- /dev/null +++ b/Documentation/networking/sktr.txt @@ -0,0 +1,147 @@ +Text file for the Linux SysKonnect Token Ring ISA/PCI Adapter Driver. + Text file by: Jay Schulist + +The Linux SysKonnect Token Ring driver works with the SysKonnect TR4/16(+) ISA, +SysKonnect TR4/16(+) PCI, SysKonnect TR4/16 PCI, and older revisions of the +SK NET TR4/16 ISA card. + +Latest information on this driver can be obtained on the Linux-SNA WWW site. +Please point your browser to: +http://samba.anu.edu.au/linux-sna/documents/drivers/SysKonnect/ + +Many thanks to Christoph Goos for his excellent work on this driver and +SysKonnect for donating the adapters to Linux-SNA for the testing and maintaince +of this device driver. + +Important information to be noted: +1. Adapters can be slow to open (~20 secs) and close (~5 secs), please be + patient. +2. This driver works very well when autoprobing for adapters. Why even + think about those nasty io/int/dma settings of modprobe when the driver + will do it all for you! + +This driver is rather simple to use. Select Y to Token Ring adapter support +in the kernel configuration. A choice for SysKonnect Token Ring adapters will +appear. This drives supports all SysKonnect ISA and PCI adapters. Choose this +option. I personally recommend compiling the driver as a module (M), but if you +you would like to compile it staticly answer Y instead. + +This driver supports multiple adapters without the need to load multiple copies +of the driver. You should be able to load up to 7 adapters without any kernel +modifications, if you are in need of more please contact the maintainer of this +driver. + +Load the driver either by lilo/loadlin or as a module. When a module using the +following command will suffice for most: + +# modprobe sktr + +This will produce output similar to the following: (Output is user specific) + +sktr.c: v1.01 08/29/97 by Christoph Goos +tr0: SK NET TR 4/16 PCI found at 0x6100, using IRQ 17. +tr1: SK NET TR 4/16 PCI found at 0x6200, using IRQ 16. +tr2: SK NET TR 4/16 ISA found at 0xa20, using IRQ 10 and DMA 5. + +Now just setup the device via ifconfig and set and routes you may have. After +this you are ready to start sending some tokens. + +Errata: +For anyone wondering where to pick up the SysKonnect adapters please browse +to http://www.syskonnect.com + +This driver is under the GNU General Public License. Its Firmware image is +included as an initialized C-array and is licensed by SysKonnect to the Linux +users of this driver. However no waranty about its fitness is expressed or +implied by SysKonnect. + +Below find attached the setting for the SK NET TR 4/16 ISA adapters +------------------------------------------------------------------- + + *************************** + *** C O N T E N T S *** + *************************** + + 1) Location of DIP-Switch W1 + 2) Default settings + 3) DIP-Switch W1 description + + + ============================================================== + CHAPTER 1 LOCATION OF DIP-SWITCH + ============================================================== + +UÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ +þUÄÄÄÄÄÄ¿ UÄÄÄÄÄ¿ UÄÄÄ¿ þ +þAÄÄÄÄÄÄU W1 AÄÄÄÄÄU UÄÄÄÄ¿ þ þ þ +þUÄÄÄÄÄÄ¿ þ þ þ þ UÄÄÅ¿ +þAÄÄÄÄÄÄU UÄÄÄÄÄÄÄÄÄÄÄ¿ AÄÄÄÄU þ þ þ þþ +þUÄÄÄÄÄÄ¿ þ þ UÄÄÄ¿ AÄÄÄU AÄÄÅU +þAÄÄÄÄÄÄU þ TMS380C26 þ þ þ þ +þUÄÄÄÄÄÄ¿ þ þ AÄÄÄU AÄ¿ +þAÄÄÄÄÄÄU þ þ þ þ +þ AÄÄÄÄÄÄÄÄÄÄÄU þ þ +þ þ þ +þ AÄU +þ þ +þ þ +þ þ +þ þ +AÄÄÄÄÄÄÄÄÄÄÄÄAÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄAÄÄAÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄAÄÄÄÄÄÄÄÄÄU + AÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄU AÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄU + + ============================================================== + CHAPTER 2 DEFAULT SETTINGS + ============================================================== + + W1 1 2 3 4 5 6 7 8 + +------------------------------+ + | ON X | + | OFF X X X X X X X | + +------------------------------+ + + W1.1 = ON Adapter drives address lines SA17..19 + W1.2 - 1.5 = OFF BootROM disabled + W1.6 - 1.8 = OFF I/O address 0A20h + + ============================================================== + CHAPTER 3 DIP SWITCH W1 DESCRIPTION + ============================================================== + + UÄÄÄAÄÄÄAÄÄÄAÄÄÄAÄÄÄAÄÄÄAÄÄÄAÄÄÄ¿ ON + þ 1 þ 2 þ 3 þ 4 þ 5 þ 6 þ 7 þ 8 þ + AÄÄÄAÄÄÄAÄÄÄAÄÄÄAÄÄÄAÄÄÄAÄÄÄAÄÄÄU OFF + |AD | BootROM Addr. | I/O | + +-+-+-------+-------+-----+-----+ + | | | + | | +------ 6 7 8 + | | ON ON ON 1900h + | | ON ON OFF 0900h + | | ON OFF ON 1980h + | | ON OFF OFF 0980h + | | OFF ON ON 1b20h + | | OFF ON OFF 0b20h + | | OFF OFF ON 1a20h + | | OFF OFF OFF 0a20h (+) + | | + | | + | +-------- 2 3 4 5 + | OFF x x x disabled (+) + | ON ON ON ON C0000 + | ON ON ON OFF C4000 + | ON ON OFF ON C8000 + | ON ON OFF OFF CC000 + | ON OFF ON ON D0000 + | ON OFF ON OFF D4000 + | ON OFF OFF ON D8000 + | ON OFF OFF OFF DC000 + | + | + +----- 1 + OFF adapter does NOT drive SA<17..19> + ON adapter drives SA<17..19> (+) + + + (+) means default setting + + ******************************** diff --git a/Documentation/nfsroot.txt b/Documentation/nfsroot.txt index d91084f754b5..a87d4af216c0 100644 --- a/Documentation/nfsroot.txt +++ b/Documentation/nfsroot.txt @@ -1,5 +1,5 @@ Mounting the root filesystem via NFS (nfsroot) -============================================== +=============================================== Written 1996 by Gero Kuhlmann Updated 1997 by Martin Mares @@ -185,12 +185,12 @@ depend on what facilities are available: lar to how LILO is doing it. Please refer to the loadlin docu- mentation for further information. -3.4) Using a bootrom +3.4) Using a boot ROM This is probably the most elegant way of booting a diskless - client. With a bootrom the kernel gets loaded using the TFTP - protocol. As far as I know no commercial bootroms already + client. With a boot ROM the kernel gets loaded using the TFTP + protocol. As far as I know, no commercial boot ROMs yet support booting Linux over the network, but there are two - free implementations of a bootrom available on sunsite.unc.edu + free implementations of a boot ROM available on sunsite.unc.edu and its mirrors. They are called 'netboot-nfs' and 'etherboot'. Both contain everything you need to boot a diskless Linux client. diff --git a/Documentation/ramdisk.txt b/Documentation/ramdisk.txt index a00eb0a6468a..1f937c3b3fad 100644 --- a/Documentation/ramdisk.txt +++ b/Documentation/ramdisk.txt @@ -1,4 +1,3 @@ - Using the RAM disk block device with Linux ------------------------------------------ @@ -7,20 +6,20 @@ Contents: 1) Overview 2) Kernel Command Line Parameters 3) Using "rdev -r" With New Kernels - 4) An Example of Creating a Compressed ramdisk + 4) An Example of Creating a Compressed RAM Disk 1) Overview ----------- -As of kernel v1.3.48, the ramdisk driver was substantially changed. +As of kernel v1.3.48, the RAM disk driver was substantially changed. The older versions would grab a chunk of memory off the top before handing the remainder to the kernel at boot time. Thus a size parameter had to be specified via "ramdisk=1440" or "rdev -r /dev/fd0 1440" so that the driver knew how much memory to grab. -Now the ramdisk dynamically grows as more space is required. It does +Now the RAM disk dynamically grows as more space is required. It does this by using RAM from the buffer cache. The driver marks the buffers it is using with a new "BH_Protected" flag so that the kernel does not try to reuse them later. This means that the old size parameter @@ -28,9 +27,9 @@ is no longer used, new command line parameters exist, and the behavior of the "rdev -r" or "ramsize" (usually a symbolic link to "rdev") command has changed. -Also, the new ramdisk supports up to 16 ramdisks out of the box, and can -be reconfigured in rd.c to support up to 255 ramdisks. To use multiple -ramdisk support with your system, run 'mknod /dev/ramX b 1 X' and chmod +Also, the new RAM disk supports up to 16 RAM disks out of the box, and can +be reconfigured in rd.c to support up to 255 RAM disks. To use multiple +RAM disk support with your system, run 'mknod /dev/ramX b 1 X' and chmod (to change its permissions) it to your liking. The default /dev/ram(disk) uses minor #1, so start with ram2 and go from there. @@ -38,14 +37,14 @@ The old "ramdisk=" has been changed to "ramdisk_size=" to make it clearer. The original "ramdisk=" has been kept around for compatibility reasons, but it will probably be removed in 2.1.x. -The new ramdisk also has the ability to load compressed ramdisk images, +The new RAM disk also has the ability to load compressed RAM disk images, allowing one to squeeze more programs onto an average installation or rescue floppy disk. Notes: You may have "/dev/ram" or "/dev/ramdisk" or both. They are -equivalent from the standpoint of this document. Also, the new ramdisk +equivalent from the standpoint of this document. Also, the new RAM disk is a config option. When running "make config", make sure you enable -ramdisk support for the kernel you intend to use the ramdisk with. +RAM disk support for the kernel with which you intend to use the RAM disk. 2) Kernel Command Line Parameters @@ -55,42 +54,42 @@ ramdisk support for the kernel you intend to use the ramdisk with. ================= To allow a kernel image to reside on a floppy disk along with a compressed -ramdisk image, the "ramdisk_start=" command was added. The kernel -can't be included into the compressed ramdisk filesystem image, because +RAM disk image, the "ramdisk_start=" command was added. The kernel +can't be included into the compressed RAM disk filesystem image, because it needs to be stored starting at block zero so that the BIOS can load the -bootsector and then the kernel can bootstrap itself to get going. +boot sector and then the kernel can bootstrap itself to get going. -Note: If you are using an uncompressed ramdisk image, then the kernel can -be a part of the filesystem image that is being loaded into the ramdisk, +Note: If you are using an uncompressed RAM disk image, then the kernel can +be a part of the filesystem image that is being loaded into the RAM disk, and the floppy can be booted with LILO, or the two can be separate as is done for the compressed images. -If you are using a two-disk boot/root setup (kernel on #1, ramdisk image -on #2) then the ramdisk would start at block zero, and an offset of +If you are using a two-disk boot/root setup (kernel on #1, RAM disk image +on #2) then the RAM disk would start at block zero, and an offset of zero would be used. Since this is the default value, you would not need to actually use the command at all. -If instead, you have a "zImage" of about 350k, and a "fs_image.gz" of -say about 1MB, and you want them both on the same disk, then you +If instead, you have a "zImage" of about 350 kB, and a "fs_image.gz" of +say about 1 MB, and you want them both on the same disk, then you would use an offset. If you stored the "fs_image.gz" onto the floppy -starting at an offset of 400kB, you would use "ramdisk_start=400". +starting at an offset of 400 kB, you would use "ramdisk_start=400". load_ramdisk=N ============== This parameter tells the kernel whether it is to try to load a -ramdisk image or not. Specifying "load_ramdisk=1" will tell the -kernel to load a floppy into the ramdisk. The default value is -zero, meaning that the kernel should not try to load a ramdisk. +RAM disk image or not. Specifying "load_ramdisk=1" will tell the +kernel to load a floppy into the RAM disk. The default value is +zero, meaning that the kernel should not try to load a RAM disk. prompt_ramdisk=N ================ This parameter tells the kernel whether or not to give you a prompt -asking you to insert the floppy containing the ramdisk image. In -a single floppy configuration the ramdisk image is on the same floppy +asking you to insert the floppy containing the RAM disk image. In +a single floppy configuration the RAM disk image is on the same floppy as the kernel that just finished loading/booting and so a prompt is not needed. In this case one can use "prompt_ramdisk=0". In a two floppy configuration, you will need the chance to switch disks, @@ -100,18 +99,18 @@ value, it doesn't really need to be specified. ramdisk_size=N ============== -This parameter tells the ramdisk driver to set up ramdisks of Nk size. The -default is 4096 (4MB). +This parameter tells the RAM disk driver to set up RAM disks of N k size. The +default is 4096 (4 MB). 3) Using "rdev -r" With New Kernels ----------------------------------- The usage of the word (two bytes) that "rdev -r" sets in the kernel image -has changed. The low 11 bits (0 -> 10) specify an offset (in 1k blocks) -of up to 2MB (2^11) of where to find the ramdisk (this used to be the -size). Bit 14 indicates that a ramdisk is to be loaded, and bit 15 +has changed. The low 11 bits (0 -> 10) specify an offset (in 1 k blocks) +of up to 2 MB (2^11) of where to find the RAM disk (this used to be the +size). Bit 14 indicates that a RAM disk is to be loaded, and bit 15 indicates whether a prompt/wait sequence is to be given before trying -to read the ramdisk. Since the ramdisk dynamically grows as data is +to read the RAM disk. Since the RAM disk dynamically grows as data is being written into it, a size field is no longer required. Bits 11 to 13 are not currently used and may as well be zero. These numbers are no magical secrets, as seen below: @@ -121,13 +120,13 @@ are no magical secrets, as seen below: ./arch/i386/kernel/setup.c:#define RAMDISK_LOAD_FLAG 0x4000 Consider a typical two floppy disk setup, where you will have the -kernel on disk one, and have already put a ramdisk image onto disk #2. +kernel on disk one, and have already put a RAM disk image onto disk #2. -Hence you want to set bits 0 to 13 as zero, meaning that your ramdisk -starts at an offset of zero kB from the beginning of the floppy. +Hence you want to set bits 0 to 13 as 0, meaning that your RAM disk +starts at an offset of 0 kB from the beginning of the floppy. The command line equivalent is: "ramdisk_start=0" -You want bit 14 as one, indicating that a ramdisk is to be loaded. +You want bit 14 as one, indicating that a RAM disk is to be loaded. The command line equivalent is: "load_ramdisk=1" You want bit 15 as one, indicating that you want a prompt/keypress @@ -147,20 +146,20 @@ Since the default start = 0 and the default prompt = 1, you could use: append = "load_ramdisk=1" -4) An Example of Creating a Compressed ramdisk +4) An Example of Creating a Compressed RAM Disk ---------------------------------------------- -To create a ramdisk image, you will need a spare block device to -construct it on. This can be the ramdisk device itself, or an +To create a RAM disk image, you will need a spare block device to +construct it on. This can be the RAM disk device itself, or an unused disk partition (such as an unmounted swap partition). For this -example, we will use the ramdisk device, "/dev/ram". +example, we will use the RAM disk device, "/dev/ram". -Note: This technique should not be done on a machine with less than 8MB +Note: This technique should not be done on a machine with less than 8 MB of RAM. If using a spare disk partition instead of /dev/ram, then this restriction does not apply. -a) Decide on the ramdisk size that you want. Say 2MB for this example. - Create it by writing to the ramdisk device. (This step is not currently +a) Decide on the RAM disk size that you want. Say 2 MB for this example. + Create it by writing to the RAM disk device. (This step is not currently required, but may be in the future.) It is wise to zero out the area (esp. for disks) so that maximal compression is achieved for the unused blocks of the image that you are about to create. @@ -174,9 +173,9 @@ b) Make a filesystem on it. Say ext2fs for this example. c) Mount it, copy the files you want to it (eg: /etc/* /dev/* ...) and unmount it again. -d) Compress the contents of the ramdisk. The level of compression +d) Compress the contents of the RAM disk. The level of compression will be approximately 50% of the space used by the files. Unused - space on the ramdisk will compress to almost nothing. + space on the RAM disk will compress to almost nothing. dd if=/dev/ram bs=1k count=2048 | gzip -v9 > /tmp/ram_image.gz @@ -184,23 +183,23 @@ e) Put the kernel onto the floppy dd if=zImage of=/dev/fd0 bs=1k -f) Put the ramdisk image onto the floppy, after the kernel. Use an offset +f) Put the RAM disk image onto the floppy, after the kernel. Use an offset that is slightly larger than the kernel, so that you can put another (possibly larger) kernel onto the same floppy later without overlapping - the ramdisk image. An offset of 400kB for kernels about 350kB in + the RAM disk image. An offset of 400 kB for kernels about 350 kB in size would be reasonable. Make sure offset+size of ram_image.gz is - not larger than the total space on your floppy (usually 1440kB). + not larger than the total space on your floppy (usually 1440 kB). dd if=/tmp/ram_image.gz of=/dev/fd0 bs=1k seek=400 -g) Use "rdev" to set the boot device, ramdisk offset, prompt flag, etc. +g) Use "rdev" to set the boot device, RAM disk offset, prompt flag, etc. For prompt_ramdisk=1, load_ramdisk=1, ramdisk_start=400, one would have 2^15 + 2^14 + 400 = 49552. rdev /dev/fd0 /dev/fd0 rdev -r /dev/fd0 49552 -That is it. You now have your boot/root compressed ramdisk floppy. Some +That is it. You now have your boot/root compressed RAM disk floppy. Some users may wish to combine steps (d) and (f) by using a pipe. -------------------------------------------------------------------------- diff --git a/Documentation/smp.tex b/Documentation/smp.tex index 2a6e86a2f233..40e73fe6ea43 100644 --- a/Documentation/smp.tex +++ b/Documentation/smp.tex @@ -52,7 +52,7 @@ For any kernel to function in a sane manner it has to provide internal locking and protection of its own tables to prevent two processes updating them at once and for example allocating the same memory block. There are two strategies for this within current Unix and Unixlike kernels. -Traditional unix systems from the earliest of days use a scheme of 'Coarse +Traditional Unix systems from the earliest of days use a scheme of 'Coarse Grained Locking' where the entire kernel is protected by a small number of locks only. Some modern systems use fine grained locking. Because fine grained locking has more overhead it is normally used only on diff --git a/Documentation/spinlocks.txt b/Documentation/spinlocks.txt index 53f9362f5c90..c6e24f82d34e 100644 --- a/Documentation/spinlocks.txt +++ b/Documentation/spinlocks.txt @@ -11,7 +11,7 @@ On Fri, 2 Jan 1998, Doug Ledford wrote: > these routines and go about making use of them? Do they only lock on a > per-processor basis or can they also lock say an interrupt routine from > mucking with a queue if the queue routine was manipulating it when the -> interrupt occured, or should I still use a cli(); based construct on that +> interrupt occurred, or should I still use a cli(); based construct on that > one? See . The basic version is: diff --git a/Documentation/svga.txt b/Documentation/svga.txt index 644c7369f160..2622f72119af 100644 --- a/Documentation/svga.txt +++ b/Documentation/svga.txt @@ -60,7 +60,7 @@ absolutely insane PC design. "0 0F00 80x25" means that the first menu item (the menu items are numbered from "0" to "9" and from "a" to "z") is a 80x25 mode with ID=0x0f00 (see the -next section for a description of mode ID's). +next section for a description of mode IDs). encourages you to enter the item number or mode ID you wish to set and press . If the computer complains something about @@ -91,9 +91,9 @@ function. modes are not listed at all and the modes revealed by `scan' are shown before all VESA modes. -3. Mode ID's -~~~~~~~~~~~~ - Because of the complexity of all the video stuff, the video mode ID's +3. Mode IDs +~~~~~~~~~~~ + Because of the complexity of all the video stuff, the video mode IDs used here are also a bit complex. A video mode ID is a 16-bit number usually expressed in a hexadecimal notation (starting with "0x"). You can set a mode by entering its mode directly if you know it even if it isn't shown on the menu. @@ -233,7 +233,7 @@ force setting of the correct mode. 2.2 (01-Feb-96) EGA 80x43 fixed. VESA extended to 0x200-0x4ff (non-standard 02XX VESA modes work now). Display end bug workaround supported. Special modes renumbered to allow adding of the "recalculate" - flag, 0xffff and 0xfffe became aliases instead of real ID's. + flag, 0xffff and 0xfffe became aliases instead of real IDs. Screen contents retained during mode changes. 2.3 (15-Mar-96) Changed to work with 1.3.74 kernel. 2.4 (18-Mar-96) Added patches by Hans Lermen fixing a memory overwrite problem @@ -267,3 +267,4 @@ force setting of the correct mode. offered explicitly on the prompt line. - Removed the doc section describing adding of new probing functions as I try to get rid of _all_ hardware probing here. +2.12 (25-May-98)- Added support for VESA frame buffer graphics. diff --git a/Documentation/sysctl/README b/Documentation/sysctl/README index be6a09704d1f..ca08da9dae91 100644 --- a/Documentation/sysctl/README +++ b/Documentation/sysctl/README @@ -1,4 +1,3 @@ - Documentation for /proc/sys/*/* version 0.1 (c) 1998, Rik van Riel diff --git a/Documentation/sysctl/kernel.txt b/Documentation/sysctl/kernel.txt index b935b4ca976a..5525e236a08a 100644 --- a/Documentation/sysctl/kernel.txt +++ b/Documentation/sysctl/kernel.txt @@ -1,4 +1,3 @@ - Documentation for /proc/sys/kernel/* version 0.1 (c) 1998, Rik van Riel @@ -89,8 +88,8 @@ would suffice to set your hostname and domainname. file-max & file-nr: -The kernel allocates filehandles dynamically, but as yet it -doesn't free them again... +The kernel allocates file handles dynamically, but as yet it +doesn't free them again. The value in file-max denotes the maximum number of file- handles that the Linux kernel will allocate. When you get lots @@ -99,17 +98,17 @@ want to increase this limit. The three values in file-nr denote the number of allocated file handles, the number of used file handles and the maximum -number of file handles. When the allocated filehandles come +number of file handles. When the allocated file handles come close to the maximum, but the number of actually used ones is -far behind, you've encountered a peak in your filehandle usage -and you don't need to increase the maximum. +far behind, you've encountered a peak in your usage of file +handles and you don't need to increase the maximum. ============================================================== inode-max, inode-nr & inode-state: -As with filehandles, the kernel allocates the inode structures -dynamically, but can't free them yet... +As with file handles, the kernel allocates the inode structures +dynamically, but can't free them yet. The value in inode-max denotes the maximum number of inode handlers. This value should be 3-4 times larger than the value diff --git a/Documentation/sysctl/vm.txt b/Documentation/sysctl/vm.txt index 099d2a3b4f28..c49a2fe439a4 100644 --- a/Documentation/sysctl/vm.txt +++ b/Documentation/sysctl/vm.txt @@ -1,4 +1,3 @@ - Documentation for /proc/sys/vm/* version 0.1 (c) 1998, Rik van Riel @@ -99,7 +98,7 @@ be used for buffer memory. The percentage is calculated as a percentage of total system memory. The values are: -min_percent -- this is the minumum percentage of memory +min_percent -- this is the minimum percentage of memory that should be spent on buffer memory borrow_percent -- when Linux is short on memory, and the buffer cache uses more memory, free pages @@ -138,7 +137,7 @@ freepages.high The swapping daemon exits when memory is kswapd: Kswapd is the kernel swapout daemon. That is, kswapd is that -piece of the kernel that frees memory when it get's fragmented +piece of the kernel that frees memory when it gets fragmented or full. Since every system is different, you'll probably want some control over this piece of the system. @@ -152,7 +151,7 @@ tries_base The maximum number of pages kswapd tries to number. Usually this number will be divided by 4 or 8 (see mm/vmscan.c), so it isn't as big as it looks. - When you need to increase the bandwith to/from + When you need to increase the bandwidth to/from swap, you'll want to increase this number. tries_min This is the minimum number of times kswapd tries to free a page each time it is called. @@ -186,9 +185,9 @@ From linux/mm/mmap.c: -------------------------------------------------------------- static inline int vm_enough_memory(long pages) { - /* Stupid algorithm to decide if we have enough memory: while - * simple, it hopefully works in most obvious cases.. Easy to - * fool it, but this should catch most mistakes. + /* This stupid algorithm decides whether we have enough memory: + * while simple, it should work in most obvious cases. It's + * easily fooled, but this should catch most mistakes. */ long freepages; @@ -269,7 +268,7 @@ also scan small processes. The values of sc_pageout_weight and sc_bufferout_weight are used to control how many tries kswapd will make in order to swapout one page / buffer. These values can be used to -finetune the ratio between user pages and buffer/cache memory. +fine-tune the ratio between user pages and buffer/cache memory. When you find that your Linux system is swapping out too many process pages in order to satisfy buffer memory demands, you might want to either increase sc_bufferout_weight, or decrease diff --git a/Documentation/sysrq.txt b/Documentation/sysrq.txt index 78ab20c4b568..40bce4fd7ccf 100644 --- a/Documentation/sysrq.txt +++ b/Documentation/sysrq.txt @@ -37,7 +37,7 @@ On other - If you know of the key combos for other architectures, please 's' - Will attempt to sync all mounted filesystems. -'u' - Will attempt to remount all mounted file systems readonly. +'u' - Will attempt to remount all mounted filesystems read-only. 'p' - Will dump the current registers and flags to your console. diff --git a/Documentation/watchdog.txt b/Documentation/watchdog.txt index caf7adf244b8..e328e3c1564f 100644 --- a/Documentation/watchdog.txt +++ b/Documentation/watchdog.txt @@ -23,7 +23,7 @@ will reboot from almost anything. A second temperature monitoring interface is available on the WDT501P cards and some Berkshire cards. This provides /dev/temperature. This is the machine -internal temperature in degrees farenheit. Each read returns a single byte +internal temperature in degrees Fahrenheit. Each read returns a single byte giving the temperature. The third interface logs kernel messages on additional alert events. diff --git a/Makefile b/Makefile index 3b6672baf4f5..94cf2ea4e66a 100644 --- a/Makefile +++ b/Makefile @@ -93,7 +93,7 @@ AFLAGS += -D__SMP__ endif # -# if you want the ram-disk device, define this to be the +# if you want the RAM disk device, define this to be the # size in blocks. # @@ -145,6 +145,10 @@ ifdef CONFIG_PNP DRIVERS := $(DRIVERS) drivers/pnp/pnp.a endif +ifdef CONFIG_VT +DRIVERS := $(DRIVERS) drivers/video/video.a +endif + ifeq ($(CONFIG_PARIDE),y) DRIVERS := $(DRIVERS) drivers/block/paride/paride.a endif @@ -319,6 +323,8 @@ modules_install: if [ -f CDROM_MODULES ]; then inst_mod CDROM_MODULES cdrom; fi; \ if [ -f HAM_MODULES ]; then inst_mod HAM_MODULES net; fi; \ if [ -f SOUND_MODULES ]; then inst_mod SOUND_MODULES sound; fi; \ + if [ -f VIDEO_MODULES ]; then inst_mod VIDEO_MODULES video; fi; \ + if [ -f FC4_MODULES ]; then inst_mod FC4_MODULES fc4; fi; \ \ ls *.o > .allmods; \ echo $$MODULES | tr ' ' '\n' | sort | comm -23 .allmods - > .misc; \ diff --git a/README b/README index e26de3a585af..0545620a8d2b 100644 --- a/README +++ b/README @@ -1,4 +1,3 @@ - Linux kernel release 2.1.xx These are the release notes for Linux version 2.1. Read them carefully, @@ -126,16 +125,16 @@ SOFTWARE REQUIREMENTS CONFIGURING the kernel: - - Do a "make config" to configure the basic kernel. "make config" - needs bash to work: it will search for bash in $BASH, /bin/bash and - /bin/sh (in that order), so hopefully one of those is correct. + - Do a "make config" to configure the basic kernel. "make config" needs + bash to work: it will search for bash in $BASH, /bin/bash and /bin/sh + (in that order), so one of those must be correct for it to work. - (Do not skip this step even if you are only upgrading one minor + Do not skip this step even if you are only upgrading one minor version. New configuration options are added in each release, and odd problems will turn up if the configuration files are not set up as expected. If you want to carry your existing configuration to a new version with minimal work, use "make oldconfig", which will - only ask you for the answers to new questions.) + only ask you for the answers to new questions. - Alternate configuration commands are: "make menuconfig" Text based color menus, radiolists & dialogs. @@ -180,7 +179,7 @@ COMPILING the kernel: kernel. - Do a "make zImage" to create a compressed kernel image. If you want - to make a bootdisk (without root filesystem or lilo), insert a floppy + to make a boot disk (without root filesystem or LILO), insert a floppy in your A: drive, and do a "make zdisk". It is also possible to do "make zlilo" if you have lilo installed to suit the kernel makefiles, but you may want to check your particular lilo setup first. diff --git a/Rules.make b/Rules.make index d533b2688cb7..c64024d8fe1d 100644 --- a/Rules.make +++ b/Rules.make @@ -176,10 +176,10 @@ ifneq "$(strip $(SYMTAB_OBJS))" "" MODINCL = $(TOPDIR)/include/linux/modules # The -w option (enable warnings) for genksyms will return here in 2.1 -# So where has it gone ??? +# So where has it gone? # -# Added the SMP separator to stop module accidents between uniproc/smp -# intel boxes - AC - from bits by Michael Chastain +# Added the SMP separator to stop module accidents between uniprocessor +# and SMP Intel boxes - AC - from bits by Michael Chastain # ifdef SMP diff --git a/arch/alpha/config.in b/arch/alpha/config.in index bc7a8d174982..8bb65c811c6e 100644 --- a/arch/alpha/config.in +++ b/arch/alpha/config.in @@ -202,6 +202,12 @@ if [ "$CONFIG_PARPORT" != "n" ]; then fi endmenu +bool 'Support for frame buffer devices' CONFIG_FB +if [ "$CONFIG_FB" = "y" ]; then + define_bool CONFIG_PCI_CONSOLE y +fi +source drivers/video/Config.in + source drivers/pnp/Config.in source drivers/block/Config.in diff --git a/arch/alpha/kernel/apecs.c b/arch/alpha/kernel/apecs.c index 2bbdf0062c1a..cc8912aa19c3 100644 --- a/arch/alpha/kernel/apecs.c +++ b/arch/alpha/kernel/apecs.c @@ -82,7 +82,7 @@ unsigned int APECS_DMA_WIN_SIZE = APECS_DMA_WIN_SIZE_DEFAULT; * * Notes: * The function number selects which function of a multi-function device - * (e.g., scsi and ethernet). + * (e.g., SCSI and Ethernet). * * The register selects a DWORD (32 bit) register offset. Hence it * doesn't get shifted by 2 bits as we want to "drop" the bottom two diff --git a/arch/alpha/kernel/bios32.c b/arch/alpha/kernel/bios32.c index 8e848a68709e..344b6793b3b2 100644 --- a/arch/alpha/kernel/bios32.c +++ b/arch/alpha/kernel/bios32.c @@ -1090,7 +1090,7 @@ static inline void cabriolet_fixup(void) * 6 PCI on board slot 0 * 7 PCI on board slot 1 * 8 Intel SIO PCI-ISA bridge chip - * 9 Tulip - DECchip 21040 ethernet controller + * 9 Tulip - DECchip 21040 Ethernet controller * * * This two layered interrupt approach means that we allocate IRQ 16 and @@ -1946,10 +1946,6 @@ static inline void sio_fixup(void) } -#ifdef CONFIG_TGA_CONSOLE -extern void tga_console_init(void); -#endif /* CONFIG_TGA_CONSOLE */ - void __init pcibios_fixup(void) { @@ -2023,12 +2019,6 @@ pcibios_fixup(void) #else # error "You must tell me what kind of platform you want." #endif - -#ifndef CONFIG_ABSTRACT_CONSOLE -#ifdef CONFIG_TGA_CONSOLE - tga_console_init(); -#endif -#endif } diff --git a/arch/alpha/kernel/cia.c b/arch/alpha/kernel/cia.c index 4d2d156ad61a..079b4c22545b 100644 --- a/arch/alpha/kernel/cia.c +++ b/arch/alpha/kernel/cia.c @@ -104,7 +104,7 @@ unsigned long cia_sm_base_r1, cia_sm_base_r2, cia_sm_base_r3; * * Notes: * The function number selects which function of a multi-function device - * (e.g., scsi and ethernet). + * (e.g., SCSI and Ethernet). * * The register selects a DWORD (32 bit) register offset. Hence it * doesn't get shifted by 2 bits as we want to "drop" the bottom two diff --git a/arch/alpha/kernel/irq.c b/arch/alpha/kernel/irq.c index bcac2da2b771..9470ee69a90f 100644 --- a/arch/alpha/kernel/irq.c +++ b/arch/alpha/kernel/irq.c @@ -827,7 +827,7 @@ void irq_enter(int cpu, int irq) cpu, previous_irqholder, globl_locked, globl_icount, local_count); #ifdef VERBOSE_IRQLOCK_DEBUGGING - printk("Performing backtrace on all cpus," + printk("Performing backtrace on all CPUs," " write this down!\n"); smp_show_backtrace_all_cpus(); #endif diff --git a/arch/alpha/kernel/lca.c b/arch/alpha/kernel/lca.c index 42cf63792a95..29461afc05d4 100644 --- a/arch/alpha/kernel/lca.c +++ b/arch/alpha/kernel/lca.c @@ -84,7 +84,7 @@ unsigned int LCA_DMA_WIN_SIZE = LCA_DMA_WIN_SIZE_DEFAULT; * * Notes: * The function number selects which function of a multi-function device - * (e.g., scsi and ethernet). + * (e.g., SCSI and Ethernet). * * The register selects a DWORD (32 bit) register offset. Hence it * doesn't get shifted by 2 bits as we want to "drop" the bottom two diff --git a/arch/alpha/kernel/mcpcia.c b/arch/alpha/kernel/mcpcia.c index 6a9dab59abb0..f8bdcca69176 100644 --- a/arch/alpha/kernel/mcpcia.c +++ b/arch/alpha/kernel/mcpcia.c @@ -120,7 +120,7 @@ unsigned long mcpcia_sm_base_r1, mcpcia_sm_base_r2, mcpcia_sm_base_r3; * * Notes: * The function number selects which function of a multi-function device - * (e.g., scsi and ethernet). + * (e.g., SCSI and Ethernet). * * The register selects a DWORD (32 bit) register offset. Hence it * doesn't get shifted by 2 bits as we want to "drop" the bottom two diff --git a/arch/alpha/kernel/osf_sys.c b/arch/alpha/kernel/osf_sys.c index eb923b416003..168b8fbb10c2 100644 --- a/arch/alpha/kernel/osf_sys.c +++ b/arch/alpha/kernel/osf_sys.c @@ -366,8 +366,8 @@ struct cdfs_args { int flags; uid_t exroot; /* - * this has lots more here, which linux handles with the option block - * but I'm too lazy to do the translation into ascii.. + * This has lots more here, which Linux handles with the option block + * but I'm too lazy to do the translation into ASCII. */ }; @@ -435,8 +435,8 @@ static void putdev(struct dentry *dentry) /* * We can't actually handle ufs yet, so we translate UFS mounts to - * ext2fs mounts... I wouldn't mind a UFS filesystem, but the UFS - * layout is so braindead it's a major headache doing it.. + * ext2fs mounts. I wouldn't mind a UFS filesystem, but the UFS + * layout is so braindead it's a major headache doing it. */ static int osf_ufs_mount(char *dirname, struct ufs_args *args, int flags) { @@ -845,7 +845,7 @@ asmlinkage long osf_sysinfo(int command, char *buf, long count) lock_kernel(); offset = command-1; if (offset >= sizeof(sysinfo_table)/sizeof(char *)) { - /* Digital unix has a few unpublished interfaces here */ + /* Digital UNIX has a few unpublished interfaces here */ printk("sysinfo(%d)", command); goto out; } diff --git a/arch/alpha/kernel/process.c b/arch/alpha/kernel/process.c index f318e87cc1d4..bcf84c34e3df 100644 --- a/arch/alpha/kernel/process.c +++ b/arch/alpha/kernel/process.c @@ -5,7 +5,7 @@ */ /* - * This file handles the architecture-dependent parts of process handling.. + * This file handles the architecture-dependent parts of process handling. */ #include @@ -255,7 +255,7 @@ void exit_thread(void) void flush_thread(void) { /* Arrange for each exec'ed process to start off with a - clean slate wrt the fpu. */ + clean slate with respect to the FPU. */ current->tss.flags &= ~IEEE_SW_MASK; wrfpcr(FPCR_DYN_NORMAL); } diff --git a/arch/alpha/kernel/pyxis.c b/arch/alpha/kernel/pyxis.c index de3814b66a99..9db4fe4d7851 100644 --- a/arch/alpha/kernel/pyxis.c +++ b/arch/alpha/kernel/pyxis.c @@ -89,7 +89,7 @@ unsigned long pyxis_sm_base_r1, pyxis_sm_base_r2, pyxis_sm_base_r3; * * Notes: * The function number selects which function of a multi-function device - * (e.g., scsi and ethernet). + * (e.g., SCSI and Ethernet). * * The register selects a DWORD (32 bit) register offset. Hence it * doesn't get shifted by 2 bits as we want to "drop" the bottom two diff --git a/arch/alpha/kernel/setup.c b/arch/alpha/kernel/setup.c index bcab8667fbd8..474becaf3aff 100644 --- a/arch/alpha/kernel/setup.c +++ b/arch/alpha/kernel/setup.c @@ -23,6 +23,7 @@ #include /* CONFIG_ALPHA_LCA etc */ #include #include +#include #ifdef CONFIG_RTC #include @@ -221,20 +222,29 @@ void setup_arch(char **cmdline_p, #ifdef __SMP__ setup_smp(); #endif + +#ifdef CONFIG_VGA_CONSOLE + conswitchp = &vga_con; +#endif +#ifdef CONFIG_FB + /* Frame buffer device based console */ + conswitchp = &fb_con; +#endif } #define N(a) (sizeof(a)/sizeof(a[0])) /* A change was made to the HWRPB via an ECO and the following code tracks - * a part of the ECO. The HWRPB version must be 5 or higher or the ECO - * was not implemented in the console firmware. If its at rev 5 or greater - * we can get the platform ascii string name from the HWRPB. Thats what this - * function does. It checks the rev level and if the string is in the HWRPB - * it returns the addtess of the string ... a pointer to the platform name. + * a part of the ECO. In HWRPB versions less than 5, the ECO was not + * implemented in the console firmware. If it's revision 5 or greater we can + * get the name of the platform as an ASCII string from the HWRPB. That's what + * this function does. It checks the revision level and if the string is in + * the HWRPB it returns the address of the string--a pointer to the name of the + * platform. * * Returns: - * - Pointer to a ascii string if its in the HWRPB + * - Pointer to a ASCII string if it's in the HWRPB * - Pointer to a blank string if the data is not in the HWRPB. */ static char * @@ -378,11 +388,11 @@ int get_cpuinfo(char *buffer) &systype_name, &sysvariation_name); return sprintf(buffer, - "cpu\t\t\t: Alpha\n" - "cpu model\t\t: %s\n" - "cpu variation\t\t: %ld\n" - "cpu revision\t\t: %ld\n" - "cpu serial number\t: %s\n" + "CPU\t\t\t: Alpha\n" + "CPU model\t\t: %s\n" + "CPU variation\t\t: %ld\n" + "CPU revision\t\t: %ld\n" + "CPU serial number\t: %s\n" "system type\t\t: %s\n" "system variation\t: %s\n" "system revision\t\t: %ld\n" diff --git a/arch/alpha/kernel/smc37c669.c b/arch/alpha/kernel/smc37c669.c index bcc4ed2127fb..fa0d598d2f0e 100644 --- a/arch/alpha/kernel/smc37c669.c +++ b/arch/alpha/kernel/smc37c669.c @@ -1131,7 +1131,7 @@ struct DDB smc_ddb = { 0, /* is a flash update driver */ 0, /* is a block device */ 0, /* not seekable */ - 0, /* is an ethernet device */ + 0, /* is an Ethernet device */ 0, /* is a filesystem driver */ }; #endif diff --git a/arch/alpha/kernel/smp.c b/arch/alpha/kernel/smp.c index 6468908e8e5a..ebf254c214d0 100644 --- a/arch/alpha/kernel/smp.c +++ b/arch/alpha/kernel/smp.c @@ -397,9 +397,8 @@ lier); return -EINVAL; } -/* Only broken Intel needs this, thus it should not even be referenced - * globally... - */ +/* Only broken Intel needs this, thus it should not even be referenced globally. +*/ __initfunc(void initialize_secondary(void)) { printk("initialize_secondary: entry\n"); @@ -673,7 +672,7 @@ wrapper_local_flush_tlb_page(unsigned int this_cpu) static int unknown_ipi(unsigned int this_cpu) { - printk("unknown_ipi() on cpu %d: ", this_cpu); + printk("unknown_ipi() on CPU %d: ", this_cpu); return 1; } @@ -762,7 +761,7 @@ smp_message_pass(int target, int msg, unsigned long data, int wait) send_ipi_message(CPU_STOP, cpu_present_map ^ (1 << me)); return; barf: - printk("Yeeee, trying to send SMP msg(%d) on cpu %d\n", msg, me); + printk("Yeeee, trying to send SMP msg(%d) on CPU %d\n", msg, me); panic("Bogon SMP message pass."); } diff --git a/arch/alpha/kernel/t2.c b/arch/alpha/kernel/t2.c index d789d69adf83..2430aae2202a 100644 --- a/arch/alpha/kernel/t2.c +++ b/arch/alpha/kernel/t2.c @@ -103,7 +103,7 @@ unsigned long t2_sm_base; * * Notes: * The function number selects which function of a multi-function device - * (e.g., scsi and ethernet). + * (e.g., SCSI and Ethernet). * * The register selects a DWORD (32 bit) register offset. Hence it * doesn't get shifted by 2 bits as we want to "drop" the bottom two @@ -520,7 +520,7 @@ int t2_clear_errors(void) sable_cpu_regs[cpu]->sic &= ~SIC_SEIC; /* - * clear cpu errors + * clear CPU errors */ sable_cpu_regs[cpu]->bcce |= sable_cpu_regs[cpu]->bcce; sable_cpu_regs[cpu]->cbe |= sable_cpu_regs[cpu]->cbe; diff --git a/arch/alpha/kernel/time.c b/arch/alpha/kernel/time.c index 0456eb171d3f..b1c1a9410a96 100644 --- a/arch/alpha/kernel/time.c +++ b/arch/alpha/kernel/time.c @@ -57,7 +57,7 @@ static struct { __u32 last_time; /* ticks/cycle * 2^48 */ unsigned long scaled_ticks_per_cycle; - /* last time the cmos clock got updated */ + /* last time the CMOS clock got updated */ time_t last_rtc_update; } state; diff --git a/arch/alpha/kernel/tsunami.c b/arch/alpha/kernel/tsunami.c index 3d0fdde8910f..f351632b843a 100644 --- a/arch/alpha/kernel/tsunami.c +++ b/arch/alpha/kernel/tsunami.c @@ -1,7 +1,7 @@ /* * Code common to all TSUNAMI chips. * - * Based on code written by David A Rusling (david.rusling@reo.mts.dec.com). + * Based on code written by David A. Rusling (david.rusling@reo.mts.dec.com). * */ #include @@ -18,7 +18,7 @@ /* * NOTE: Herein lie back-to-back mb instructions. They are magic. - * One plausible explanation is that the i/o controller does not properly + * One plausible explanation is that the I/O controller does not properly * handle the system transaction. Another involves timing. Ho hum. */ @@ -84,7 +84,7 @@ unsigned int TSUNAMI_DMA_WIN_SIZE = TSUNAMI_DMA_WIN_SIZE_DEFAULT; * * Notes: * The function number selects which function of a multi-function device - * (e.g., scsi and ethernet). + * (e.g., SCSI and Ethernet). * * The register selects a DWORD (32 bit) register offset. Hence it * doesn't get shifted by 2 bits as we want to "drop" the bottom two diff --git a/arch/alpha/lib/strlen_user.S b/arch/alpha/lib/strlen_user.S index b84d9a4c3e9d..cdf71158f833 100644 --- a/arch/alpha/lib/strlen_user.S +++ b/arch/alpha/lib/strlen_user.S @@ -2,7 +2,7 @@ * arch/alpha/lib/strlen_user.S * * Return the length of the string including the NUL terminator - * (strlen+1) or zero if an error occured. + * (strlen+1) or zero if an error occurred. */ #include diff --git a/arch/alpha/mm/fault.c b/arch/alpha/mm/fault.c index 56cb1a7ddaee..647456833aa9 100644 --- a/arch/alpha/mm/fault.c +++ b/arch/alpha/mm/fault.c @@ -111,7 +111,7 @@ asmlinkage void do_page_fault(unsigned long address, unsigned long mmcsr, unsigned fixup; /* As of EV6, a load into $31/$f31 is a prefetch, and never faults - (or is suppressed by the PALcode). Support that for older cpu's + (or is suppressed by the PALcode). Support that for older CPUs by ignoring such an instruction. */ if (cause == 0) { unsigned int insn; diff --git a/arch/i386/boot/bootsect.S b/arch/i386/boot/bootsect.S index f7f252b41987..583589cf16c1 100644 --- a/arch/i386/boot/bootsect.S +++ b/arch/i386/boot/bootsect.S @@ -413,7 +413,7 @@ print_digit: rol dx, #4 ! rotate so that lowest 4 bits are used mov ax, #0xe0f ! ah = request, al = mask for nybble and al, dl - add al, #0x90 ! convert al to ascii hex (four instructions) + add al, #0x90 ! convert al to ASCII hex (four instructions) daa adc al, #0x40 daa diff --git a/arch/i386/boot/compressed/misc.c b/arch/i386/boot/compressed/misc.c index 4d2ece791e27..ad78c419d988 100644 --- a/arch/i386/boot/compressed/misc.c +++ b/arch/i386/boot/compressed/misc.c @@ -38,7 +38,7 @@ static unsigned inptr = 0; /* index of next byte to be processed in inbuf */ static unsigned outcnt = 0; /* bytes in output buffer */ /* gzip flag byte */ -#define ASCII_FLAG 0x01 /* bit 0 set: file probably ascii text */ +#define ASCII_FLAG 0x01 /* bit 0 set: file probably ASCII text */ #define CONTINUATION 0x02 /* bit 1 set: continuation of multi-part gzip file */ #define EXTRA_FIELD 0x04 /* bit 2 set: extra field present */ #define ORIG_NAME 0x08 /* bit 3 set: original file name present */ diff --git a/arch/i386/boot/setup.S b/arch/i386/boot/setup.S index de252abf87d1..0959487c1d4f 100644 --- a/arch/i386/boot/setup.S +++ b/arch/i386/boot/setup.S @@ -145,7 +145,7 @@ start_of_setup: jne bad_sig jmp good_sig1 -! Routine to print asciiz-string at DS:SI +! Routine to print ASCII string at DS:SI prtstr: lodsb and al,al @@ -159,7 +159,7 @@ fin: ret prtsp2: call prtspc ! Print double space prtspc: mov al,#0x20 ! Print single space (fall-thru!) -! Part of above routine, this one just prints ascii al +! Part of above routine, this one just prints ASCII al prtchr: push ax push cx @@ -226,12 +226,12 @@ good_sig: ! check if an old loader tries to load a big-kernel seg cs - test byte ptr loadflags,#LOADED_HIGH ! have we a big kernel ? + test byte ptr loadflags,#LOADED_HIGH ! Have we a big kernel? jz loader_ok ! NO, no danger even for old loaders ! YES, we have a big-kernel seg cs - cmp byte ptr type_of_loader,#0 ! have we one of the new loaders ? - jnz loader_ok ! YES, ok + cmp byte ptr type_of_loader,#0 ! Have we one of the new loaders? + jnz loader_ok ! YES, OK ! NO, we have an old loader, must give up push cs pop ds @@ -239,7 +239,7 @@ good_sig: call prtstr jmp no_sig_loop loader_panic_mess: - .ascii "Wrong loader, giving up..." + .ascii "Wrong loader: giving up." db 0 loader_ok: @@ -255,8 +255,8 @@ loader_ok: int 0x15 jc oldstylemem -! memory size is in 1k chunksizes, to avoid confusing loadlin. -! we store the 0xe801 memory size in a completely different place, +! Memory size is in 1 k chunksizes, to avoid confusing loadlin. +! We store the 0xe801 memory size in a completely different place, ! because it will most likely be longer than 16 bits. ! (use 1e0 because that's what Larry Augustine uses in his ! alternative new memory detection scheme, and it's sensible @@ -270,7 +270,7 @@ loader_ok: add [0x1e0],eax ! and add lower memory into total size. ! and fall into the old memory detection code to populate the - ! compatability slot. + ! compatibility slot. oldstylemem: pop ebx @@ -290,7 +290,7 @@ oldstylemem: ! Check for video adapter and its parameters and allow the ! user to browse video modes. - call video ! NOTE: we need DS pointing to bootsector + call video ! NOTE: we need DS pointing to boot sector ! Get hd0 data @@ -380,7 +380,7 @@ no_psmouse: #ifdef CONFIG_APM ! check for APM BIOS - ! NOTE: DS is pointing to the bootsector + ! NOTE: DS is pointing to the boot sector ! mov [64],#0 ! version == 0 means no APM BIOS @@ -479,7 +479,7 @@ end_move: mov ds,ax ! If we have our code not at 0x90000, we need to move it there now. -! We also then need to move the params behind it (commandline) +! We also then need to move the parameters behind it (command line) ! Because we would overwrite the code on the current IP, we move ! it in two steps, jumping high after the first one. mov ax,cs @@ -600,12 +600,12 @@ a20_wait: ! Well, that certainly wasn't fun :-(. Hopefully it works, and we don't ! need no steenking BIOS anyway (except for the initial loading :-). -! The BIOS-routine wants lots of unnecessary data, and it's less +! The BIOS routine wants lots of unnecessary data, and it's less ! "interesting" anyway. This is how REAL programmers do it. ! ! Well, now's the time to actually move into protected mode. To make ! things as simple as possible, we do no register set-up or anything, -! we let the gnu-compiled 32-bit programs do that. We just jump to +! we let the GNU-compiled 32-bit programs do that. We just jump to ! absolute address 0x1000 (or the loader supplied one), ! in 32-bit protected mode. ! @@ -725,7 +725,7 @@ bootsect_panic: bootsect_panic_loop: jmp bootsect_panic_loop bootsect_panic_mess: - .ascii "INT15 refuses to access high mem, giving up..." + .ascii "INT15 refuses to access high memory. Giving up." db 0 ! This routine checks that the keyboard command queue is empty @@ -747,7 +747,7 @@ no_output: ret ! -! Read the cmos clock. Return the seconds in al +! Read the CMOS clock. Return the seconds in al ! gettime: push cx diff --git a/arch/i386/boot/tools/build.c b/arch/i386/boot/tools/build.c index 8a3a70ca6ef9..b5faf665c29c 100644 --- a/arch/i386/boot/tools/build.c +++ b/arch/i386/boot/tools/build.c @@ -187,7 +187,7 @@ int main(int argc, char ** argv) } close(fd); - if (lseek(1, 497, SEEK_SET) != 497) /* Write sizes to the bootsector */ + if (lseek(1, 497, SEEK_SET) != 497) /* Write sizes to the boot sector */ die("Output: seek failed"); buf[0] = setup_sectors; if (write(1, buf, 1) != 1) diff --git a/arch/i386/boot/video.S b/arch/i386/boot/video.S index 25d02a4432bd..6480765894d3 100644 --- a/arch/i386/boot/video.S +++ b/arch/i386/boot/video.S @@ -1,7 +1,7 @@ ! -! Display adapter & video mode setup, version 2.11 (03-May-97) +! Display adapter & video mode setup, version 2.12 (25-May-98) ! -! Copyright (C) 1995 -- 1997 Martin Mares +! Copyright (C) 1995 -- 1998 Martin Mares ! Based on the original setup.S code (C) Linus Torvalds and Mats Anderson ! @@ -68,14 +68,23 @@ #define VIDEO_RECALC 0x8000 ! Positions of various video parameters passed to the kernel -#define PARAM_CURSOR_POS 0 -#define PARAM_VIDEO_PAGE 4 -#define PARAM_VIDEO_MODE 6 -#define PARAM_VIDEO_COLS 7 -#define PARAM_VIDEO_EGA_BX 10 -#define PARAM_VIDEO_LINES 14 -#define PARAM_HAVE_VGA 15 -#define PARAM_FONT_POINTS 16 +! (see also include/linux/tty.h) +#define PARAM_CURSOR_POS 0x00 +#define PARAM_VIDEO_PAGE 0x04 +#define PARAM_VIDEO_MODE 0x06 +#define PARAM_VIDEO_COLS 0x07 +#define PARAM_VIDEO_EGA_BX 0x0a +#define PARAM_VIDEO_LINES 0x0e +#define PARAM_HAVE_VGA 0x0f +#define PARAM_FONT_POINTS 0x10 + +#define PARAM_LFB_WIDTH 0x12 +#define PARAM_LFB_HEIGHT 0x14 +#define PARAM_LFB_DEPTH 0x16 +#define PARAM_LFB_BASE 0x18 +#define PARAM_LFB_SIZE 0x1c +#define PARAM_LFB_LINELENGTH 0x24 +#define PARAM_LFB_COLORS 0x26 ! Define DO_STORE according to CONFIG_VIDEO_RETAIN #ifdef CONFIG_VIDEO_RETAIN @@ -88,7 +97,7 @@ ! This is the main entry point called by setup.S ! ! Input: -! DS pointing to the bootsector +! DS pointing to the boot sector video: push ds ! We use different segments push ds ! FS contains original DS @@ -155,6 +164,11 @@ basret: ret ! mode_params: +#ifdef CONFIG_VIDEO_SELECT + cmpb [graphic_mode],#0 + jnz mopar_gr +#endif + mov ah,#0x03 ! Read cursor position xor bh,bh int 0x10 @@ -196,6 +210,50 @@ mopar2: seg fs #ifdef CONFIG_VIDEO_SELECT +! +! Fetching of VESA frame buffer parameters +! + +mopar_gr: + lea di,modelist+1024 + seg fs + movb [PARAM_HAVE_VGA],#0x23 + + mov ax,(di+16) + seg fs + mov [PARAM_LFB_LINELENGTH],ax + + mov ax,(di+18) + seg fs + mov [PARAM_LFB_WIDTH],ax + + mov ax,(di+20) + seg fs + mov [PARAM_LFB_HEIGHT],ax + + mov al,(di+25) + mov ah,#0 + seg fs + mov [PARAM_LFB_DEPTH],ax + + mov eax,(di+40) + seg fs + mov [PARAM_LFB_BASE],eax + + mov eax,(di+44) + seg fs + mov [PARAM_LFB_SIZE],eax + + mov eax,(di+31) + seg fs + mov [PARAM_LFB_COLORS],eax + + mov eax,(di+35) + seg fs + mov [PARAM_LFB_COLORS+4],eax + + ret + ! ! The video mode menu ! @@ -355,7 +413,8 @@ setv7: ! Video7 extended modes stc ret -_setrec: br setrec ! Ugly... +_setrec: br setrec ! Ugly... +_set_80x25: br set_80x25 ! ! Aliases for backward compatibility. @@ -369,7 +428,7 @@ setalias: inc bx jnz setbad - ! Fall-thru ! + ! Fall-through! ! ! Setting of user mode (AX=mode ID) => CF=success @@ -388,7 +447,7 @@ mode_set: cmp ah,#VIDEO_FIRST_V7>>8 jz setv7 cmp ah,#VIDEO_FIRST_VESA>>8 - jnc setvesa + jnc check_vesa or ah,ah jz setmenu dec ah @@ -427,7 +486,7 @@ setspc: xor bh,bh ! Set special mode setmenu: or al,al ! 80x25 is an exception - jz set_80x25 + jz _set_80x25 push bx ! Set mode chosen from menu call mode_table ! Build the mode table pop ax @@ -452,6 +511,41 @@ setr1: lodsw mov ax,(si-4) ! Fetch mode ID jmp _m_s + +check_vesa: + lea di,modelist+1024 + sub bh,#VIDEO_FIRST_VESA>>8 + mov cx,bx ! Get mode information structure + mov ax,#0x4f01 + int 0x10 + add bh,#VIDEO_FIRST_VESA>>8 + cmp ax,#0x004f + jnz setbad + + mov al,(di) ! Check capabilities. + and al,#0x19 + cmp al,#0x09 + jz setvesa ! this is a text mode + + mov al,(di) ! Check capabilities. + and al,#0x99 + cmp al,#0x99 + jnz _setbad ! to bad, no linear frame buffer + + sub bh,#VIDEO_FIRST_VESA>>8 + or bx,#0x4000 ! want use linear frame buffer + mov ax,#0x4f02 ! VESA BIOS mode set call + int 0x10 + cmp ax,#0x004f ! AL=4f if implemented, AH=0 if OK + jnz _setbad + + movb [graphic_mode],#1 ! flag graphic mode + movb [do_restore],#0 ! no screen restore + stc + ret + +_setbad: br setbad ! Ugly... + ! ! Recalculate vertical display end registers -- this fixes various ! inconsistencies of extended modes on many adapters. Called when @@ -525,9 +619,9 @@ st80: cmpb [adapter],#0 ! CGA/MDA/HGA => mode 3/7 is always 80x25 jz set80 seg gs ! This is EGA+ -- beware of 80x50 etc. mov al,[0x0484] - or al,al ! Some buggy BIOS'es set 0 rows + or al,al ! Some buggy BIOSs set 0 rows jz set80 - cmp al,#24 ! It's hopefully correct + cmp al,#24 ! Let's hope this is correct jz set80 #endif /* CONFIG_VIDEO_400_HACK */ force3: DO_STORE @@ -929,7 +1023,7 @@ vesa1: seg gs ! Get next mode in the list jz vesar cmp ax,#0x0080 ! Check validity of mode ID jc vesa2 - or ah,ah ! Valid ID's are 0x0000-0x007f and 0x0100-0x07ff + or ah,ah ! Valid IDs are 0x0000-0x007f and 0x0100-0x07ff jz vesan ! [Certain BIOSes erroneously report 0x80-0xff] cmp ax,#0x0800 jnc vesae @@ -1393,7 +1487,7 @@ cirrus6_test: cmp al,#0x01 jne c2fail mov al,#0xaa - call inidx ! 4X, 5X, 7X and 8X are valid 64XX chip ID's + call inidx ! 4X, 5X, 7X and 8X are valid 64XX chip IDs shr al,#4 sub al,#4 jz c6done @@ -1577,7 +1671,7 @@ trident_md: tseng_test: mov dx,#0x3cd - in al,dx ! Could things be this simple ! :-) + in al,dx ! Could things be this simple? :-) mov bl,al mov al,#0x55 out dx,al @@ -1798,6 +1892,7 @@ card_name: .word 0 ! Pointer to adapter name scanning: .byte 0 ! Performing mode scan do_restore: .byte 0 ! Screen contents altered during mode change svga_prefix: .byte VIDEO_FIRST_BIOS>>8 ! Default prefix for BIOS modes +graphic_mode: .byte 0 ! Graphic mode with a linear frame buffer ! ! Messages: diff --git a/arch/i386/config.in b/arch/i386/config.in index 86c214a1e0a8..976db93f8f0f 100644 --- a/arch/i386/config.in +++ b/arch/i386/config.in @@ -66,6 +66,10 @@ if [ "$CONFIG_PARPORT" != "n" ]; then fi fi +if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then + bool 'Support for frame buffer devices (EXPERIMENTAL)' CONFIG_FB +fi + endmenu source drivers/pnp/Config.in @@ -121,6 +125,10 @@ source fs/Config.in source fs/nls/Config.in +define_bool CONFIG_VGA_CONSOLE y + +source drivers/video/Config.in + source drivers/char/Config.in mainmenu_option next_comment @@ -143,4 +151,3 @@ fi bool 'Magic SysRq key' CONFIG_MAGIC_SYSRQ endmenu -define_bool CONFIG_VGA_CONSOLE y diff --git a/arch/i386/defconfig b/arch/i386/defconfig index a0f83b48a0bb..91e88d2e726e 100644 --- a/arch/i386/defconfig +++ b/arch/i386/defconfig @@ -245,6 +245,7 @@ CONFIG_AUTOFS_FS=y # CONFIG_UFS_FS is not set # CONFIG_MAC_PARTITION is not set # CONFIG_NLS is not set +CONFIG_VGA_CONSOLE=y # # Character devices @@ -288,4 +289,3 @@ CONFIG_82C710_MOUSE=y CONFIG_PROFILE=y CONFIG_PROFILE_SHIFT=2 # CONFIG_MAGIC_SYSRQ is not set -CONFIG_VGA_CONSOLE=y diff --git a/arch/i386/kernel/io_apic.c b/arch/i386/kernel/io_apic.c index 3bc84763d5b3..b92607a58970 100644 --- a/arch/i386/kernel/io_apic.c +++ b/arch/i386/kernel/io_apic.c @@ -1,5 +1,5 @@ /* - * Intel IO-APIC support for multi-pentium hosts. + * Intel IO-APIC support for multi-Pentium hosts. * * Copyright (C) 1997, 1998 Ingo Molnar, Hajnalka Szabo * @@ -129,7 +129,7 @@ void io_apic_write (unsigned int reg, unsigned int value) } /* - * Syncronize the IO-APIC and the CPU by doing + * Synchronize the IO-APIC and the CPU by doing * a dummy read from the IO-APIC */ static inline void io_apic_sync(void) @@ -206,7 +206,7 @@ void clear_IO_APIC_pin (unsigned int pin) /* - * support for broken MP BIOSes, enables hand-redirection of PIRQ0-7 to + * support for broken MP BIOSs, enables hand-redirection of PIRQ0-7 to * specific CPU-side IRQs. */ @@ -243,7 +243,7 @@ __initfunc(void ioapic_pirq_setup(char *str, int *ints)) } /* - * Find the irq entry nr of a certain pin. + * Find the IRQ entry number of a certain pin. */ __initfunc(static int find_irq_entry(int pin, int type)) { @@ -520,7 +520,7 @@ int IO_APIC_irq_trigger (int irq) return (irq_trigger(idx)); } /* - * nonexistant IRQs are edge default + * nonexistent IRQs are edge default */ return 0; } @@ -634,16 +634,16 @@ void print_IO_APIC (void) struct IO_APIC_reg_01 reg_01; struct IO_APIC_reg_02 reg_02; - printk("nr of MP irq sources: %d.\n", mp_irq_entries); - printk("nr of IO-APIC registers: %d.\n", nr_ioapic_registers); + printk("number of MP IRQ sources: %d.\n", mp_irq_entries); + printk("number of IO-APIC registers: %d.\n", nr_ioapic_registers); *(int *)®_00 = io_apic_read(0); *(int *)®_01 = io_apic_read(1); *(int *)®_02 = io_apic_read(2); /* - * We are a bit conservative about what we expect, we have to - * know about every HW change ASAP ... + * We are a bit conservative about what we expect. We have to + * know about every hardware change ASAP. */ printk("testing the IO APIC.......................\n"); @@ -723,7 +723,7 @@ __initfunc(static void init_sym_mode (void)) for (i=0; ievents = 1; /* - * If the irq is disabled for whatever reason, we cannot - * use the action we have.. + * If the IRQ is disabled for whatever reason, we cannot + * use the action we have. */ action = NULL; if (!(desc->status & (IRQ_DISABLED | IRQ_INPROGRESS))) { @@ -1002,7 +1002,7 @@ static void do_edge_ioapic_IRQ(unsigned int irq, int cpu, struct pt_regs * regs) /* * Edge triggered interrupts need to remember - * pending events.. + * pending events. */ for (;;) { int pending; @@ -1042,8 +1042,8 @@ static void do_level_ioapic_IRQ (unsigned int irq, int cpu, desc->ipi = 0; /* - * If the irq is disabled for whatever reason, we must - * not enter the irq action. + * If the IRQ is disabled for whatever reason, we must + * not enter the IRQ action. */ action = NULL; if (!(desc->status & (IRQ_DISABLED | IRQ_INPROGRESS))) { @@ -1073,7 +1073,7 @@ static void do_level_ioapic_IRQ (unsigned int irq, int cpu, /* * Level and edge triggered IO-APIC interrupts need different handling, - * so we use two separate irq descriptors. edge triggered IRQs can be + * so we use two separate IRQ descriptors. Edge triggered IRQs can be * handled with the level-triggered descriptor, but that one has slightly * more overhead. Level-triggered interrupts cannot be handled with the * edge-triggered handler, without risking IRQ storms and other ugly @@ -1103,10 +1103,10 @@ void init_IO_APIC_traps(void) * As the interrupt level is determined by taking the * vector number and shifting that right by 4, we * want to spread these out a bit so that they don't - * all fall in the same interrupt level + * all fall in the same interrupt level. * - * also, we've got to be careful not to trash gate - * 0x80, because int 0x80 is hm, kindof importantish ;) + * Also, we've got to be careful not to trash gate + * 0x80, because int 0x80 is hm, kind of importantish. ;) */ for (i = 0; i < NR_IRQS ; i++) { if ((IO_APIC_VECTOR(i) <= 0xfe) /* HACK */ && @@ -1128,9 +1128,9 @@ void init_IO_APIC_traps(void) /* * This code may look a bit paranoid, but it's supposed to cooperate with - * a wide range of boards and BIOS bugs ... fortunately only the timer IRQ - * is so screwy. Thanks to Brian Perkins for testing/hacking this beast - * fanatically on his truly bugged board. + * a wide range of boards and BIOS bugs. Fortunately only the timer IRQ + * is so screwy. Thanks to Brian Perkins for testing/hacking this beast + * fanatically on his truly buggy board. */ __initfunc(static void check_timer (void)) { @@ -1142,7 +1142,7 @@ __initfunc(static void check_timer (void)) if (!timer_irq_works ()) { if (pin1 != -1) printk("..MP-BIOS bug: 8254 timer not connected to IO-APIC\n"); - printk("..trying to set up timer as ExtINT ... "); + printk("...trying to set up timer as ExtINT... "); if (pin2 != -1) { printk(".. (found pin %d) ...", pin2); @@ -1152,7 +1152,7 @@ __initfunc(static void check_timer (void)) if (!timer_irq_works ()) { printk(" failed.\n"); - printk("..trying to set up timer as BP irq ..."); + printk("...trying to set up timer as BP IRQ..."); /* * Just in case ... */ @@ -1165,7 +1165,7 @@ __initfunc(static void check_timer (void)) if (!timer_irq_works ()) { printk(" failed.\n"); - panic("IO-APIC + timer doesnt work!"); + panic("IO-APIC + timer doesn't work!"); } } printk(" works.\n"); @@ -1201,7 +1201,7 @@ __initfunc(void setup_IO_APIC (void)) } /* - * If there are no explicit mp irq entries: it's either one of the + * If there are no explicit MP IRQ entries, it's either one of the * default configuration types or we are broken. In both cases it's * fine to set up most of the low 16 IO-APIC pins to ISA defaults. */ @@ -1213,7 +1213,7 @@ __initfunc(void setup_IO_APIC (void)) init_IO_APIC_traps(); /* - * Set up the IO-APIC irq routing table by parsing the MP-BIOS + * Set up the IO-APIC IRQ routing table by parsing the MP-BIOS * mptable: */ setup_IO_APIC_irqs (); diff --git a/arch/i386/kernel/irq.c b/arch/i386/kernel/irq.c index d50797cb80dc..2f0667f48562 100644 --- a/arch/i386/kernel/irq.c +++ b/arch/i386/kernel/irq.c @@ -11,7 +11,7 @@ */ /* - * IRQ's are in fact implemented a bit like signal handlers for the kernel. + * IRQs are in fact implemented a bit like signal handlers for the kernel. * Naturally it's not a 1:1 relation, but there are similarities. */ @@ -385,7 +385,7 @@ static inline void wait_on_bh(void) * Such 'high frequency update' races can be avoided by careful design, but * some of our major constructs like spinlocks use similar techniques, * it would be nice to clarify this issue. Set this define to 0 if you - * want to check wether your system freezes. I suspect the delay done + * want to check whether your system freezes. I suspect the delay done * by SYNC_OTHER_CORES() is in correlation with 'snooping latency', but * i thought that such things are guaranteed by design, since we use * the 'LOCK' prefix. diff --git a/arch/i386/kernel/mtrr.c b/arch/i386/kernel/mtrr.c index e94e83b6c2f1..aa8f910554b9 100644 --- a/arch/i386/kernel/mtrr.c +++ b/arch/i386/kernel/mtrr.c @@ -486,7 +486,7 @@ struct mtrr_state }; -/* Grab all of the mtrr state for this cpu into *state. */ +/* Grab all of the MTRR state for this CPU into *state. */ __initfunc(static void get_mtrr_state(struct mtrr_state *state)) { unsigned int nvrs, i; @@ -697,7 +697,7 @@ static void copy_mtrr_state_handler (struct set_mtrr_context *ctxt, void *info) } } /* End Function copy_mtrr_state_handler */ -/* Copies the entire MTRR state of this cpu to all the others. */ +/* Copies the entire MTRR state of this CPU to all the others. */ static void copy_mtrr_state (void) { struct mtrr_state ms; diff --git a/arch/i386/kernel/process.c b/arch/i386/kernel/process.c index ddeeb898a6ce..e1433b78c514 100644 --- a/arch/i386/kernel/process.c +++ b/arch/i386/kernel/process.c @@ -261,7 +261,7 @@ real_mode_idt = { 0x3ff, 0 }; something else should be done for other chips. More could be done here to set up the registers as if a CPU reset had - occurred; hopefully real BIOSes don't assume much. */ + occurred; hopefully real BIOSs don't assume much. */ static unsigned char real_mode_switch [] = { @@ -546,7 +546,7 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long esp, } /* - * fill in the fpu structure for a core dump.. + * fill in the FPU structure for a core dump. */ int dump_fpu (struct pt_regs * regs, struct user_i387_struct* fpu) { diff --git a/arch/i386/kernel/setup.c b/arch/i386/kernel/setup.c index 7b4c86192be1..a18f4091c373 100644 --- a/arch/i386/kernel/setup.c +++ b/arch/i386/kernel/setup.c @@ -32,6 +32,7 @@ #ifdef CONFIG_BLK_DEV_RAM #include #endif +#include #include #include #include @@ -210,12 +211,20 @@ __initfunc(void setup_arch(char **cmdline_p, } #endif - /* request io space for devices used on all i[345]86 PC'S */ + /* request I/O space for devices used on all i[345]86 PCs */ request_region(0x00,0x20,"dma1"); request_region(0x40,0x20,"timer"); request_region(0x80,0x10,"dma page reg"); request_region(0xc0,0x20,"dma2"); request_region(0xf0,0x10,"fpu"); + +#ifdef CONFIG_VT +#ifdef CONFIG_FB + conswitchp = &fb_con; +#else + conswitchp = &vga_con; +#endif +#endif } /* @@ -359,10 +368,10 @@ static struct cpu_model_info cpu_models[] __initdata = { { NULL, NULL, NULL, "DX/2", NULL, NULL, NULL, "DX/2-WB", "DX/4", "DX/4-WB", NULL, NULL, NULL, NULL, "Am5x86-WT", "Am5x86-WB" }}, { X86_VENDOR_AMD, 5, - { "K5/SSA5 (PR-75, PR-90, PR-100)", "K5 (PR-120, PR-133)", - "K5 (PR-166)", "K5 (PR-200)", NULL, NULL, - "K6 (166 - 266)", "K6 (166 - 300)", "K6-2 (200 - 450)", - "K6-3D-Plus (200 - 450)", NULL, NULL, NULL, NULL, NULL, NULL }}, + { "K5/SSA5 (PR75, PR90, PR100)", "K5 (PR120, PR133)", + "K5 (PR166)", "K5 (PR200)", NULL, NULL, + "K6 (PR166 - PR266)", "K6 (PR166 - PR300)", "K6-2 (PR233 - PR333)", + "K6-3 (PR300 - PR450)", NULL, NULL, NULL, NULL, NULL, NULL }}, { X86_VENDOR_UMC, 4, { NULL, "U5D", "U5S", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }}, @@ -457,7 +466,7 @@ int get_cpuinfo(char * buffer) continue; #endif p += sprintf(p, "processor\t: %d\n" - "cpu family\t: %c\n" + "CPU family\t: %c\n" "model\t\t: %s\n" "vendor_id\t: %s\n", n, @@ -503,9 +512,9 @@ int get_cpuinfo(char * buffer) "hlt_bug\t\t: %s\n" "sep_bug\t\t: %s\n" "f00f_bug\t: %s\n" - "fpu\t\t: %s\n" - "fpu_exception\t: %s\n" - "cpuid level\t: %d\n" + "FPU\t\t: %s\n" + "FPU_exception\t: %s\n" + "CPUID level\t: %d\n" "wp\t\t: %s\n" "flags\t\t:", c->fdiv_bug ? "yes" : "no", diff --git a/arch/i386/kernel/smp.c b/arch/i386/kernel/smp.c index 8e740000369b..5172f2ffe5de 100644 --- a/arch/i386/kernel/smp.c +++ b/arch/i386/kernel/smp.c @@ -64,19 +64,19 @@ extern void update_one_process( struct task_struct *p, /* * Some notes on processor bugs: * - * Pentium and Pentium Pro (and all CPU's) have bugs. The Linux issues + * Pentium and Pentium Pro (and all CPUs) have bugs. The Linux issues * for SMP are handled as follows. * * Pentium Pro * Occasional delivery of 'spurious interrupt' as trap #16. This - * is very very rare. The kernel logs the event and recovers + * is very rare. The kernel logs the event and recovers * * Pentium * There is a marginal case where REP MOVS on 100MHz SMP * machines with B stepping processors can fail. XXX should provide * an L1cache=Writethrough or L1cache=off option. * - * B stepping CPU's may hang. There are hardware work arounds + * B stepping CPUs may hang. There are hardware work arounds * for this. We warn about it in case your board doesnt have the work * arounds. Basically thats so I can tell anyone with a B stepping * CPU and SMP problems "tough". @@ -116,15 +116,15 @@ static int smp_b_stepping = 0; /* Set if we find a B stepping CPU */ static int max_cpus = -1; /* Setup configured maximum number of CPUs to activate */ int smp_found_config=0; /* Have we found an SMP box */ -unsigned long cpu_present_map = 0; /* Bitmask of existing CPU's */ -int smp_num_cpus = 1; /* Total count of live CPU's */ +unsigned long cpu_present_map = 0; /* Bitmask of existing CPUs */ +int smp_num_cpus = 1; /* Total count of live CPUs */ int smp_threads_ready=0; /* Set when the idlers are all forked */ volatile int cpu_number_map[NR_CPUS]; /* which CPU maps to which logical number */ volatile int __cpu_logical_map[NR_CPUS]; /* which logical number maps to which CPU */ volatile unsigned long cpu_callin_map[NR_CPUS] = {0,}; /* We always use 0 the rest is ready for parallel delivery */ volatile unsigned long smp_invalidate_needed; /* Used for the invalidate map that's also checked in the spinlock */ -volatile unsigned long kstack_ptr; /* Stack vector for booting CPU's */ -struct cpuinfo_x86 cpu_data[NR_CPUS]; /* Per cpu bogomips and other parameters */ +volatile unsigned long kstack_ptr; /* Stack vector for booting CPUs */ +struct cpuinfo_x86 cpu_data[NR_CPUS]; /* Per CPU bogomips and other parameters */ static unsigned int num_processors = 1; /* Internal processor count */ static unsigned long io_apic_addr = 0xFEC00000; /* Address of the I/O apic (not yet used) */ unsigned char boot_cpu_id = 0; /* Processor that is doing the boot up */ @@ -140,7 +140,7 @@ volatile unsigned char active_kernel_processor = NO_PROC_ID; /* Processor holdin volatile unsigned long kernel_counter=0; /* Number of times the processor holds the lock */ volatile unsigned long syscall_count=0; /* Number of times the processor holds the syscall lock */ -volatile unsigned long ipi_count; /* Number of IPI's delivered */ +volatile unsigned long ipi_count; /* Number of IPIs delivered */ volatile unsigned long smp_proc_in_lock[NR_CPUS] = {0,};/* for computing process time */ volatile int smp_process_available=0; @@ -396,7 +396,7 @@ __initfunc(static int smp_read_mpc(struct mp_config_table *mpc)) } } if(apics>1) - printk("Warning: Multiple APIC's not supported.\n"); + printk("Warning: Multiple APICs not supported.\n"); return num_processors; } @@ -448,7 +448,7 @@ __initfunc(int smp_scan_config(unsigned long base, unsigned long length)) * * HACK HACK HACK HACK HACK HACK HACK HACK HACK HACK HACK HACK HACK * - * It's not just a crazy hack... ;-) + * It's not just a crazy hack. ;-) */ /* * Standard page mapping @@ -614,17 +614,17 @@ __initfunc(void smp_store_cpu_info(int id)) /* * Architecture specific routine called by the kernel just before init is * fired off. This allows the BP to have everything in order [we hope]. - * At the end of this all the AP's will hit the system scheduling and off + * At the end of this all the APs will hit the system scheduling and off * we go. Each AP will load the system gdt's and jump through the kernel * init into idle(). At this point the scheduler will one day take over * and give them jobs to do. smp_callin is a standard routine - * we use to track CPU's as they power up. + * we use to track CPUs as they power up. */ __initfunc(void smp_commence(void)) { /* - * Lets the callin's below out of their loop. + * Lets the callins below out of their loop. */ SMP_PRINTK(("Setting commenced=1, go go go\n")); smp_commenced=1; @@ -705,7 +705,7 @@ __initfunc(int start_secondary(void *unused)) /* * Everything has been set up for the secondary - * CPU's - they just need to reload everything + * CPUs - they just need to reload everything * from the task structure */ __initfunc(void initialize_secondary(void)) @@ -928,7 +928,7 @@ unsigned int prof_multiplier[NR_CPUS]; unsigned int prof_counter[NR_CPUS]; /* - * Cycle through the processors sending APIC IPI's to boot each. + * Cycle through the processors sending APIC IPIs to boot each. */ __initfunc(void smp_boot_cpus(void)) @@ -941,7 +941,7 @@ __initfunc(void smp_boot_cpus(void)) mtrr_init_boot_cpu (); #endif /* - * Initialize the logical to physical cpu number mapping + * Initialize the logical to physical CPU number mapping * and the per-CPU profiling counter/multiplier */ @@ -1031,7 +1031,7 @@ __initfunc(void smp_boot_cpus(void)) setup_APIC_clock (); /* - * Now scan the cpu present map and fire up the other CPUs. + * Now scan the CPU present map and fire up the other CPUs. */ SMP_PRINTK(("CPU map: %lx\n", cpu_present_map)); @@ -1161,16 +1161,16 @@ void send_IPI (int dest, int vector) } /* - * A non wait message cannot pass data or cpu source info. This current setup + * A non wait message cannot pass data or CPU source info. This current setup * is only safe because the kernel lock owner is the only person who can send * a message. * * Wrapping this whole block in a spinlock is not the safe answer either. A - * processor may get stuck with irq's off waiting to send a message and thus - * not replying to the person spinning for a reply.... + * processor may get stuck with IRQs off waiting to send a message and thus + * not replying to the person spinning for a reply. * - * In the end flush tlb ought to be the NMI and a very very short function - * (to avoid the old IDE disk problems), and other messages sent with IRQ's + * In the end flush tlb ought to be the NMI and a very short function + * (to avoid the old IDE disk problems), and other messages sent with IRQs * enabled in a civilised fashion. That will also boost performance. */ @@ -1223,15 +1223,15 @@ void smp_message_pass(int target, int msg, unsigned long data, int wait) } /* - * Sanity check we don't re-enter this across CPU's. Only the kernel - * lock holder may send messages. For a STOP_CPU we are bringing the - * entire box to the fastest halt we can.. A reschedule carries - * no data and can occur during a flush.. guess what panic - * I got to notice this bug... + * Sanity check we don't re-enter this across CPUs. Only the kernel + * lock holder may send messages. For a STOP_CPU we are bringing the + * entire box to the fastest halt we can. A reschedule carries + * no data and can occur during a flush. Guess what panic + * I got to notice this bug. */ /* - * We are busy + * We are busy. */ smp_cpu_in_msg[p]++; @@ -1240,7 +1240,7 @@ void smp_message_pass(int target, int msg, unsigned long data, int wait) p, msg, target);*/ /* - * Wait for the APIC to become ready - this should never occur. Its + * Wait for the APIC to become ready - this should never occur. It's * a debugging check really. */ @@ -1327,7 +1327,7 @@ void smp_message_pass(int target, int msg, unsigned long data, int wait) /* * This is fraught with deadlocks. Linus does a flush tlb at a whim - * even with IRQ's off. We have to avoid a pair of crossing flushes + * even with IRQs off. We have to avoid a pair of crossing flushes * or we are doomed. See the notes about smp_message_pass. */ @@ -1447,7 +1447,7 @@ void smp_local_timer_interrupt(struct pt_regs * regs) * we might want to decouple profiling from the 'long path', * and do the profiling totally in assembly. * - * Currently this isnt too much of an issue (performance wise), + * Currently this isn't too much of an issue (performance wise), * we can take more than 100K local irqs per second on a 100 MHz P5. */ } @@ -1617,7 +1617,7 @@ __initfunc(void wait_8254_wraparound (void)) delta = curr_count-prev_count; /* - * This limit for delta seems arbitrary, but it isnt, it's + * This limit for delta seems arbitrary, but it isn't, it's * slightly above the level of error a buggy Mercury/Neptune * chipset timer can cause. */ @@ -1670,7 +1670,7 @@ __initfunc(int calibrate_APIC_clock (void)) #define LOOPS (HZ/10) /* - * let's wait LOOPS wraprounds: + * Let's wait LOOPS wraprounds: */ for (i=0; ilock_depth, * if it was found to originally be zero then we get here, - * %eax contains callers PC and %edx holds this cpu ID. + * %eax contains caller's PC and %edx holds this CPU ID. */ ENTRY(__lock_kernel) 1: diff --git a/arch/i386/math-emu/README b/arch/i386/math-emu/README index c6c774092d39..04434b618dad 100644 --- a/arch/i386/math-emu/README +++ b/arch/i386/math-emu/README @@ -131,7 +131,7 @@ code is: movl %esp,[%ebx] fld1 The FPU instruction may be (usually will be) loaded into the pre-fetch -queue of the cpu before the mov instruction is executed. If the +queue of the CPU before the mov instruction is executed. If the destination of the 'movl' overlaps the FPU instruction then the bytes in the prefetch queue and memory will be inconsistent when the FPU instruction is executed. The emulator will be invoked but will not be @@ -163,7 +163,7 @@ Speed. The speed of floating point computation with the emulator will depend upon instruction mix. Relative performance is best for the instructions which require most computation. The simple instructions are adversely -affected by the fpu instruction trap overhead. +affected by the FPU instruction trap overhead. Timing: Some simple timing tests have been made on the emulator functions. diff --git a/arch/i386/math-emu/reg_mul.c b/arch/i386/math-emu/reg_mul.c index 1ea92d48e690..face9efee1da 100644 --- a/arch/i386/math-emu/reg_mul.c +++ b/arch/i386/math-emu/reg_mul.c @@ -7,7 +7,7 @@ | W. Metzenthen, 22 Parker St, Ormond, Vic 3163, Australia | | E-mail billm@suburbia.net | | | - | Returns the tag of the result if no exceptions or errors occured. | + | Returns the tag of the result if no exceptions or errors occurred. | | | +---------------------------------------------------------------------------*/ diff --git a/arch/m68k/config.in b/arch/m68k/config.in index a701cd83a539..24e80afd6af9 100644 --- a/arch/m68k/config.in +++ b/arch/m68k/config.in @@ -318,9 +318,6 @@ if [ "$CONFIG_WATCHDOG" != "n" ]; then bool ' Software Watchdog' CONFIG_SOFT_WATCHDOG fi bool 'Support for user misc device modules' CONFIG_UMISC -if [ "$CONFIG_AMIGA" = "y" -o "$CONFIG_ATARI" = "y" -o "$CONFIG_MAC" = "y" ]; then - define_bool CONFIG_ABSTRACT_CONSOLE y -fi if [ "$CONFIG_ATARI" = "y" ]; then bool 'Enhanced Real Time Clock Support' CONFIG_RTC fi diff --git a/arch/ppc/config.in b/arch/ppc/config.in index 901b530e51cb..92085b0367a4 100644 --- a/arch/ppc/config.in +++ b/arch/ppc/config.in @@ -77,23 +77,21 @@ if [ "$CONFIG_PARPORT" != "n" ]; then fi fi -if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then - bool 'New unified console driver (EXPERIMENTAL)' CONFIG_ABSTRACT_CONSOLE +bool 'Support for frame buffer devices' CONFIG_FB +if [ "$CONFIG_FB" = "y" ]; then + bool 'Backward compatibility mode for Xpmac' CONFIG_FB_COMPAT_XPMAC +else + define_bool CONFIG_ABSCON_COMPAT y fi if [ "$CONFIG_PMAC" = "y" ]; then - if [ "$CONFIG_ABSTRACT_CONSOLE" = "y" ]; then - define_bool CONFIG_FB y - bool 'Backward compatibility mode for Xpmac' CONFIG_FB_COMPAT_XPMAC - else + if [ "$CONFIG_FB" != "y" ]; then define_bool CONFIG_PMAC_CONSOLE y fi else # if compiling specifically for prep or chrp, or supporting all arch's - if [ "$CONFIG_ABSTRACT_CONSOLE" = "y" ]; then - bool 'Support for frame buffer devices' CONFIG_FB + if [ "$CONFIG_FB" = "y" ]; then bool 'Support for VGA devices' CONFIG_VGA_CONSOLE - bool 'Backward compatibility mode for Xpmac' CONFIG_FB_COMPAT_XPMAC else bool 'Support for PowerMac console' CONFIG_PMAC_CONSOLE fi @@ -108,7 +106,7 @@ bool 'Support for Open Firmware device tree in /proc' CONFIG_PROC_DEVICETREE bool 'Include kgdb kernel debugger' CONFIG_KGDB bool 'Include xmon kernel debugger' CONFIG_XMON -if [ "$CONFIG_ABSTRACT_CONSOLE" != "y" ]; then +if [ "$CONFIG_FB" != "y" ]; then if [ "$CONFIG_PMAC_CONSOLE" = "y" ]; then bool 'Support for Apple "control" display' CONFIG_CONTROL_VIDEO bool 'Support for Apple "platinum" display' CONFIG_PLATINUM_VIDEO @@ -176,9 +174,7 @@ source fs/Config.in source fs/nls/Config.in -if [ "$CONFIG_ABSTRACT_CONSOLE" = "y" ]; then - source drivers/video/Config.in -fi +source drivers/video/Config.in source drivers/char/Config.in diff --git a/arch/ppc/kernel/chrp_setup.c b/arch/ppc/kernel/chrp_setup.c index 524b185abe08..f941035a5159 100644 --- a/arch/ppc/kernel/chrp_setup.c +++ b/arch/ppc/kernel/chrp_setup.c @@ -28,9 +28,7 @@ #include #include #include -#ifdef CONFIG_ABSTRACT_CONSOLE #include -#endif #include #include @@ -264,4 +262,8 @@ chrp_setup_arch(unsigned long * memory_start_p, unsigned long * memory_end_p)) /* Frame buffer device based console */ conswitchp = &fb_con; #endif +#ifdef CONFIG_ABSCON_COMPAT + /* Console wrapper */ + conswitchp = &compat_con; +#endif } diff --git a/arch/ppc/kernel/pmac_setup.c b/arch/ppc/kernel/pmac_setup.c index ccdbb692b220..12b6302d96b5 100644 --- a/arch/ppc/kernel/pmac_setup.c +++ b/arch/ppc/kernel/pmac_setup.c @@ -38,9 +38,8 @@ #include #include #include -#ifdef CONFIG_ABSTRACT_CONSOLE +#include #include -#endif #include #include #include @@ -142,6 +141,12 @@ pmac_setup_arch(unsigned long *memory_start_p, unsigned long *memory_end_p)) /* Frame buffer device based console */ conswitchp = &fb_con; #endif +#ifdef CONFIG_ABSCON_COMPAT + /* Console wrapper */ + conswitchp = &compat_con; +#endif + + kd_mksound = pmac_mksound; } static volatile u32 *feature_addr; diff --git a/arch/ppc/kernel/prep_setup.c b/arch/ppc/kernel/prep_setup.c index c311b5634b7d..3d1096b7e60f 100644 --- a/arch/ppc/kernel/prep_setup.c +++ b/arch/ppc/kernel/prep_setup.c @@ -28,9 +28,7 @@ #include #include #include -#ifdef CONFIG_ABSTRACT_CONSOLE #include -#endif #include #include @@ -256,9 +254,11 @@ prep_setup_arch(unsigned long * memory_start_p, unsigned long * memory_end_p)) request_region(0x80,0x10,"dma page reg"); request_region(0xc0,0x20,"dma2"); -#ifdef CONFIG_ABSTRACT_CONSOLE #ifdef CONFIG_VGA_CONSOLE conswitchp = &vga_con; #endif +#ifdef CONFIG_ABSCON_COMPAT + /* Console wrapper */ + conswitchp = &compat_con; #endif } diff --git a/drivers/Makefile b/drivers/Makefile index 810aa6d74397..2b5e2b137c46 100644 --- a/drivers/Makefile +++ b/drivers/Makefile @@ -1,15 +1,15 @@ # -# Makefile for the linux kernel device drivers. +# Makefile for the Linux kernel device drivers. # # Note! Dependencies are done automagically by 'make dep', which also # removes any old dependencies. DON'T put your own dependencies here -# unless it's something special (ie not a .c file). +# unless it's something special (not a .c file). # -# Note 2! The CFLAGS definitions are now in the main makefile... +# Note 2! The CFLAGS definitions are now in the main makefile. SUB_DIRS := block char net misc sound MOD_SUB_DIRS := $(SUB_DIRS) sbus -ALL_SUB_DIRS := $(SUB_DIRS) pci scsi sbus cdrom isdn pnp macintosh +ALL_SUB_DIRS := $(SUB_DIRS) pci scsi sbus cdrom isdn pnp macintosh video ifdef CONFIG_PCI SUB_DIRS += pci @@ -19,12 +19,17 @@ ifdef CONFIG_SBUS SUB_DIRS += sbus endif +ifdef CONFIG_VT +SUB_DIRS += video +MOD_SUB_DIRS += video +endif + ifdef CONFIG_PPC SUB_DIRS += macintosh MOD_SUB_DIRS += macintosh endif -# If CONFIG_SCSI is set, the core of scsi support will be added to the kernel, +# If CONFIG_SCSI is set, the core of SCSI support will be added to the kernel, # but some of the low-level things may also be modules. ifeq ($(CONFIG_SCSI),y) SUB_DIRS += scsi @@ -63,10 +68,9 @@ SUB_DIRS += ap1000 ALL_SUB_DIRS += ap1000 endif -# make will try to add $(MOD_SUB_DIRS).o to modules/MOD_LIST_NAME -# when MOD_LIST_NAME is set. We don't have hamradio.o and Linus -# sort-of insisted on making hamradio a subdirectory to drivers/net. -# +# When MOD_LIST_NAME is set, make will try to add $(MOD_SUB_DIRS).o to +# modules/MOD_LIST_NAME. We don't have hamradio.o and Linus +# sort of insisted on making hamradio/ a subdirectory of drivers/net/. ifeq ($(CONFIG_HAMRADIO),y) SUB_DIRS += net/hamradio diff --git a/drivers/block/Config.in b/drivers/block/Config.in index a112e819a775..5b073c141636 100644 --- a/drivers/block/Config.in +++ b/drivers/block/Config.in @@ -8,7 +8,7 @@ tristate 'Normal floppy disk support' CONFIG_BLK_DEV_FD tristate 'Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support' CONFIG_BLK_DEV_IDE comment 'Please see Documentation/ide.txt for help/info on IDE drives' if [ "$CONFIG_BLK_DEV_IDE" = "n" ]; then - bool 'Old harddisk (MFM/RLL/IDE) driver' CONFIG_BLK_DEV_HD_ONLY + bool 'Old hard disk (MFM/RLL/IDE) driver' CONFIG_BLK_DEV_HD_ONLY else bool ' Use old disk-only driver on primary interface' CONFIG_BLK_DEV_HD_IDE dep_tristate ' Include IDE/ATA-2 DISK support' CONFIG_BLK_DEV_IDEDISK $CONFIG_BLK_DEV_IDE @@ -54,7 +54,7 @@ else fi fi if [ "$CONFIG_MCA" = "y" ]; then - bool 'PS/2 ESDI harddisk support' CONFIG_BLK_DEV_PS2 + bool 'PS/2 ESDI hard disk support' CONFIG_BLK_DEV_PS2 fi comment 'Additional Block Devices' @@ -75,7 +75,7 @@ tristate 'RAM disk support' CONFIG_BLK_DEV_RAM if [ "$CONFIG_BLK_DEV_RAM" = "y" ]; then bool ' Initial RAM disk (initrd) support' CONFIG_BLK_DEV_INITRD fi -tristate 'XT harddisk support' CONFIG_BLK_DEV_XD +tristate 'XT hard disk support' CONFIG_BLK_DEV_XD # PARIDE doesn't need PARPORT, but if PARPORT is configured as a module, # PARIDE must also be a module. The bogus CONFIG_PARIDE_PARPORT option diff --git a/drivers/block/README.fd b/drivers/block/README.fd index e34fa9f86135..b750c89cf2bc 100644 --- a/drivers/block/README.fd +++ b/drivers/block/README.fd @@ -7,8 +7,8 @@ FAQ list: at http://poboxes.com/Alain.Knaff/floppy/FAQ.html -Lilo config options (Thinkpad users, read this) -=============================================== +LILO configuration options (Thinkpad users, read this) +====================================================== The floppy driver is configured using the 'floppy=' option in lilo. This option can be typed at the boot prompt, or entered in the @@ -104,7 +104,7 @@ isn't, use the old method using environment variables. floppy=nofifo Disables the FIFO entirely. This is needed if you get "Bus - master arbitration error" messages from your ethernet card (or + master arbitration error" messages from your Ethernet card (or from other devices) while accessing the floppy. floppy=fifo diff --git a/drivers/block/acsi.c b/drivers/block/acsi.c index 236eaad42884..3594eb189f21 100644 --- a/drivers/block/acsi.c +++ b/drivers/block/acsi.c @@ -39,7 +39,7 @@ * knows the PREVENT/ALLOW MEDIUM REMOVAL command, the door should * be locked and unlocked when mounting the first or unmounting the * last filesystem on the device. The code is untested, because I - * don't have a removable harddisk. + * don't have a removable hard disk. * */ @@ -147,7 +147,7 @@ struct acsi_info_struct { #define TYPE_NO_LUN 0x7f /* The data returned by MODE SENSE differ between the old Atari - * harddisks and SCSI disks connected to ACSI. In the following, both + * hard disks and SCSI disks connected to ACSI. In the following, both * formats are defined and some macros to operate on them potably. */ diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c index 28d555b48527..9fb5c8e7e57b 100644 --- a/drivers/block/floppy.c +++ b/drivers/block/floppy.c @@ -3962,7 +3962,7 @@ __initfunc(static void set_cmos(int *ints, int dummy, int dummy2)) int current_drive=0; if (ints[0] != 2){ - DPRINT("wrong number of parameter for cmos\n"); + DPRINT("wrong number of parameters for CMOS\n"); return; } current_drive = ints[1]; @@ -3974,11 +3974,11 @@ __initfunc(static void set_cmos(int *ints, int dummy, int dummy2)) FDC2 = 0x370; if (ints[2] <= 0 || (ints[2] >= NUMBER(default_drive_params) && ints[2] != 16)){ - DPRINT("bad cmos code %d\n", ints[2]); + DPRINT("bad CMOS code %d\n", ints[2]); return; } DP->cmos = ints[2]; - DPRINT("setting cmos code to %d\n", ints[2]); + DPRINT("setting CMOS code to %d\n", ints[2]); } static struct param_table { diff --git a/drivers/block/genhd.c b/drivers/block/genhd.c index 5f8fb1444f05..70036419981d 100644 --- a/drivers/block/genhd.c +++ b/drivers/block/genhd.c @@ -1000,7 +1000,7 @@ static void check_partition(struct gendisk *hd, kdev_t dev) /* * This is a kludge to allow the partition check to be - * skipped for specific drives (e.g. IDE cd-rom drives) + * skipped for specific drives (e.g. IDE CD-ROM drives) */ if ((int)first_sector == -1) { hd->part[MINOR(dev)].start_sect = 0; diff --git a/drivers/block/hd.c b/drivers/block/hd.c index 56f89ef67322..bd92e85e6c6c 100644 --- a/drivers/block/hd.c +++ b/drivers/block/hd.c @@ -690,10 +690,10 @@ static void hd_interrupt(int irq, void *dev_id, struct pt_regs *regs) } /* - * This is the harddisk IRQ description. The SA_INTERRUPT in sa_flags - * means we run the IRQ-handler with interrupts disabled: this is bad for + * This is the hard disk IRQ description. The SA_INTERRUPT in sa_flags + * means we run the IRQ-handler with interrupts disabled: this is bad for * interrupt latency, but anything else has led to problems on some - * machines... + * machines. * * We enable interrupts in some of the routines after making sure it's * safe. @@ -760,7 +760,7 @@ static void hd_geninit(struct gendisk *ignored) } if (NR_HD) { if (request_irq(HD_IRQ, hd_interrupt, SA_INTERRUPT, "hd", NULL)) { - printk("hd: unable to get IRQ%d for the harddisk driver\n",HD_IRQ); + printk("hd: unable to get IRQ%d for the hard disk driver\n",HD_IRQ); NR_HD = 0; } else { request_region(HD_DATA, 8, "hd"); @@ -790,7 +790,7 @@ static struct file_operations hd_fops = { __initfunc(int hd_init(void)) { if (register_blkdev(MAJOR_NR,"hd",&hd_fops)) { - printk("hd: unable to get major %d for harddisk\n",MAJOR_NR); + printk("hd: unable to get major %d for hard disk\n",MAJOR_NR); return -1; } blk_dev[MAJOR_NR].request_fn = DEVICE_REQUEST; diff --git a/drivers/block/ht6560b.c b/drivers/block/ht6560b.c index 6bf60e4ddc5b..a3e1229bca65 100644 --- a/drivers/block/ht6560b.c +++ b/drivers/block/ht6560b.c @@ -30,7 +30,7 @@ * of the value is the Active Time (at). Minimum value 2 is the fastest and * the maximum value 15 is the slowest. Default values should be 15 for both. * So 0x24 means 2 for rt and 4 for at. Each of the drives should have - * both values, and IDESETUP gives automatically rt=15 st=15 for cdroms or + * both values, and IDESETUP gives automatically rt=15 st=15 for CDROMs or * similar. If value is too small there will be all sorts of failures. * * Port 0x3e6 bit 0x20 sets these timings on/off. If 0x20 bit is set @@ -103,7 +103,7 @@ static byte ht6560b_selects [2][MAX_DRIVES] = {{0x3c,0x3c}, {0x3d,0x3d}}; * Active Time for each drive. Smaller value gives higher speed. * In case of failures you should probably fall back to a higher value. * - * Hopefully this example will make it clearer: + * Here's an example to make it clearer: * * DOS: DEVICE=C:\bin\HTIDE\HTIDE.SYS /D0=2,4 /D1=4,5 /D2=10,10 /D3=15,15 * Linux: byte ht6560b_timings [][] = {{0x24, 0x45}, {0xaa, 0xff}}; @@ -198,7 +198,7 @@ static void tune_ht6560b (ide_drive_t *drive, byte pio) if (pio == 255) { /* auto-tune */ if (drive->media != ide_disk) - pio = 0; /* some cdroms don't like fast modes (?) */ + pio = 0; /* some CDROMs don't like fast modes (?) */ else pio = ide_get_best_pio_mode(drive, pio, 5, NULL); } diff --git a/drivers/block/md.c b/drivers/block/md.c index 2f45136de1ca..d0eae5a2999b 100644 --- a/drivers/block/md.c +++ b/drivers/block/md.c @@ -594,9 +594,9 @@ static int do_md_add (int minor, kdev_t dev) if (hot_add) { /* * Check the superblock for consistency. - * the personality itself has to check wether it's getting - * added with the proper flags ... also, personality has to - * be checked too ;) + * The personality itself has to check whether it's getting + * added with the proper flags. The personality has to be + * checked too. ;) */ if (analyze_one_sb (realdev)) return -EINVAL; diff --git a/drivers/block/paride/epia.c b/drivers/block/paride/epia.c index 986865e2aee4..6e7fc2e420b6 100644 --- a/drivers/block/paride/epia.c +++ b/drivers/block/paride/epia.c @@ -13,10 +13,11 @@ /* Changes: 1.01 GRG 1998.05.06 init_proto, release_proto + 1.02 GRG 1998.06.17 support older versions of EPIA */ -#define EPIA_VERSION "1.01" +#define EPIA_VERSION "1.02" #include #include @@ -123,7 +124,7 @@ static void epia_connect ( PIA *pi ) static void epia_disconnect ( PIA *pi ) -{ WR(0x84,0x10); +{ /* WR(0x84,0x10); */ w0(pi->saved_r0); w2(1); w2(4); w0(pi->saved_r0); @@ -244,6 +245,7 @@ static int epia_test_proto( PIA *pi, char * scratch, int verbose ) WR(3,k^0x55); if (RR(2) != (k^0xaa)) e[j]++; } + WR(2,1); WR(3,1); } epia_disconnect(pi); diff --git a/drivers/block/paride/paride.c b/drivers/block/paride/paride.c index 96052c3c27a2..805b69e19785 100644 --- a/drivers/block/paride/paride.c +++ b/drivers/block/paride/paride.c @@ -502,6 +502,11 @@ void paride_init( void ) pt_init(); }; #endif +#ifdef CONFIG_PARIDE_PG + { extern int pg_init(void); + pg_init(); + }; +#endif } #endif diff --git a/drivers/block/paride/pcd.c b/drivers/block/paride/pcd.c index e45e35fcef90..fa456893fc93 100644 --- a/drivers/block/paride/pcd.c +++ b/drivers/block/paride/pcd.c @@ -90,10 +90,11 @@ and loosen interpretation of ATAPI standard for clearing error status. Use spinlocks. Eliminate sti(). + 1.03 GRG 1998.06.16 Eliminated an Ugh */ -#define PCD_VERSION "1.02" +#define PCD_VERSION "1.03" #define PCD_MAJOR 46 #define PCD_NAME "pcd" #define PCD_UNITS 4 @@ -413,30 +414,20 @@ static int pcd_release (struct inode *inode, struct file *file) int init_module(void) { int err; - long flags; - - save_flags(flags); - cli(); err = pcd_init(); - restore_flags(flags); return err; } void cleanup_module(void) -{ long flags; - int unit; +{ int unit; - save_flags(flags); - cli(); unregister_blkdev(MAJOR_NR,name); for (unit=0;unitnext)) @@ -650,8 +636,6 @@ void cleanup_module(void) for (unit=0;unit 1) printk("%s: %s %d bytes\n",PG.name, p?"Read":"Write",n); - PG.dlen = (1-p)*d; + PG.dlen += (1-p)*d; + buf += d; + r = pg_wait(unit,STAT_BUSY,STAT_DRQ|STAT_READY|STAT_ERR, + tmo,"completion"); } - s = pg_wait(unit,STAT_BUSY,STAT_READY|STAT_ERR,tmo,"data done"); - pi_disconnect(PI); - return (r?r:s); + return r; } static int pg_reset( int unit ) @@ -458,7 +458,7 @@ static int pg_reset( int unit ) pg_sleep(2); k = 0; - while ((k++ < PG_TMO) && (RR(1,6)&STAT_BUSY)) + while ((k++ < PG_RESET_TMO) && (RR(1,6)&STAT_BUSY)) pg_sleep(1); flg = 1; diff --git a/drivers/block/paride/pt.c b/drivers/block/paride/pt.c index 4c1bc862d476..de77c1b5a91f 100644 --- a/drivers/block/paride/pt.c +++ b/drivers/block/paride/pt.c @@ -96,10 +96,11 @@ loosed interpretation of ATAPI standard for clearing error status. Eliminate sti(); + 1.02 GRG 1998.06.16 Eliminate an Ugh. */ -#define PT_VERSION "1.01" +#define PT_VERSION "1.02" #define PT_MAJOR 96 #define PT_NAME "pt" #define PT_UNITS 4 @@ -322,31 +323,20 @@ void cleanup_module(void); int init_module(void) { int err; - long flags; - - save_flags(flags); - cli(); err = pt_init(); - restore_flags(flags); return err; } void cleanup_module(void) -{ long flags; - int unit; - - save_flags(flags); - cli(); +{ int unit; unregister_chrdev(major,name); for (unit=0;unit1 disk, Paul Gortmaker, Mar '98 @@ -70,11 +70,11 @@ extern void wait_for_keypress(void); #define MAJOR_NR RAMDISK_MAJOR #include -/* The ramdisk size is now a parameter */ +/* The RAM disk size is now a parameter */ #define NUM_RAMDISKS 16 /* This cannot be overridden (yet) */ #ifndef MODULE -/* We don't have to load ramdisks or gunzip them in a module... */ +/* We don't have to load RAM disks or gunzip them in a module. */ #define RD_LOADER #define BUILD_CRAMDISK @@ -86,22 +86,23 @@ static int initrd_users = 0; #endif #endif -/* Various static variables go here... mostly used within the ramdisk code only. */ +/* Various static variables go here. Most are used only in the RAM disk code. + */ static int rd_length[NUM_RAMDISKS]; static int rd_blocksizes[NUM_RAMDISKS]; /* - * Parameters for the boot-loading of the ramdisk. These are set by + * Parameters for the boot-loading of the RAM disk. These are set by * init/main.c (from arguments to the kernel command line) or from the - * architecture-specific setup routine (from the stored bootsector + * architecture-specific setup routine (from the stored boot sector * information). */ -int rd_size = 4096; /* Size of the ramdisks */ +int rd_size = 4096; /* Size of the RAM disks */ #ifndef MODULE -int rd_doload = 0; /* 1 = load ramdisk, 0 = don't load */ -int rd_prompt = 1; /* 1 = prompt for ramdisk, 0 = don't prompt */ +int rd_doload = 0; /* 1 = load RAM disk, 0 = don't load */ +int rd_prompt = 1; /* 1 = prompt for RAM disk, 0 = don't prompt */ int rd_image_start = 0; /* starting block # of image */ #ifdef CONFIG_BLK_DEV_INITRD unsigned long initrd_start,initrd_end; @@ -273,7 +274,7 @@ static struct file_operations fd_fops = { block_fsync /* fsync */ }; -/* This is the registration and initialization section of the ramdisk driver */ +/* This is the registration and initialization section of the RAM disk driver */ __initfunc(int rd_init(void)) { int i; @@ -292,7 +293,7 @@ __initfunc(int rd_init(void)) blksize_size[MAJOR_NR] = rd_blocksizes; - printk("Ramdisk driver initialized : %d ramdisks of %dK size\n", + printk("RAM disk driver initialized: %d RAM disks of %dK size\n", NUM_RAMDISKS, rd_size); return 0; @@ -324,11 +325,11 @@ void cleanup_module(void) #endif /* MODULE */ -/* End of non-loading portions of the ramdisk driver */ +/* End of non-loading portions of the RAM disk driver */ #ifdef RD_LOADER /* - * This routine tries to find a ramdisk image to load, and returns the + * This routine tries to find a RAM disk image to load, and returns the * number of blocks to read for a non-compressed image, 0 if the image * is a compressed image, and -1 if an image with the right magic * numbers could not be found. @@ -382,7 +383,7 @@ identify_ramdisk_image(kdev_t device, struct file *fp, int start_block)) if (romfsb->word0 == ROMSB_WORD0 && romfsb->word1 == ROMSB_WORD1) { printk(KERN_NOTICE - "RAMDISK: Romfs filesystem found at block %d\n", + "RAMDISK: romfs filesystem found at block %d\n", start_block); nblocks = (ntohl(romfsb->size)+BLOCK_SIZE-1)>>BLOCK_SIZE_BITS; goto done; @@ -410,14 +411,14 @@ identify_ramdisk_image(kdev_t device, struct file *fp, int start_block)) /* Try ext2 */ if (ext2sb->s_magic == cpu_to_le16(EXT2_SUPER_MAGIC)) { printk(KERN_NOTICE - "RAMDISK: Ext2 filesystem found at block %d\n", + "RAMDISK: ext2 filesystem found at block %d\n", start_block); nblocks = le32_to_cpu(ext2sb->s_blocks_count); goto done; } printk(KERN_NOTICE - "RAMDISK: Couldn't find valid ramdisk image starting at %d.\n", + "RAMDISK: Couldn't find valid RAM disk image starting at %d.\n", start_block); done: @@ -430,7 +431,7 @@ done: } /* - * This routine loads in the ramdisk image. + * This routine loads in the RAM disk image. */ __initfunc(static void rd_load_image(kdev_t device,int offset)) { @@ -480,7 +481,7 @@ __initfunc(static void rd_load_image(kdev_t device,int offset)) #else printk(KERN_NOTICE "RAMDISK: Kernel does not support compressed " - "ramdisk images\n"); + "RAM disk images\n"); #endif goto done; } @@ -564,7 +565,7 @@ __initfunc(void rd_load(void)) floppy_eject(); #endif printk(KERN_NOTICE - "VFS: Insert root floppy disk to be loaded into ramdisk and press ENTER\n"); + "VFS: Insert root floppy disk to be loaded into RAM disk and press ENTER\n"); wait_for_keypress(); } diff --git a/drivers/block/xd.c b/drivers/block/xd.c index 91c78deb9a50..ffb1645ac23b 100644 --- a/drivers/block/xd.c +++ b/drivers/block/xd.c @@ -240,7 +240,7 @@ __initfunc(static void xd_geninit (struct gendisk *ignored)) } if (xd_drives) { - if (!request_irq(xd_irq,xd_interrupt_handler, 0, "XT harddisk", NULL)) { + if (!request_irq(xd_irq,xd_interrupt_handler, 0, "XT hard disk", NULL)) { if (request_dma(xd_dma,"xd")) { printk("xd: unable to get DMA%d\n",xd_dma); free_irq(xd_irq, NULL); diff --git a/drivers/char/ChangeLog b/drivers/char/ChangeLog index 7a66351e85c1..eddd9e674639 100644 --- a/drivers/char/ChangeLog +++ b/drivers/char/ChangeLog @@ -33,13 +33,13 @@ Sat Nov 22 07:53:36 1997 Theodore Ts'o it. * serial.c (autoconfig): Change 16750 test to hopefully eliminate - false results by people with strange 16550A's being - detected as 16750's. Hopefully 16750's will still be - detected as 16750, and other wierd UART's won't get poorly + false results by people with strange 16550As being + detected as 16750s. Hopefully 16750s will still be + detected as 16750, and other weird UARTs won't get poorly autodetected. If this doesn't work, I'll have to disable - the auto identification for the 16750.... + the auto identification for the 16750. - * tty_io.c (tty_hangup): Now do actually do the tty hangup + * tty_io.c (tty_hangup): Now actually do the tty hangup processing during the timer processing, and disable interrupts while doing the hangup processing. This avoids several nasty race conditions which happened when the @@ -129,7 +129,7 @@ Wed Feb 12 14:50:44 1997 Theodore Ts'o * serial.c: Update routines to use the new 2.1 memory access routines. -Wed Dec 4 07:51:52 1996 Theodre Ts'o +Wed Dec 4 07:51:52 1996 Theodore Ts'o * serial.c (change_speed): Use save_flags(); cli() and restore_flags() in order to ensure we don't accidentally @@ -139,7 +139,7 @@ Wed Dec 4 07:51:52 1996 Theodre Ts'o should be off this whole time, but we eventually will want to reduce this window. -Thu Nov 21 10:05:22 1996 Theodre Ts'o +Thu Nov 21 10:05:22 1996 Theodore Ts'o * tty_ioctl.c (tty_wait_until_sent): Always check the driver wait_until_ready routine, even if there are no characters @@ -174,7 +174,7 @@ Thu Nov 21 10:05:22 1996 Theodre Ts'o DTR and RTS. DTR and RTS are only be changed on the transition to or from the B0 state. (rs_close): Wait for the characters to drain based on - info->timeout. At low baud rates (50bps), it may take a + info->timeout. At low baud rates (50 bps), it may take a long time for the FIFO to completely drain out! (rs_wait_until_sent): Fixed timeout handling. Now releases control to the scheduler, but checks frequently diff --git a/drivers/char/Makefile b/drivers/char/Makefile index 6042de90a750..3cd922ab7008 100644 --- a/drivers/char/Makefile +++ b/drivers/char/Makefile @@ -27,6 +27,9 @@ ifdef CONFIG_VT L_OBJS += console.o vt.o vc_screen.o consolemap.o consolemap_deftbl.o LX_OBJS += selection.o endif +ifdef CONFIG_FB + LX_OBJS += fbmem.o +endif ifeq ($(CONFIG_SERIAL),y) ifndef CONFIG_SUN_SERIAL @@ -431,14 +434,6 @@ else endif endif -ifdef CONFIG_VT - ifdef CONFIG_TGA_CONSOLE - L_OBJS += tga.o - endif - ifdef CONFIG_VGA_CONSOLE - L_OBJS += vga.o vesa_blank.o - endif -endif ifeq ($(CONFIG_HFMODEM),y) ALL_SUB_DIRS += hfmodem diff --git a/drivers/char/console.c b/drivers/char/console.c index f5c8158fbf30..e326b968724b 100644 --- a/drivers/char/console.c +++ b/drivers/char/console.c @@ -8,17 +8,18 @@ * * This module exports the console io functions: * - * 'void do_keyboard_interrupt(void)' - * * 'int vc_allocate(unsigned int console)' * 'int vc_cons_allocated(unsigned int console)' * 'int vc_resize(unsigned long lines, unsigned long cols)' + * 'int vc_resize_con(unsigned long lines, unsigned long cols, + * unsigned int currcons)' * 'void vc_disallocate(unsigned int currcons)' * * 'unsigned long con_init(unsigned long)' * 'int con_open(struct tty_struct *tty, struct file * filp)' * 'void con_write(struct tty_struct * tty)' - * 'void vt_console_print(const char * b)' + * 'void vt_console_print(struct console *co, const char * b, + * unsigned count)' * 'void update_screen(int new_console)' * * 'void do_blank_screen(int)' @@ -61,8 +62,141 @@ * redirection by Martin Mares 19-Nov-95 * * APM screenblank bug fixed Takashi Manabe + * + * Merge with the abstract console driver by Geert Uytterhoeven + * , Jan 1997. + * + * Original m68k console driver modifications by + * + * - Arno Griffioen + * - David Carter + * + * Note that the abstract console driver allows all consoles to be of + * potentially different sizes, so the following variables depend on the + * current console (currcons): + * + * - video_num_columns + * - video_num_lines + * - video_size_row + * - video_screen_size + * - can_do_color + * + * The abstract console driver provides a generic interface for a text + * console. It supports VGA text mode, frame buffer based graphical consoles + * and special graphics processors that are only accessible through some + * registers (e.g. a TMS340x0 GSP). + * + * The interface to the hardware is specified using a special structure + * (struct consw) which contains function pointers to the following + * operations: + * + * unsigned long con_startup(unsigned long kmem_start, + * const char **display_desc) + * void con_init(struct vc_data *conp) + * int con_deinit(struct vc_data *conp) + * int con_clear(struct vc_data *conp, int sy, int sx, int height, + * int width) + * int con_putc(struct vc_data *conp, int c, int y, int x) + * int con_putcs(struct vc_data *conp, const char *s, int count, int y, + * int x) + * int con_cursor(struct vc_data *conp, int mode) + * int con_scroll(struct vc_data *conp, int t, int b, int dir, int count) + * int con_bmove(struct vc_data *conp, int sy, int sx, int dy, int dx, + * int height, int width) + * int con_switch(struct vc_data *conp) + * int con_blank(int blank) + * int con_get_font(struct vc_data *conp, int *w, int *h, char *data) + * int con_set_font(struct vc_data *conp, int w, int h, char *data) + * int con_set_palette(struct vc_data *conp, unsigned char *table) + * int con_scrolldelta(struct vc_data *conp, int lines) + * + * Support for changeable cursor shape + * by Pavel Machek , August 1997 + * + * Ported to i386 and con_scrolldelta fixed + * by Emmanuel Marty , April 1998 */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef CONFIG_APM +#include +#endif + +#include +#include +#include +#include + +#ifndef CONFIG_ABSCON_COMPAT +#define INCLUDE_LINUX_LOGO_DATA +#endif +#include + +#include "console_macros.h" + + +struct consw *conswitchp = NULL; + +int (*console_show_logo)(void) __initdata = NULL; + +static int vesa_blank_mode = 0; /* 0:none 1:suspendV 2:suspendH 3:powerdown */ + +static inline void hide_cursor(int currcons) +{ + sw->con_cursor(vc_cons[currcons].d,CM_ERASE); +} + +void set_cursor(int currcons) +{ + if (currcons != fg_console || console_blanked || vcmode == KD_GRAPHICS) + return; + if (deccm) + sw->con_cursor(vc_cons[currcons].d,CM_DRAW); + else + hide_cursor(currcons); +} + + /* + * Adjust the screen to fit a font of a certain height + * + * Returns < 0 for error, 0 if nothing changed, and the number + * of lines on the adjusted console if changed. + */ + +int con_adjust_height(unsigned long fontheight) +{ + int currcons = fg_console; + /* ++Geert: Always assume that the number of lines did change? */ + return video_num_lines; +} + +/* dummy functions */ + +void no_scroll(char *str, int *ints) +{ +} + + #define BLANK 0x0020 /* A bitmap for codes <32. A bit of 1 indicates that the code @@ -86,45 +220,10 @@ * interrupt, as we use trap-gates. Hopefully all is well. */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#ifdef CONFIG_APM -#include -#endif - -#include -#include -#include -#include - -#include -#include -#include -#include -#include - #ifndef MIN #define MIN(a,b) ((a) < (b) ? (a) : (b)) #endif -#ifdef __sparc__ -int serial_console; -#endif - struct tty_driver console_driver; static int console_refcount; static struct tty_struct *console_table[MAX_NR_CONSOLES]; @@ -134,56 +233,30 @@ unsigned short *vc_scrbuf[MAX_NR_CONSOLES]; struct vc vc_cons [MAX_NR_CONSOLES]; static int con_open(struct tty_struct *, struct file *); -static void con_setsize(unsigned long rows, unsigned long cols); static void vc_init(unsigned int console, unsigned long rows, unsigned long cols, int do_clear); -extern void get_scrmem(int currcons); -extern void set_scrmem(int currcons, long offset); -static void set_origin(int currcons); static void blank_screen(void); static void unblank_screen(void); extern void change_console(unsigned int); extern void poke_blanked_console(void); +static void update_attr(int currcons); static void gotoxy(int currcons, int new_x, int new_y); static void save_cur(int currcons); -extern void set_cursor(int currcons); -extern void hide_cursor(void); static void reset_terminal(int currcons, int do_clear); extern void reset_vc(unsigned int new_console); extern void vt_init(void); extern void set_vesa_blanking(unsigned long arg); extern void vesa_blank(void); -extern void vesa_unblank(void); extern void vesa_powerdown(void); extern void compute_shiftstate(void); extern void reset_palette(int currcons); extern void set_palette(void); -extern int con_is_present(void); -extern unsigned long con_type_init(unsigned long, const char **); -extern void con_type_init_finish(void); -extern int set_get_cmap(unsigned char *, int); -extern int set_get_font(unsigned char *, int, int); -extern void rs_cons_hook(int chip, int out, int channel); - -/* Description of the hardware situation */ -unsigned char video_type; /* Type of display being used */ -unsigned long video_mem_base; /* Base of video memory */ -unsigned long video_mem_term; /* End of video memory */ -unsigned short video_port_reg; /* Video register select port */ -unsigned short video_port_val; /* Video register value port */ -unsigned long video_num_columns; /* Number of text columns */ -unsigned long video_num_lines; /* Number of text lines */ -unsigned long video_size_row; -unsigned long video_screen_size; - -int can_do_color = 0; + static int printable = 0; /* Is console ready for printing? */ int video_mode_512ch = 0; /* 512-character mode */ unsigned long video_font_height; /* Height of current screen font */ unsigned long video_scan_lines; /* Number of scan lines on screen */ -static unsigned long default_font_height; /* Height of default screen font */ -int video_font_is_default = 1; static unsigned short console_charmask = 0x0ff; /* used by kbd_bh - set by keyboard_interrupt */ @@ -191,7 +264,8 @@ static unsigned short console_charmask = 0x0ff; int console_blanked = 0; static int blankinterval = 10*60*HZ; static int vesa_off_interval = 0; -static long blank_origin, blank__origin, unblank_origin; + +static char putcs_buf[256]; /* * fg_console is the current virtual console, @@ -204,161 +278,58 @@ int last_console = 0; int want_console = -1; int kmsg_redirect = 0; -#ifdef CONFIG_SERIAL_ECHO - -#include - -extern int serial_echo_init (int base); -extern int serial_echo_print (const char *s); - -/* - * this defines the address for the port to which printk echoing is done - * when CONFIG_SERIAL_ECHO is defined - */ -#define SERIAL_ECHO_PORT 0x3f8 /* COM1 */ - -static int serial_echo_port = 0; - -#define serial_echo_outb(v,a) outb((v),(a)+serial_echo_port) -#define serial_echo_inb(a) inb((a)+serial_echo_port) - -#define BOTH_EMPTY (UART_LSR_TEMT | UART_LSR_THRE) - -/* Wait for transmitter & holding register to empty */ -#define WAIT_FOR_XMITR \ - do { \ - lsr = serial_echo_inb(UART_LSR); \ - } while ((lsr & BOTH_EMPTY) != BOTH_EMPTY) - -/* These two functions abstract the actual communications with the - * debug port. This is so we can change the underlying communications - * mechanism without modifying the rest of the code. - */ -int -serial_echo_print(const char *s) -{ - int lsr, ier; - int i; - - if (!serial_echo_port) return (0); - - /* - * First save the IER then disable the interrupts - */ - ier = serial_echo_inb(UART_IER); - serial_echo_outb(0x00, UART_IER); - - /* - * Now, do each character - */ - for (i = 0; *s; i++, s++) { - WAIT_FOR_XMITR; - - /* Send the character out. */ - serial_echo_outb(*s, UART_TX); - - /* if a LF, also do CR... */ - if (*s == 10) { - WAIT_FOR_XMITR; - serial_echo_outb(13, UART_TX); - } - } - - /* - * Finally, Wait for transmitter & holding register to empty - * and restore the IER - */ - do { - lsr = serial_echo_inb(UART_LSR); - } while ((lsr & BOTH_EMPTY) != BOTH_EMPTY); - serial_echo_outb(ier, UART_IER); - - return (0); -} - - -int -serial_echo_init(int base) +int vc_cons_allocated(unsigned int i) { - int comstat, hi, lo; - - if (base != 0x2f8 && base != 0x3f8) { - serial_echo_port = 0; - return (0); - } else - serial_echo_port = base; - - /* - * read the Divisor Latch - */ - comstat = serial_echo_inb(UART_LCR); - serial_echo_outb(comstat | UART_LCR_DLAB, UART_LCR); - hi = serial_echo_inb(UART_DLM); - lo = serial_echo_inb(UART_DLL); - serial_echo_outb(comstat, UART_LCR); - - /* - * now do hardwired init - */ - serial_echo_outb(0x03, UART_LCR); /* No parity, 8 data bits, 1 stop */ - serial_echo_outb(0x83, UART_LCR); /* Access divisor latch */ - serial_echo_outb(0x00, UART_DLM); /* 9600 baud */ - serial_echo_outb(0x0c, UART_DLL); - serial_echo_outb(0x03, UART_LCR); /* Done with divisor */ - - /* Prior to disabling interrupts, read the LSR and RBR - * registers - */ - comstat = serial_echo_inb(UART_LSR); /* COM? LSR */ - comstat = serial_echo_inb(UART_RX); /* COM? RBR */ - serial_echo_outb(0x00, UART_IER); /* Disable all interrupts */ - - return(0); + return (i < MAX_NR_CONSOLES && vc_cons[i].d); } -#endif /* CONFIG_SERIAL_ECHO */ - -int vc_cons_allocated(unsigned int i) +void visual_init(int currcons) { - return (i < MAX_NR_CONSOLES && vc_cons[i].d); + /* ++Geert: sw->con_init determines console size */ + sw = conswitchp; + cons_num = currcons; + sw->con_init(vc_cons[currcons].d); + video_size_row = video_num_columns<<1; + video_screen_size = video_num_lines*video_size_row; } -int vc_allocate(unsigned int i) /* return 0 on success */ +int vc_allocate(unsigned int currcons) /* return 0 on success */ { - if (i >= MAX_NR_CONSOLES) + if (currcons >= MAX_NR_CONSOLES) return -ENXIO; - if (!vc_cons[i].d) { + if (!vc_cons[currcons].d) { long p, q; /* prevent users from taking too much memory */ - if (i >= MAX_NR_USER_CONSOLES && !capable(CAP_SYS_RESOURCE)) + if (currcons >= MAX_NR_USER_CONSOLES && !capable(CAP_SYS_RESOURCE)) return -EPERM; /* due to the granularity of kmalloc, we waste some memory here */ /* the alloc is done in two steps, to optimize the common situation of a 25x80 console (structsize=216, video_screen_size=4000) */ - q = (long) kmalloc(video_screen_size, GFP_KERNEL); - if (!q) - return -ENOMEM; p = (long) kmalloc(structsize, GFP_KERNEL); - if (!p) { - kfree_s((char *) q, video_screen_size); + if (!p) + return -ENOMEM; + vc_cons[currcons].d = (struct vc_data *)p; + vt_cons[currcons] = (struct vt_struct *)(p+sizeof(struct vc_data)); + visual_init(currcons); + q = (long)kmalloc(video_screen_size, GFP_KERNEL); + if (!q) { + kfree_s((char *) p, structsize); + vc_cons[currcons].d = NULL; + vt_cons[currcons] = NULL; return -ENOMEM; } - - vc_cons[i].d = (struct vc_data *) p; - p += sizeof(struct vc_data); - vt_cons[i] = (struct vt_struct *) p; - vc_scrbuf[i] = (unsigned short *) q; - vc_cons[i].d->vc_kmalloced = 1; - vc_cons[i].d->vc_screenbuf_size = video_screen_size; - vc_init (i, video_num_lines, video_num_columns, 1); + vc_scrbuf[currcons] = (unsigned short *) q; + vc_cons[currcons].d->vc_kmalloced = 1; + vc_cons[currcons].d->vc_screenbuf_size = video_screen_size; + vc_init(currcons, video_num_lines, video_num_columns, 1); } return 0; } /* - * Change # of rows and columns (0 means unchanged) + * Change # of rows and columns (0 means unchanged/the size of fg_console) * [this is to be used together with some user program * like resize that changes the hardware videomode] */ @@ -367,7 +338,7 @@ int vc_resize(unsigned long lines, unsigned long cols) unsigned long cc, ll, ss, sr; unsigned long occ, oll, oss, osr; unsigned short *p; - unsigned int currcons, i; + unsigned int currcons = fg_console, i; unsigned short *newscreens[MAX_NR_CONSOLES]; long ol, nl, rlth, rrem; @@ -376,9 +347,6 @@ int vc_resize(unsigned long lines, unsigned long cols) sr = cc << 1; ss = sr * ll; - if (ss > video_mem_term - video_mem_base) - return -ENOMEM; - /* * Some earlier version had all consoles of potentially * different sizes, but that was really messy. @@ -400,22 +368,20 @@ int vc_resize(unsigned long lines, unsigned long cols) } } - get_scrmem(fg_console); - - oll = video_num_lines; - occ = video_num_columns; - osr = video_size_row; - oss = video_screen_size; - - video_num_lines = ll; - video_num_columns = cc; - video_size_row = sr; - video_screen_size = ss; - for (currcons = 0; currcons < MAX_NR_CONSOLES; currcons++) { if (!vc_cons_allocated(currcons)) continue; + oll = video_num_lines; + occ = video_num_columns; + osr = video_size_row; + oss = video_screen_size; + + video_num_lines = ll; + video_num_columns = cc; + video_size_row = sr; + video_screen_size = ss; + rlth = MIN(osr, sr); rrem = sr - rlth; ol = origin; @@ -423,6 +389,7 @@ int vc_resize(unsigned long lines, unsigned long cols) if (ll < oll) ol += (oll - ll) * osr; + update_attr(currcons); while (ol < scr_end) { memcpyw((unsigned short *) nl, (unsigned short *) ol, rlth); if (rrem) @@ -432,7 +399,7 @@ int vc_resize(unsigned long lines, unsigned long cols) } if (kmalloced) - kfree_s(vc_scrbuf[currcons], screenbuf_size); + kfree_s(vc_scrbuf[currcons], oss); vc_scrbuf[currcons] = newscreens[currcons]; kmalloced = 1; screenbuf_size = ss; @@ -450,16 +417,110 @@ int vc_resize(unsigned long lines, unsigned long cols) save_cur(currcons); } - set_scrmem(fg_console, 0); - set_origin(fg_console); + /* don't update in graphics mode */ + if (currcons == fg_console && vt_cons[fg_console]->vc_mode == KD_TEXT) + update_screen(fg_console); + set_cursor(fg_console); return 0; } +/* + * ++Geert: Change # of rows and columns for one specific console. + * Of course it's not messy to have all consoles of potentially different + * sizes, except on PCish hardware :-) + */ +void vc_resize_con(unsigned long lines, unsigned long cols, + unsigned int currcons) +{ + unsigned long cc, ll, ss, sr; + unsigned long occ, oll, oss, osr; + unsigned short *newscreen; + long ol, nl, rlth, rrem; + + if (!cols || !lines || currcons >= MAX_NR_CONSOLES) + return; + + cc = cols; + ll = lines; + sr = cc << 1; + ss = sr * ll; + + if (!vc_cons_allocated(currcons)) + newscreen = 0; + else if (!(newscreen = (unsigned short *)kmalloc(ss, GFP_USER))) + return; + + if (vc_cons_allocated(currcons)) { + oll = video_num_lines; + occ = video_num_columns; + osr = video_size_row; + oss = video_screen_size; + + video_num_lines = ll; + video_num_columns = cc; + video_size_row = sr; + video_screen_size = ss; + + rlth = MIN(osr, sr); + rrem = sr - rlth; + ol = origin; + nl = (long) newscreen; + if (ll < oll) + ol += (oll - ll) * osr; + + /* ++Geert: TODO: Because the attributes have different meanings + for monochrome and color, they should really be converted if + can_do_color changes... */ + update_attr(currcons); + while (ol < scr_end) { + memcpyw((unsigned short *) nl, (unsigned short *) ol, rlth); + if (rrem) + memsetw((void *)(nl + rlth), video_erase_char, rrem); + ol += osr; + nl += sr; + } + + if (kmalloced) + kfree_s(vc_scrbuf[currcons], oss); + vc_scrbuf[currcons] = newscreen; + kmalloced = 1; + screenbuf_size = ss; + + origin = video_mem_start = (long) vc_scrbuf[currcons]; + scr_end = video_mem_end = video_mem_start + ss; + + if (scr_end > nl) + memsetw((void *) nl, video_erase_char, scr_end - nl); + + /* do part of a reset_terminal() */ + top = 0; + bottom = video_num_lines; + gotoxy(currcons, x, y); + save_cur(currcons); + + if (console_table[currcons]) { + struct winsize ws, *cws = &console_table[currcons]->winsize; + ws.ws_row = video_num_lines; + ws.ws_col = video_num_columns; + if ((ws.ws_row != cws->ws_row || ws.ws_col != cws->ws_col) && + console_table[currcons]->pgrp > 0) + kill_pg(console_table[currcons]->pgrp, SIGWINCH, 1); + *cws = ws; + } + } + + /* don't update in graphics mode */ + if (currcons == fg_console && vt_cons[fg_console]->vc_mode == KD_TEXT) + update_screen(fg_console); +} + + void vc_disallocate(unsigned int currcons) { if (vc_cons_allocated(currcons)) { + sw->con_deinit(vc_cons[currcons].d); if (kmalloced) kfree_s(vc_scrbuf[currcons], screenbuf_size); if (currcons >= MIN_NR_CONSOLES) @@ -490,7 +551,7 @@ unsigned char color_table[] = { 0, 4, 2, 6, 1, 5, 3, 7, /* the default colour table, for VGA+ colour systems */ int default_red[] = {0x00,0xaa,0x00,0xaa,0x00,0xaa,0x00,0xaa, 0x55,0xff,0x55,0xff,0x55,0xff,0x55,0xff}; -int default_grn[] = {0x00,0x00,0xaa,0x55,0x00,0x00,0xaa,0xaa, +int default_grn[] = {0x00,0x00,0xaa,0xaa,0x00,0x00,0xaa,0xaa, 0x55,0x55,0xff,0xff,0x55,0x55,0xff,0xff}; int default_blu[] = {0x00,0x00,0x00,0x00,0xaa,0xaa,0xaa,0xaa, 0x55,0x55,0x55,0x55,0xff,0xff,0xff,0xff}; @@ -537,58 +598,16 @@ static void gotoxay(int currcons, int new_x, int new_y) /* * Hardware scrollback support */ -extern void __set_origin(unsigned short); -unsigned short __real_origin; /* offset of non-scrolled screen */ -unsigned short __origin; /* offset of currently displayed screen */ -unsigned char has_wrapped; /* all of videomem is data of fg_console */ -static unsigned char hardscroll_enabled; -static unsigned char hardscroll_disabled_by_init = 0; - -void no_scroll(char *str, int *ints) +static inline void scrolldelta(int lines) { - /* - * Disabling scrollback is required for the Braillex ib80-piezo - * Braille reader made by F.H. Papenmeier (Germany). - * Use the "no-scroll" bootflag. - */ - hardscroll_disabled_by_init = 1; - hardscroll_enabled = 0; -} - -static void scrolldelta(int lines) -{ - int new_origin; - int last_origin_rel = (((video_mem_term - video_mem_base) - / video_num_columns / 2) - (video_num_lines - 1)) * video_num_columns; - - new_origin = __origin + lines * video_num_columns; - if (__origin > __real_origin) - new_origin -= last_origin_rel; - if (new_origin < 0) { - int s_top = __real_origin + video_num_lines*video_num_columns; - new_origin += last_origin_rel; - if (new_origin < s_top) - new_origin = s_top; - if (new_origin > last_origin_rel - video_num_columns - || has_wrapped == 0) - new_origin = 0; - else { - unsigned short * d = (unsigned short *) video_mem_base; - unsigned short * s = d + last_origin_rel; - int count = (video_num_lines-1)*video_num_columns; - while (count) { - count--; - scr_writew(scr_readw(d++),s++); - } - } - } else if (new_origin > __real_origin) - new_origin = __real_origin; - - __set_origin(new_origin); + int currcons = fg_console; + sw->con_scrolldelta(vc_cons[currcons].d, lines); } void scrollback(int lines) { + int currcons = fg_console; + if (!lines) lines = video_num_lines/2; scrolldelta(-lines); @@ -596,80 +615,31 @@ void scrollback(int lines) void scrollfront(int lines) { + int currcons = fg_console; + if (!lines) lines = video_num_lines/2; scrolldelta(lines); } -static void set_origin(int currcons) -{ - if (video_type != VIDEO_TYPE_EGAC && video_type != VIDEO_TYPE_VGAC - && video_type != VIDEO_TYPE_EGAM) - return; - if (currcons != fg_console || console_blanked || vcmode == KD_GRAPHICS) - return; - __real_origin = (origin-video_mem_base) >> 1; - __set_origin(__real_origin); -} - -static void scrup(int currcons, unsigned int t, unsigned int b, unsigned int nr) +static void scrup(int currcons, unsigned int t, unsigned int b, int nr) { - int hardscroll = hardscroll_enabled; + unsigned short *d, *s; if (t+nr >= b) nr = b - t - 1; if (b > video_num_lines || t >= b || nr < 1) return; - if (t || b != video_num_lines || nr > 1) - hardscroll = 0; - if (hardscroll) { - origin += video_size_row; - pos += video_size_row; - scr_end += video_size_row; - if (scr_end > video_mem_end) { - unsigned short * d = (unsigned short *) video_mem_start; - unsigned short * s = (unsigned short *) origin; - unsigned int count; - - count = (video_num_lines-1)*video_num_columns; - while (count) { - count--; - scr_writew(scr_readw(s++),d++); - } - count = video_num_columns; - while (count) { - count--; - scr_writew(video_erase_char, d++); - } - scr_end -= origin-video_mem_start; - pos -= origin-video_mem_start; - origin = video_mem_start; - has_scrolled = 1; - if (currcons == fg_console) - has_wrapped = 1; - } else { - unsigned short * d; - unsigned int count; - - d = (unsigned short *) (scr_end - video_size_row); - count = video_num_columns; - while (count) { - count--; - scr_writew(video_erase_char, d++); - } - } - set_origin(currcons); - } else { - unsigned short * d = (unsigned short *) (origin+video_size_row*t); - unsigned short * s = (unsigned short *) (origin+video_size_row*(t+nr)); - - memcpyw(d, s, (b-t-nr) * video_size_row); - memsetw(d + (b-t-nr) * video_num_columns, video_erase_char, video_size_row*nr); - } + d = (unsigned short *) (origin+video_size_row*t); + s = (unsigned short *) (origin+video_size_row*(t+nr)); + memcpyw(d, s, (b-t-nr) * video_size_row); + memsetw(d + (b-t-nr) * video_num_columns, video_erase_char, video_size_row*nr); + if (currcons == fg_console) + sw->con_scroll(vc_cons[currcons].d, t, b, SM_UP, nr); } static void -scrdown(int currcons, unsigned int t, unsigned int b, unsigned int nr) +scrdown(int currcons, unsigned int t, unsigned int b, int nr) { unsigned short *s; unsigned int count; @@ -686,42 +656,14 @@ scrdown(int currcons, unsigned int t, unsigned int b, unsigned int nr) memcpyw(s + step, s, video_size_row); s -= video_num_columns; } - while (nr--) { + count = nr; + while (count--) { s += video_num_columns; memsetw(s, video_erase_char, video_size_row); } has_scrolled = 1; -} - -/* - * Routine to reset the visible "screen" to the top of video memory. - * This is necessary when exiting from the kernel back to a console - * which expects only the top of video memory to be used for the visible - * screen (with scrolling down by moving the memory contents). - * The normal action of the LINUX console is to scroll using all of the - * video memory and diddling the hardware top-of-video register as needed. - */ -void -scrreset(void) -{ - int currcons = fg_console; - unsigned short * d = (unsigned short *) video_mem_start; - unsigned short * s = (unsigned short *) origin; - unsigned int count; - - count = (video_num_lines-1)*video_num_columns; - memcpyw(d, s, 2*count); - memsetw(d + count, video_erase_char, - 2*video_num_columns); - scr_end -= origin-video_mem_start; - pos -= origin-video_mem_start; - origin = video_mem_start; - - has_scrolled = 1; - has_wrapped = 1; - - set_origin(currcons); - set_cursor(currcons); + if (currcons == fg_console) + sw->con_scroll(vc_cons[currcons].d, t, b, SM_DOWN, nr); } static void lf(int currcons) @@ -730,7 +672,7 @@ static void lf(int currcons) * if below scrolling region */ if (y+1 == bottom) - scrup(currcons,top,bottom, 1); + scrup(currcons,top,bottom,1); else if (y < video_num_lines-1) { y++; pos += video_size_row; @@ -781,14 +723,33 @@ static void csi_J(int currcons, int vpar) case 0: /* erase from cursor to end of display */ count = (scr_end-pos)>>1; start = (unsigned short *) pos; + if (currcons == fg_console) { + /* do in two stages */ + sw->con_clear(vc_cons[currcons].d, y, x, 1, + video_num_columns-x); + sw->con_clear(vc_cons[currcons].d, y+1, 0, + video_num_lines-y-1, + video_num_columns); + } break; case 1: /* erase from start to cursor */ count = ((pos-origin)>>1)+1; start = (unsigned short *) origin; + if (currcons == fg_console) { + /* do in two stages */ + sw->con_clear(vc_cons[currcons].d, 0, 0, y, + video_num_columns); + sw->con_clear(vc_cons[currcons].d, y, 0, 1, + x + 1); + } break; case 2: /* erase whole display */ count = video_num_columns * video_num_lines; start = (unsigned short *) origin; + if (currcons == fg_console) + sw->con_clear(vc_cons[currcons].d, 0, 0, + video_num_lines, + video_num_columns); break; default: return; @@ -806,14 +767,23 @@ static void csi_K(int currcons, int vpar) case 0: /* erase from cursor to end of line */ count = video_num_columns-x; start = (unsigned short *) pos; + if (currcons == fg_console) + sw->con_clear(vc_cons[currcons].d, y, x, 1, + video_num_columns-x); break; case 1: /* erase from start of line to cursor */ start = (unsigned short *) (pos - (x<<1)); count = x+1; + if (currcons == fg_console) + sw->con_clear(vc_cons[currcons].d, y, 0, 1, + x + 1); break; case 2: /* erase whole line */ start = (unsigned short *) (pos - (x<<1)); count = video_num_columns; + if (currcons == fg_console) + sw->con_clear(vc_cons[currcons].d, y, 0, 1, + video_num_columns); break; default: return; @@ -824,16 +794,43 @@ static void csi_K(int currcons, int vpar) static void csi_X(int currcons, int vpar) /* erase the following vpar positions */ { /* not vt100? */ + int count; + if (!vpar) vpar++; + count = (vpar > video_num_columns-x) ? (video_num_columns-x) : vpar; - memsetw((unsigned short *) pos, video_erase_char, - (vpar > video_num_columns-x) ? 2 * (video_num_columns-x) : 2 * vpar); + memsetw((unsigned short *) pos, video_erase_char, 2 * count); + if (currcons == fg_console) + sw->con_clear(vc_cons[currcons].d, y, x, 1, count); need_wrap = 0; } static void update_attr(int currcons) { +/* + * ++roman: I completely changed the attribute format for monochrome + * mode (!can_do_color). The formerly used MDA (monochrome display + * adapter) format didn't allow the combination of certain effects. + * Now the attribute is just a bit vector: + * Bit 0..1: intensity (0..2) + * Bit 2 : underline + * Bit 3 : reverse + * Bit 7 : blink + * + * ++Geert: TODO: Because the attributes have different meanings + * for monochrome and color, they should really be converted if + * can_do_color changes... + */ + if (!can_do_color) { + /* Special treatment for monochrome */ + attr = intensity | + (underline ? 4 : 0) | + ((reverse ^ decscnm) ? 8 : 0) | + (blink ? 0x80 : 0); + video_erase_char = ' ' | ((reverse ^ decscnm) ? 0x800 : 0); + return; + } attr = color; if (can_do_color) { if (underline) @@ -847,12 +844,6 @@ static void update_attr(int currcons) attr ^= 0x80; if (intensity == 2) attr ^= 0x08; - if (!can_do_color) { - if (underline) - attr = (attr & 0xf8) | 0x01; - else if (intensity == 0) - attr = (attr & 0xf0) | 0x08; - } if (decscnm) video_erase_char = (reverse_video_char(color) << 8) | ' '; else @@ -1060,31 +1051,57 @@ int tioclinux(struct tty_struct *tty, unsigned long arg) static inline unsigned short *screenpos(int currcons, int offset, int viewed) { unsigned short *p = (unsigned short *)(origin + offset); - if (viewed && currcons == fg_console) - p -= (__real_origin - __origin); return p; } +static inline void visual_putc_attr(int currcons, unsigned short new, + int yy, int xx) +{ + unsigned short oldattr = attr; + attr = new >> 8; + sw->con_putc(vc_cons[currcons].d, new & 0xff, yy, xx); + attr = oldattr; +} + +static inline void visual_putc_attr_next(int currcons, unsigned short new, + int *yy, int *xx) +{ + attr = new >> 8; + sw->con_putc(vc_cons[currcons].d, new & 0xff, *yy, *xx); + if (++(*xx) == video_num_columns) + *xx = 0, ++(*yy); +} + + /* Note: inverting the screen twice should revert to the original state */ void invert_screen(int currcons, int offset, int count, int viewed) { unsigned short *p; + int xx = (offset >> 1) % video_num_columns; + int yy = (offset >> 1) / video_num_columns; + unsigned short oldattr = attr; count /= 2; p = screenpos(currcons, offset, viewed); if (can_do_color) while (count--) { unsigned short old = scr_readw(p); - scr_writew(reverse_video_short(old), p); + unsigned short new = reverse_video_short(old); + scr_writew(new, p); p++; + if (currcons == fg_console) + visual_putc_attr_next(currcons, new, &yy, &xx); } else while (count--) { unsigned short old = scr_readw(p); - scr_writew(old ^ (((old & 0x0700) == 0x0100) - ? 0x7000 : 0x7700), p); + unsigned short new = reverse_video_short_mono(old); + scr_writew(new, p); p++; + if (currcons == fg_console) + visual_putc_attr_next(currcons, new, &yy, &xx); } + attr = oldattr; } /* used by selection: complement pointer position */ @@ -1092,15 +1109,25 @@ void complement_pos(int currcons, int offset) { static unsigned short *p = NULL; static unsigned short old = 0; + static unsigned short oldx = 0, oldy = 0; - if (p) + if (p) { scr_writew(old, p); + if (currcons == fg_console) + visual_putc_attr(currcons, old, oldy, oldx); + } if (offset == -1) p = NULL; else { + unsigned short new; p = screenpos(currcons, offset, 1); old = scr_readw(p); - scr_writew(old ^ 0x7700, p); + oldx = (offset >> 1) % video_num_columns; + oldy = (offset >> 1) / video_num_columns; + new = complement_video_short(old); + scr_writew(new, p); + if (currcons == fg_console) + visual_putc_attr(currcons, new, oldy, oldx); } } @@ -1261,9 +1288,18 @@ static void insert_char(int currcons, unsigned int nr) p = q + video_num_columns - nr - x; while (--p >= q) scr_writew(scr_readw(p), p + nr); - memsetw(q, video_erase_char, nr*2); need_wrap = 0; + if (currcons == fg_console) { + unsigned short oldattr = attr; + sw->con_bmove(vc_cons[currcons].d,y,x,y,x+nr,1, + video_num_columns-x-nr); + attr = video_erase_char >> 8; + while (nr--) + sw->con_putc(vc_cons[currcons].d, + (video_erase_char & 0x00ff),y,x+nr); + attr = oldattr; + } } static void insert_line(int currcons, unsigned int nr) @@ -1275,7 +1311,7 @@ static void insert_line(int currcons, unsigned int nr) static void delete_char(int currcons, unsigned int nr) { unsigned int i = x; - unsigned short * p = (unsigned short *) pos; + unsigned short *p = (unsigned short *) pos; while (++i <= video_num_columns - nr) { scr_writew(scr_readw(p+nr), p); @@ -1283,6 +1319,17 @@ static void delete_char(int currcons, unsigned int nr) } memsetw(p, video_erase_char, nr*2); need_wrap = 0; + if (currcons == fg_console) { + unsigned short oldattr = attr; + sw->con_bmove(vc_cons[currcons].d, y, x+nr, y, x, 1, + video_num_columns-x-nr); + attr = video_erase_char >> 8; + while (nr--) + sw->con_putc(vc_cons[currcons].d, + (video_erase_char & 0x00ff), y, + video_num_columns-1-nr); + attr = oldattr; + } } static void delete_line(int currcons, unsigned int nr) @@ -1293,8 +1340,8 @@ static void delete_line(int currcons, unsigned int nr) static void csi_at(int currcons, unsigned int nr) { - if (nr > video_num_columns) - nr = video_num_columns; + if (nr > video_num_columns - x) + nr = video_num_columns - x; else if (!nr) nr = 1; insert_char(currcons, nr); @@ -1302,8 +1349,8 @@ static void csi_at(int currcons, unsigned int nr) static void csi_L(int currcons, unsigned int nr) { - if (nr > video_num_lines) - nr = video_num_lines; + if (nr > video_num_lines - y) + nr = video_num_lines - y; else if (!nr) nr = 1; insert_line(currcons, nr); @@ -1311,8 +1358,8 @@ static void csi_L(int currcons, unsigned int nr) static void csi_P(int currcons, unsigned int nr) { - if (nr > video_num_columns) - nr = video_num_columns; + if (nr > video_num_columns - x) + nr = video_num_columns - x; else if (!nr) nr = 1; delete_char(currcons, nr); @@ -1320,8 +1367,8 @@ static void csi_P(int currcons, unsigned int nr) static void csi_M(int currcons, unsigned int nr) { - if (nr > video_num_lines) - nr = video_num_lines; + if (nr > video_num_lines - y) + nr = video_num_lines - y; else if (!nr) nr=1; delete_line(currcons, nr); @@ -1395,6 +1442,8 @@ static void reset_terminal(int currcons, int do_clear) kbd_table[currcons].ledflagstate = kbd_table[currcons].default_ledflagstate; set_leds(); + cursor_type = CUR_DEFAULT; + default_attr(currcons); update_attr(currcons); @@ -1455,7 +1504,7 @@ static void con_flush_chars(struct tty_struct *tty) currcons = vt->vc_num; if (vcmode != KD_GRAPHICS) set_cursor(currcons); -} +} static int do_con_write(struct tty_struct * tty, int from_user, const unsigned char *buf, int count) @@ -1480,6 +1529,11 @@ static int do_con_write(struct tty_struct * tty, int from_user, return 0; } + /* undraw cursor first */ + if (currcons == fg_console) + hide_cursor(currcons); + + /* clear the selection */ if (currcons == sel_cons) clear_selection(); @@ -1490,7 +1544,7 @@ static int do_con_write(struct tty_struct * tty, int from_user, } disable_bh(CONSOLE_BH); - while (!tty->stopped && count) { + while (count) { enable_bh(CONSOLE_BH); if (from_user) __get_user(c, buf); @@ -1577,12 +1631,93 @@ static int do_con_write(struct tty_struct * tty, int from_user, cr(currcons); lf(currcons); } + + /* DPC: 1994-04-12 + * Speed up overstrike mode, using new putcs. + * + * P.S. I hate 8 spaces per tab! Use Emacs! + */ + + /* Only use this for the foreground console, + where we really draw the chars */ + + if (count > 2 && + !decim && !utf && currcons == fg_console) { + char *p = putcs_buf; + int putcs_count = 1; + ushort nextx = x + 1; + + *p++ = tc; + scr_writew((attr << 8) + tc, + (unsigned short *)pos); + pos+=2; + + if (nextx == video_num_columns) { + sw->con_putc(vc_cons[currcons].d, + *putcs_buf, y, x); + pos-=2; + need_wrap = decawm; + continue; + } + + /* TAB TAB TAB - Arghh!!!! */ + + while (count) { + enable_bh(CONSOLE_BH); + if (from_user) + get_user(c, buf); + else + c = *buf; + disable_bh(CONSOLE_BH); + tc = translate[toggle_meta ? (c|0x80) : c]; + if (!tc || + !(c >= 32 + || !(((disp_ctrl ? CTRL_ALWAYS + : CTRL_ACTION) >> c) & 1))) + break; + tc = conv_uni_to_pc(tc); + if (tc == -4) + tc = conv_uni_to_pc(0xfffd); + else if (tc == -3) + tc = c; + + buf++; n++; count--; + if (tc & ~console_charmask) + continue; /* Conversion failed */ + + *p++ = tc; + scr_writew((attr << 8) + tc, + (unsigned short *)pos); + pos+=2; + ++putcs_count; + ++nextx; + if (nextx == video_num_columns || + putcs_count == sizeof (putcs_buf)) + break; + } + + sw->con_putcs(vc_cons[currcons].d, + putcs_buf, putcs_count, y, x); + if (nextx == video_num_columns) { + pos-=2; + x = video_num_columns-1; + need_wrap = decawm; + } else + x += putcs_count; + continue; + } + + /* DPC: End of putcs support */ + if (decim) insert_char(currcons, 1); scr_writew( video_mode_512ch ? ((attr & 0xf7) << 8) + ((tc & 0x100) << 3) + (tc & 0x0ff) : (attr << 8) + tc, (unsigned short *) pos); + if (currcons == fg_console) + sw->con_putc(vc_cons[currcons].d, tc, y, x); + if (x == video_num_columns - 1) need_wrap = decawm; else { @@ -1760,6 +1895,13 @@ static int do_con_write(struct tty_struct * tty, int from_user, case 'l': set_mode(currcons,0); continue; + case 'c': + if (par[0]) + cursor_type = par[0] | (par[1]<<8) | (par[2]<<16); + else + cursor_type = CUR_DEFAULT; + set_cursor(currcons); + continue; case 'n': if (!ques) { if (par[0] == 5) @@ -1901,6 +2043,11 @@ static int do_con_write(struct tty_struct * tty, int from_user, /* DEC screen alignment test. kludge :-) */ video_erase_char = (video_erase_char & 0xff00) | 'E'; + /* Arno: + * Doesn't work, because csi_J(c,2) + * calls con_clear and doesn't print + * the erase char.. + */ csi_J(currcons, 2); video_erase_char = (video_erase_char & 0xff00) | ' '; @@ -1989,6 +2136,9 @@ void vt_console_print(struct console *co, const char * b, unsigned count) int currcons = fg_console; unsigned char c; static int printing = 0; + const char *start = b; + ushort cnt = 0; + ushort myx = x; #if CONFIG_AP1000 prom_printf(b); @@ -2007,30 +2157,52 @@ void vt_console_print(struct console *co, const char * b, unsigned count) return; } -#ifdef CONFIG_SERIAL_ECHO - serial_echo_print(b); -#endif /* CONFIG_SERIAL_ECHO */ + /* undraw cursor first */ + hide_cursor(currcons); - while (count-- > 0) { - c = *(b++); - if (c == 10 || c == 13 || need_wrap) { + /* Contrived structure to try to emulate original need_wrap behaviour + * Problems caused when we have need_wrap set on '\n' character */ + while (count--) { + c = *b++; + if (c == 10 || c == 13 || c == 8 || need_wrap) { + if ((cnt = b - start - 1) > 0) { + sw->con_putcs(vc_cons[currcons].d, start, cnt, y, x); + x += cnt; + if (need_wrap) + x--; + } + if (c == 8) { /* backspace */ + bs(currcons); + start = b; + myx = x; + continue; + } if (c != 13) lf(currcons); cr(currcons); - if (c == 10 || c == 13) + if (c == 10 || c == 13) { + start = b; + myx = x; continue; - } - if (c == 8) { /* backspace */ - bs(currcons); - continue; + } + start = b-1; + myx = x; } scr_writew((attr << 8) + c, (unsigned short *) pos); - if (x == video_num_columns - 1) { + if (myx == video_num_columns - 1) { need_wrap = 1; continue; } - x++; pos+=2; + myx++; + } + if ((cnt = b - start) > 0) { + sw->con_putcs(vc_cons[currcons].d, start, cnt, y, x); + x += cnt; + if (x == video_num_columns) { + x--; + need_wrap = 1; + } } set_cursor(currcons); poke_blanked_console(); @@ -2101,14 +2273,6 @@ static void vc_init(unsigned int currcons, unsigned long rows, unsigned long col reset_terminal(currcons, do_clear); } -static void con_setsize(unsigned long rows, unsigned long cols) -{ - video_num_lines = rows; - video_num_columns = cols; - video_size_row = 2 * cols; - video_screen_size = video_num_lines * video_size_row; -} - /* * This is the console switching bottom half handler. * @@ -2150,23 +2314,17 @@ static void console_bh(void) */ __initfunc(unsigned long con_init(unsigned long kmem_start)) { - const char *display_desc = "????"; - int currcons = 0; - int orig_x = ORIG_X; - int orig_y = ORIG_Y; + const char *display_desc = NULL; + unsigned int currcons = 0; + char q[2] = { 0, 1 }; -#ifdef __sparc__ - if (serial_console) { + if (conswitchp) + kmem_start = conswitchp->con_startup(kmem_start, + &display_desc); + if (!display_desc) { fg_console = 0; - -#if CONFIG_SUN_SERIAL - rs_cons_hook(0, 0, serial_console); - rs_cons_hook(0, 1, serial_console); -#endif - return kmem_start; } -#endif memset(&console_driver, 0, sizeof(struct tty_driver)); console_driver.magic = TTY_DRIVER_MAGIC; @@ -2201,7 +2359,6 @@ __initfunc(unsigned long con_init(unsigned long kmem_start)) #if CONFIG_AP1000 return(kmem_start); #endif - con_setsize(ORIG_VIDEO_LINES, ORIG_VIDEO_COLS); timer_table[BLANK_TIMER].fn = blank_screen; timer_table[BLANK_TIMER].expires = 0; @@ -2210,14 +2367,6 @@ __initfunc(unsigned long con_init(unsigned long kmem_start)) timer_active |= 1<con_putcs(vc_cons[fg_console].d, linux_logo_banner, + sizeof(linux_logo_banner)-1, q[1]-1, q[0]); + putconsxy(0, q); +#endif + sw->con_cursor(vc_cons[currcons].d, CM_DRAW); + printk("Console: %s %s %ldx%ld", can_do_color ? "colour" : "mono", - display_desc, video_num_columns, video_num_lines, - MIN_NR_CONSOLES, (MIN_NR_CONSOLES == 1) ? "" : "s", - MAX_NR_CONSOLES); - - con_type_init_finish(); + display_desc, video_num_columns, video_num_lines); + printable = 1; + printk("\n"); - /* - * can't register TGA yet, because PCI bus probe has *not* taken - * place before con_init() gets called. Trigger the real TGA hw - * initialization and register_console() event from - * within the bus probing code... :-( - */ #ifdef CONFIG_VT_CONSOLE - if (video_type != VIDEO_TYPE_TGAC && con_is_present()) - register_console(&vt_console_driver); + register_console(&vt_console_driver); #endif init_bh(CONSOLE_BH, console_bh); return kmem_start; } +void set_vesa_blanking(unsigned long arg) +{ + char *argp = (char *)arg + 1; + unsigned int mode; + get_user(mode, argp); + vesa_blank_mode = (mode < 4) ? mode : 0; +} + +void vesa_blank(void) +{ + vc_cons[fg_console].d->vc_sw->con_blank(vesa_blank_mode + 1); +} + +void vesa_powerdown(void) +{ + /* + * Power down if currently suspended (1 or 2), + * suspend if currently blanked (0), + * else do nothing (i.e. already powered down (3)). + * Called only if powerdown features are allowed. + */ + switch (vesa_blank_mode) { + case VESA_NO_BLANKING: + vc_cons[fg_console].d->vc_sw->con_blank(VESA_VSYNC_SUSPEND+1); + break; + case VESA_VSYNC_SUSPEND: + case VESA_HSYNC_SUSPEND: + vc_cons[fg_console].d->vc_sw->con_blank(VESA_POWERDOWN+1); + break; + } +} + void vesa_powerdown_screen(void) { timer_active &= ~(1<vc_mode != KD_TEXT) { + console_blanked = fg_console + 1; + hide_cursor(fg_console); + return; + } if(vesa_off_interval && !nopowersave) { timer_table[BLANK_TIMER].fn = vesa_powerdown_screen; timer_table[BLANK_TIMER].expires = jiffies + vesa_off_interval; @@ -2320,14 +2483,7 @@ void do_blank_screen(int nopowersave) /* try not to lose information by blanking, and not to waste memory */ currcons = fg_console; has_scrolled = 0; - blank__origin = __origin; - blank_origin = origin; - set_origin(fg_console); - get_scrmem(fg_console); - unblank_origin = origin; - memsetw((void *)blank_origin, BLANK, - 2*video_num_lines*video_num_columns); - hide_cursor(); + sw->con_blank(1); console_blanked = fg_console + 1; if(!nopowersave) @@ -2343,9 +2499,6 @@ void do_blank_screen(int nopowersave) void do_unblank_screen(void) { int currcons; - int resetorg; - long offset; - if (!console_blanked) return; if (!vc_cons_allocated(fg_console)) { @@ -2360,28 +2513,11 @@ void do_unblank_screen(void) } currcons = fg_console; - offset = 0; - resetorg = 0; - if (console_blanked == fg_console + 1 && origin == unblank_origin - && !has_scrolled) { - /* try to restore the exact situation before blanking */ - resetorg = 1; - offset = (blank_origin - video_mem_base) - - (unblank_origin - video_mem_start); - } - console_blanked = 0; - set_scrmem(fg_console, offset); - set_origin(fg_console); + if (sw->con_blank(0)) + /* Low-level driver cannot restore -> do it ourselves */ + update_screen(fg_console); set_cursor(fg_console); - if (resetorg) - __set_origin(blank__origin); - - vesa_unblank(); -#ifdef CONFIG_APM - if (apm_display_unblank()) - return; -#endif } /* @@ -2400,9 +2536,13 @@ static void unblank_screen(void) void update_screen(int new_console) { + int currcons = fg_console; + int xx, yy, startx, attr_save; + char *bufp; + unsigned short *p; static int lock = 0; - if (new_console == fg_console || lock) + if (lock) return; if (!vc_cons_allocated(new_console)) { /* strange ... */ @@ -2413,15 +2553,37 @@ void update_screen(int new_console) clear_selection(); - if (!console_blanked) - get_scrmem(fg_console); - else - console_blanked = -1; /* no longer of the form console+1 */ - fg_console = new_console; /* this is the only (nonzero) assignment to fg_console */ - /* consequently, fg_console will always be allocated */ - set_scrmem(fg_console, 0); - set_origin(fg_console); - set_cursor(fg_console); + currcons = fg_console = new_console; + sw->con_cursor (vc_cons[currcons].d, CM_ERASE); + sw->con_switch (vc_cons[new_console].d); + /* Update the screen contents */ + p = (unsigned short *)video_mem_start; + attr_save = attr; + for (yy = 0; yy < video_num_lines; yy++) { + bufp = putcs_buf; + for (startx = xx = 0; xx < video_num_columns; xx++) { + if (attr != ((scr_readw(p) >> 8) & 0xff)) { + if (bufp > putcs_buf) + sw->con_putcs (vc_cons[currcons].d, putcs_buf, + bufp - putcs_buf, yy, startx); + startx = xx; + bufp = putcs_buf; + attr = (scr_readw(p) >> 8) & 0xff; + } + *bufp++ = scr_readw(p++); + if (bufp == putcs_buf + sizeof (putcs_buf)) { + sw->con_putcs (vc_cons[currcons].d, putcs_buf, + bufp - putcs_buf, yy, startx); + startx = xx + 1; + bufp = putcs_buf; + } + } + if (bufp > putcs_buf) + sw->con_putcs (vc_cons[currcons].d, putcs_buf, + bufp - putcs_buf, yy, startx); + } + set_cursor (currcons); + attr = attr_save; set_leds(); compute_shiftstate(); lock = 0; @@ -2432,17 +2594,17 @@ void update_screen(int new_console) */ static int con_open(struct tty_struct *tty, struct file * filp) { - unsigned int idx; + unsigned int currcons; int i; - idx = MINOR(tty->device) - tty->driver.minor_start; + currcons = MINOR(tty->device) - tty->driver.minor_start; - i = vc_allocate(idx); + i = vc_allocate(currcons); if (i) return i; - vt_cons[idx]->vc_num = idx; - tty->driver_data = vt_cons[idx]; + vt_cons[currcons]->vc_num = currcons; + tty->driver_data = vt_cons[currcons]; if (!tty->winsize.ws_row && !tty->winsize.ws_col) { tty->winsize.ws_row = video_num_lines; @@ -2451,9 +2613,41 @@ static int con_open(struct tty_struct *tty, struct file * filp) return 0; } +void set_palette(void) +{ + if (vt_cons[fg_console]->vc_mode != KD_GRAPHICS) + conswitchp->con_set_palette(vc_cons[fg_console].d, color_table); +} + +int set_get_cmap(unsigned char *arg, int set) +{ + int i, j, k; + + for (i = 0; i < 16; i++) + if (set) { + get_user(default_red[i], arg++); + get_user(default_grn[i], arg++); + get_user(default_blu[i], arg++); + } else { + put_user(default_red[i], arg++); + put_user(default_grn[i], arg++); + put_user(default_blu[i], arg++); + } + if (set) { + for (i = 0; i < MAX_NR_CONSOLES; i++) + if (vc_cons_allocated(i)) + for (j = k = 0; j < 16; j++) { + vc_cons[i].d->vc_palette[k++] = default_red[j]; + vc_cons[i].d->vc_palette[k++] = default_grn[j]; + vc_cons[i].d->vc_palette[k++] = default_blu[j]; + } + set_palette(); + } + return 0; +} /* - * Load palette into the EGA/VGA DAC registers. arg points to a colour + * Load palette into the DAC registers. arg points to a colour * map, 3 bytes per colour, 16 colours, range from 0 to 255. */ @@ -2478,6 +2672,58 @@ void reset_palette (int currcons) set_palette() ; } +/* + * PIO_FONT support. + * + * Currently we only support 8 pixels wide fonts, at a maximum height + * of 32 pixels. Userspace fontdata is stored with 32 bytes reserved + * for each character which is kinda wasty, but this is done in order + * to maintain compatibility with the EGA/VGA fonts. It is upto the + * actual low-level console-driver convert data into its favorite + * format (maybe we should add a `fontoffset' field to the `display' + * structure so we wont have to convert the fontdata all the time. + * /Jes + */ + +#define cmapsz 8192 + +int set_get_font(unsigned char * arg, int set, int ch512) +{ + int i, unit, size; + char *charmap; + + if (!arg) + return -EINVAL; + + + size = ch512 ? 2*cmapsz : cmapsz; + + charmap = (char *)kmalloc(size, GFP_USER); + + if (set) { + if (copy_from_user(charmap, arg, size)) { + kfree(charmap); + return -EFAULT; + } + + for (unit = 32; unit > 0; unit--) + for (i = 0; i < (ch512 ? 512 : 256); i++) + if (charmap[32*i+unit-1]) + goto nonzero; + nonzero: + i = conswitchp->con_set_font(vc_cons[fg_console].d, 8, unit, charmap); + } else { + memset(charmap, 0, size); + i = conswitchp->con_get_font(vc_cons[fg_console].d, &unit, &unit, + charmap); + if (i == 0 && copy_to_user(arg, charmap, size)) + i = -EFAULT; + } + kfree(charmap); + + return i; +} + /* * Load font into the EGA/VGA character generator. arg points to a 8192 * byte map, 32 bytes per character. Only first H of them are used for diff --git a/drivers/char/console_macros.h b/drivers/char/console_macros.h new file mode 100644 index 000000000000..fc4081e58106 --- /dev/null +++ b/drivers/char/console_macros.h @@ -0,0 +1,65 @@ +#define cons_num (vc_cons[currcons].d->vc_num) +#define sw (vc_cons[currcons].d->vc_sw) +#define screenbuf_size (vc_cons[currcons].d->vc_screenbuf_size) +#define origin (vc_cons[currcons].d->vc_origin) +#define scr_end (vc_cons[currcons].d->vc_scr_end) +#define pos (vc_cons[currcons].d->vc_pos) +#define top (vc_cons[currcons].d->vc_top) +#define bottom (vc_cons[currcons].d->vc_bottom) +#define x (vc_cons[currcons].d->vc_x) +#define y (vc_cons[currcons].d->vc_y) +#define vc_state (vc_cons[currcons].d->vc_state) +#define npar (vc_cons[currcons].d->vc_npar) +#define par (vc_cons[currcons].d->vc_par) +#define ques (vc_cons[currcons].d->vc_ques) +#define attr (vc_cons[currcons].d->vc_attr) +#define saved_x (vc_cons[currcons].d->vc_saved_x) +#define saved_y (vc_cons[currcons].d->vc_saved_y) +#define translate (vc_cons[currcons].d->vc_translate) +#define G0_charset (vc_cons[currcons].d->vc_G0_charset) +#define G1_charset (vc_cons[currcons].d->vc_G1_charset) +#define saved_G0 (vc_cons[currcons].d->vc_saved_G0) +#define saved_G1 (vc_cons[currcons].d->vc_saved_G1) +#define utf (vc_cons[currcons].d->vc_utf) +#define utf_count (vc_cons[currcons].d->vc_utf_count) +#define utf_char (vc_cons[currcons].d->vc_utf_char) +#define video_mem_start (vc_cons[currcons].d->vc_video_mem_start) +#define video_mem_end (vc_cons[currcons].d->vc_video_mem_end) +#define video_erase_char (vc_cons[currcons].d->vc_video_erase_char) +#define disp_ctrl (vc_cons[currcons].d->vc_disp_ctrl) +#define toggle_meta (vc_cons[currcons].d->vc_toggle_meta) +#define decscnm (vc_cons[currcons].d->vc_decscnm) +#define decom (vc_cons[currcons].d->vc_decom) +#define decawm (vc_cons[currcons].d->vc_decawm) +#define deccm (vc_cons[currcons].d->vc_deccm) +#define decim (vc_cons[currcons].d->vc_decim) +#define deccolm (vc_cons[currcons].d->vc_deccolm) +#define need_wrap (vc_cons[currcons].d->vc_need_wrap) +#define has_scrolled (vc_cons[currcons].d->vc_has_scrolled) +#define kmalloced (vc_cons[currcons].d->vc_kmalloced) +#define report_mouse (vc_cons[currcons].d->vc_report_mouse) +#define color (vc_cons[currcons].d->vc_color) +#define s_color (vc_cons[currcons].d->vc_s_color) +#define def_color (vc_cons[currcons].d->vc_def_color) +#define foreground (color & 0x0f) +#define background (color & 0xf0) +#define charset (vc_cons[currcons].d->vc_charset) +#define s_charset (vc_cons[currcons].d->vc_s_charset) +#define intensity (vc_cons[currcons].d->vc_intensity) +#define underline (vc_cons[currcons].d->vc_underline) +#define blink (vc_cons[currcons].d->vc_blink) +#define reverse (vc_cons[currcons].d->vc_reverse) +#define s_intensity (vc_cons[currcons].d->vc_s_intensity) +#define s_underline (vc_cons[currcons].d->vc_s_underline) +#define s_blink (vc_cons[currcons].d->vc_s_blink) +#define s_reverse (vc_cons[currcons].d->vc_s_reverse) +#define ulcolor (vc_cons[currcons].d->vc_ulcolor) +#define halfcolor (vc_cons[currcons].d->vc_halfcolor) +#define tab_stop (vc_cons[currcons].d->vc_tab_stop) +#define palette (vc_cons[currcons].d->vc_palette) +#define bell_pitch (vc_cons[currcons].d->vc_bell_pitch) +#define bell_duration (vc_cons[currcons].d->vc_bell_duration) +#define cursor_type (vc_cons[currcons].d->vc_cursor_type) +#define vcmode (vt_cons[currcons]->vc_mode) + +#define structsize (sizeof(struct vc_data) + sizeof(struct vt_struct)) diff --git a/drivers/char/fbmem.c b/drivers/char/fbmem.c index fd2b28ec9773..3a49144c6e33 100644 --- a/drivers/char/fbmem.c +++ b/drivers/char/fbmem.c @@ -8,6 +8,9 @@ * for more details. */ +#include +#include + #include #include #include @@ -17,29 +20,141 @@ #include #include #include +#ifdef CONFIG_PROC_FS +#include +#endif +#ifdef CONFIG_KERNELD +#include +#endif +#ifdef __mc68000__ #include +#endif +#ifdef __powerpc__ +#include +#endif #include #include #include #include -#define FB_MAJOR 29 -#define FB_MODES_SHIFT 5 /* 32 modes per framebuffer */ -#define FB_NUM_MINORS 256 /* 256 Minors */ -#define FB_MAX (FB_NUM_MINORS / (1 << FB_MODES_SHIFT)) + /* + * Frame buffer device initialization and setup routines + */ + +extern unsigned long amifb_init(unsigned long mem_start); +extern void amifb_setup(char *options, int *ints); +extern unsigned long atafb_init(unsigned long mem_start); +extern void atafb_setup(char *options, int *ints); +extern unsigned long macfb_init(unsigned long mem_start); +extern void macfb_setup(char *options, int *ints); +extern unsigned long cyberfb_init(unsigned long mem_start); +extern void cyberfb_setup(char *options, int *ints); +extern unsigned long retz3fb_init(unsigned long mem_start); +extern void retz3fb_setup(char *options, int *ints); +extern unsigned long clgenfb_init(unsigned long mem_start); +extern void clgenfb_setup(char *options, int *ints); +extern unsigned long vfb_init(unsigned long mem_start); +extern void vfb_setup(char *options, int *ints); +extern unsigned long offb_init(unsigned long mem_start); +extern void offb_setup(char *options, int *ints); +extern unsigned long atyfb_init(unsigned long mem_start); +extern void atyfb_setup(char *options, int *ints); +extern unsigned long dnfb_init(unsigned long mem_start); +extern unsigned long tgafb_init(unsigned long mem_start); +extern unsigned long virgefb_init(unsigned long mem_start); +extern void virgefb_setup(char *options, int *ints); +extern void resolver_video_setup(char *options, int *ints); +extern unsigned long s3triofb_init(unsigned long mem_start); +extern void s3triofb_setup(char *options, int *ints); +extern unsigned long vgafb_init(unsigned long mem_start); +extern void vgafb_setup(char *options, int *ints); +extern unsigned long vesafb_init(unsigned long mem_start); +extern void vesafb_setup(char *options, int *ints); +extern unsigned long mdafb_init(unsigned long mem_start); +extern void mdafb_setup(char *options, int *ints); +extern unsigned long hpfb_init(unsigned long mem_start); +extern void hpfb_setup(char *options, int *ints); + + + +static struct { + const char *name; + unsigned long (*init)(unsigned long mem_start); + void (*setup)(char *options, int *ints); +} fb_drivers[] __initdata = { +#ifdef CONFIG_FB_RETINAZ3 + { "retz3", retz3fb_init, retz3fb_setup }, +#endif +#ifdef CONFIG_FB_AMIGA + { "amifb", amifb_init, amifb_setup }, +#endif +#ifdef CONFIG_FB_ATARI + { "atafb", atafb_init, atafb_setup }, +#endif +#ifdef CONFIG_FB_MAC + { "macfb", macfb_init, macfb_setup }, +#endif +#ifdef CONFIG_FB_CYBER + { "cyber", cyberfb_init, cyberfb_setup }, +#endif +#ifdef CONFIG_FB_CLGEN + { "clgen", clgenfb_init, clgenfb_setup }, +#endif +#ifdef CONFIG_FB_VIRTUAL + { "vfb", vfb_init, vfb_setup }, +#endif +#ifdef CONFIG_FB_OF + { "offb", offb_init, offb_setup }, +#endif +#ifdef CONFIG_FB_ATY + { "atyfb", atyfb_init, atyfb_setup }, +#endif +#ifdef CONFIG_APOLLO + { "apollo", dnfb_init, NULL }, +#endif +#ifdef CONFIG_FB_S3TRIO + { "s3trio", s3triofb_init, s3triofb_setup }, +#endif +#ifdef CONFIG_FB_TGA + { "tga", tgafb_init, NULL }, +#endif +#ifdef CONFIG_FB_VIRGE + { "virge", virgefb_init, virgefb_setup }, +#endif +#ifdef CONFIG_FB_VGA + { "vga", vgafb_init, vgafb_setup }, +#endif +#ifdef CONFIG_FB_VESA + { "vesa", vesafb_init, vesafb_setup }, +#endif +#ifdef CONFIG_FB_MDA + { "mda", mdafb_init, mdafb_setup }, +#endif +#ifdef CONFIG_FB_HP300 + { "hpfb", hpfb_init, hpfb_setup }, +#endif +#ifdef CONFIG_GSP_RESOLVER + /* Not a real frame buffer device... */ + { "resolver", NULL, resolver_video_setup }, +#endif +}; + +#define NUM_FB_DRIVERS (sizeof(fb_drivers)/sizeof(*fb_drivers)) + +static fb_init_func *pref_init_funcs[FB_MAX]; +static int num_pref_init_funcs __initdata = 0; + #define GET_INODE(i) MKDEV(FB_MAJOR, (i) << FB_MODES_SHIFT) -#define GET_FB_IDX(node) (MINOR(node) >> FB_MODES_SHIFT) #define GET_FB_VAR_IDX(node) (MINOR(node) & ((1 << FB_MODES_SHIFT)-1)) -struct fb_ops *registered_fb[FB_MAX]; -struct fb_var_screeninfo *registered_fb_var[FB_MAX]; -int registered_fb_var_num[FB_MAX]; -int fb_curr_open[FB_MAX]; -int fb_open_count[FB_MAX]; +struct fb_info *registered_fb[FB_MAX]; +int num_registered_fb = 0; + +char con2fb_map[MAX_NR_CONSOLES]; static inline int PROC_CONSOLE(void) { @@ -56,167 +171,240 @@ static inline int PROC_CONSOLE(void) return MINOR(current->tty->device) - 1; } -static long -fb_read(struct inode *inode, struct file *file, char *buf, unsigned long count) +#ifdef CONFIG_PROC_FS +static int fbmem_read_proc(char *buf, char **start, off_t offset, + int len, int *eof, void *private) +{ + struct fb_info **fi; + + len = 0; + for (fi = registered_fb; fi < ®istered_fb[FB_MAX] && len < 4000; fi++) + if (*fi) + len += sprintf(buf + len, "%d %s\n", + GET_FB_IDX((*fi)->node), + (*fi)->modename); + *start = buf + offset; + return len > offset ? len - offset : 0; +} +#endif + +static ssize_t +fb_read(struct file *file, char *buf, size_t count, loff_t *ppos) { - unsigned long p = file->f_pos; - struct fb_ops *fb = registered_fb[GET_FB_IDX(inode->i_rdev)]; + unsigned long p = *ppos; + struct inode *inode = file->f_dentry->d_inode; + int fbidx = GET_FB_IDX(inode->i_rdev); + struct fb_info *info = registered_fb[fbidx]; + struct fb_ops *fb = info->fbops; struct fb_fix_screeninfo fix; char *base_addr; - int copy_size; + ssize_t copy_size; - if (! fb) + if (! fb || ! info->disp) return -ENODEV; - fb->fb_get_fix(&fix,PROC_CONSOLE()); - base_addr=(char *) fix.smem_start; + fb->fb_get_fix(&fix,PROC_CONSOLE(), info); + base_addr=info->disp->screen_base; copy_size=(count + p <= fix.smem_len ? count : fix.smem_len - p); - copy_to_user(buf, base_addr+p, copy_size); - file->f_pos += copy_size; + if (copy_to_user(buf, base_addr+p, copy_size)) + return -EFAULT; + *ppos += copy_size; return copy_size; } -static long -fb_write(struct inode *inode, struct file *file, const char *buf, - unsigned long count) +static ssize_t +fb_write(struct file *file, const char *buf, size_t count, loff_t *ppos) { - unsigned long p = file->f_pos; - struct fb_ops *fb = registered_fb[GET_FB_IDX(inode->i_rdev)]; + unsigned long p = *ppos; + struct inode *inode = file->f_dentry->d_inode; + int fbidx = GET_FB_IDX(inode->i_rdev); + struct fb_info *info = registered_fb[fbidx]; + struct fb_ops *fb = info->fbops; struct fb_fix_screeninfo fix; char *base_addr; - int copy_size; + ssize_t copy_size; - if (! fb) + if (! fb || ! info->disp) return -ENODEV; - fb->fb_get_fix(&fix, PROC_CONSOLE()); - base_addr=(char *) fix.smem_start; + + fb->fb_get_fix(&fix, PROC_CONSOLE(), info); + base_addr=info->disp->screen_base; copy_size=(count + p <= fix.smem_len ? count : fix.smem_len - p); - copy_from_user(base_addr+p, buf, copy_size); + if (copy_from_user(base_addr+p, buf, copy_size)) + return -EFAULT; file->f_pos += copy_size; return copy_size; } +static void set_con2fb_map(int unit, int newidx) +{ + int oldidx = con2fb_map[unit]; + struct fb_info *oldfb, *newfb; + struct vc_data *conp; + + if (newidx != con2fb_map[unit]) { + oldfb = registered_fb[oldidx]; + newfb = registered_fb[newidx]; + if (newfb->fbops->fb_open(newfb)) + return; + oldfb->fbops->fb_release(oldfb); + conp = fb_display[unit].conp; + con2fb_map[unit] = newidx; + fb_display[unit] = *(newfb->disp); + fb_display[unit].conp = conp; + fb_display[unit].fb_info = newfb; + if (!newfb->changevar) + newfb->changevar = oldfb->changevar; + /* tell console var has changed */ + if (newfb->changevar) + newfb->changevar(unit); + } +} + +#ifdef CONFIG_KERNELD +static void try_to_load(int fb) +{ + char modname[16]; + + sprintf(modname, "fb%d", fb); + request_module(modname); +} +#endif + static int fb_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { - struct fb_ops *fb = registered_fb[GET_FB_IDX(inode->i_rdev)]; + int fbidx = GET_FB_IDX(inode->i_rdev); + struct fb_info *info = registered_fb[fbidx]; + struct fb_ops *fb = info->fbops; struct fb_cmap cmap; struct fb_var_screeninfo var; struct fb_fix_screeninfo fix; - - int i,fbidx,vidx; + struct fb_con2fbmap con2fb; + int i; if (! fb) return -ENODEV; switch (cmd) { case FBIOGET_VSCREENINFO: - i = verify_area(VERIFY_WRITE, (void *) arg, - sizeof(struct fb_var_screeninfo)); - if (i) return i; - fbidx=GET_FB_IDX(inode->i_rdev); - vidx=GET_FB_VAR_IDX(inode->i_rdev); - if (! vidx) /* ask device driver for current */ - i=fb->fb_get_var(&var, PROC_CONSOLE()); - else - var=registered_fb_var[fbidx][vidx-1]; - copy_to_user((void *) arg, &var, sizeof(var)); - return i; + if ((i = fb->fb_get_var(&var, PROC_CONSOLE(), info))) + return i; + return copy_to_user((void *) arg, &var, + sizeof(var)) ? -EFAULT : 0; case FBIOPUT_VSCREENINFO: - i = verify_area(VERIFY_WRITE, (void *) arg, - sizeof(struct fb_var_screeninfo)); - if (i) return i; - copy_from_user(&var, (void *) arg, sizeof(var)); - i=fb->fb_set_var(&var, PROC_CONSOLE()); - copy_to_user((void *) arg, &var, sizeof(var)); - fbidx=GET_FB_IDX(inode->i_rdev); - vidx=GET_FB_VAR_IDX(inode->i_rdev); - if (! i && vidx) - registered_fb_var[fbidx][vidx-1]=var; - return i; + if (copy_from_user(&var, (void *) arg, sizeof(var))) + return -EFAULT; + if ((i = fb->fb_set_var(&var, PROC_CONSOLE(), info))) + return i; + if (copy_to_user((void *) arg, &var, sizeof(var))) + return -EFAULT; + return 0; case FBIOGET_FSCREENINFO: - i = verify_area(VERIFY_WRITE, (void *) arg, - sizeof(struct fb_fix_screeninfo)); - if (i) return i; - i=fb->fb_get_fix(&fix, PROC_CONSOLE()); - copy_to_user((void *) arg, &fix, sizeof(fix)); - return i; + if ((i = fb->fb_get_fix(&fix, PROC_CONSOLE(), info))) + return i; + return copy_to_user((void *) arg, &fix, sizeof(fix)) ? + -EFAULT : 0; case FBIOPUTCMAP: - i = verify_area(VERIFY_READ, (void *) arg, - sizeof(struct fb_cmap)); - if (i) return i; - copy_from_user(&cmap, (void *) arg, sizeof(cmap)); - i = verify_area(VERIFY_READ, (void *) cmap.red, - cmap.len * sizeof(unsigned short)); - if (i) return i; - i = verify_area(VERIFY_READ, (void *) cmap.green, - cmap.len * sizeof(unsigned short)); - if (i) return i; - i = verify_area(VERIFY_READ, (void *) cmap.blue, - cmap.len * sizeof(unsigned short)); - if (i) return i; - if (cmap.transp) { - i = verify_area(VERIFY_READ, (void *) cmap.transp, - cmap.len * sizeof(unsigned short)); - if (i) return i; - } - return (fb->fb_set_cmap(&cmap, 0, PROC_CONSOLE())); + if (copy_from_user(&cmap, (void *) arg, sizeof(cmap))) + return -EFAULT; + return (fb->fb_set_cmap(&cmap, 0, PROC_CONSOLE(), info)); case FBIOGETCMAP: - i = verify_area(VERIFY_READ, (void *) arg, - sizeof(struct fb_cmap)); - if (i) return i; - copy_from_user(&cmap, (void *) arg, sizeof(cmap)); - i = verify_area(VERIFY_WRITE, (void *) cmap.red, - cmap.len * sizeof(unsigned short)); - if (i) return i; - i = verify_area(VERIFY_WRITE, (void *) cmap.green, - cmap.len * sizeof(unsigned short)); - if (i) return i; - i = verify_area(VERIFY_WRITE, (void *) cmap.blue, - cmap.len * sizeof(unsigned short)); - if (i) return i; - if (cmap.transp) { - i = verify_area(VERIFY_WRITE, (void *) cmap.transp, - cmap.len * sizeof(unsigned short)); - if (i) return i; - } - return (fb->fb_get_cmap(&cmap, 0, PROC_CONSOLE())); + if (copy_from_user(&cmap, (void *) arg, sizeof(cmap))) + return -EFAULT; + return (fb->fb_get_cmap(&cmap, 0, PROC_CONSOLE(), info)); case FBIOPAN_DISPLAY: - i = verify_area(VERIFY_WRITE, (void *) arg, - sizeof(struct fb_var_screeninfo)); - if (i) return i; - copy_from_user(&var, (void *) arg, sizeof(var)); - i=fb->fb_pan_display(&var, PROC_CONSOLE()); - copy_to_user((void *) arg, &var, sizeof(var)); - fbidx=GET_FB_IDX(inode->i_rdev); - vidx=GET_FB_VAR_IDX(inode->i_rdev); - if (! i && vidx) - registered_fb_var[fbidx][vidx-1]=var; + if (copy_from_user(&var, (void *) arg, sizeof(var))) + return -EFAULT; + if ((i=fb->fb_pan_display(&var, PROC_CONSOLE(), info))) + return i; + if (copy_to_user((void *) arg, &var, sizeof(var))) + return -EFAULT; return i; + case FBIOGET_CON2FBMAP: + if (copy_from_user(&con2fb, (void *)arg, sizeof(con2fb))) + return -EFAULT; + if (con2fb.console < 1 || con2fb.console > MAX_NR_CONSOLES) + return -EINVAL; + con2fb.framebuffer = con2fb_map[con2fb.console-1]; + return copy_to_user((void *)arg, &con2fb, + sizeof(con2fb)) ? -EFAULT : 0; + case FBIOPUT_CON2FBMAP: + if (copy_from_user(&con2fb, (void *)arg, sizeof(con2fb))) + return - EFAULT; + if (con2fb.console < 0 || con2fb.console > MAX_NR_CONSOLES) + return -EINVAL; + if (con2fb.framebuffer < 0 || con2fb.framebuffer >= FB_MAX) + return -EINVAL; +#ifdef CONFIG_KERNELD + if (!registered_fb[con2fb.framebuffer]) + try_to_load(con2fb.framebuffer); +#endif + if (!registered_fb[con2fb.framebuffer]) + return -EINVAL; + if (con2fb.console != 0) + set_con2fb_map(con2fb.console-1, con2fb.framebuffer); + else + /* set them all */ + for (i = 0; i < MAX_NR_CONSOLES; i++) + set_con2fb_map(i, con2fb.framebuffer); + return 0; default: - return (fb->fb_ioctl(inode, file, cmd, arg, PROC_CONSOLE())); + return fb->fb_ioctl(inode, file, cmd, arg, PROC_CONSOLE(), + info); } } -static int fb_mmap(struct file *file, struct vm_area_struct * vma) +static int +fb_mmap(struct file *file, struct vm_area_struct * vma) { - struct fb_ops *fb = registered_fb[GET_FB_IDX(file->f_dentry->d_inode->i_rdev)]; + int fbidx = GET_FB_IDX(file->f_dentry->d_inode->i_rdev); + struct fb_info *info = registered_fb[fbidx]; + struct fb_ops *fb = info->fbops; struct fb_fix_screeninfo fix; + struct fb_var_screeninfo var; + unsigned long start; + u32 len; - if (! fb) + if (!fb) return -ENODEV; - fb->fb_get_fix(&fix, PROC_CONSOLE()); - if ((vma->vm_end - vma->vm_start + vma->vm_offset) > fix.smem_len) + fb->fb_get_fix(&fix, PROC_CONSOLE(), info); + + /* frame buffer memory */ + start = (unsigned long)fix.smem_start; + len = (start & ~PAGE_MASK)+fix.smem_len; + start &= PAGE_MASK; + len = (len+~PAGE_MASK) & PAGE_MASK; + if (vma->vm_offset >= len) { + /* memory mapped io */ + vma->vm_offset -= len; + fb->fb_get_var(&var, PROC_CONSOLE(), info); + if (var.accel_flags) + return -EINVAL; + start = (unsigned long)fix.mmio_start; + len = (start & ~PAGE_MASK)+fix.mmio_len; + start &= PAGE_MASK; + len = (len+~PAGE_MASK) & PAGE_MASK; + } + if ((vma->vm_end - vma->vm_start + vma->vm_offset) > len) return -EINVAL; - vma->vm_offset += __pa(fix.smem_start); + vma->vm_offset += start; if (vma->vm_offset & ~PAGE_MASK) return -ENXIO; +#if defined(__mc68000__) + if (CPU_IS_020_OR_030) + pgprot_val(vma->vm_page_prot) |= _PAGE_NOCACHE030; if (CPU_IS_040_OR_060) { pgprot_val(vma->vm_page_prot) &= _CACHEMASK040; - /* Use write-through cache mode */ + /* Use no-cache mode, serialized */ pgprot_val(vma->vm_page_prot) |= _PAGE_NOCACHE_S; } +#elif defined(__powerpc__) + pgprot_val(vma->vm_page_prot) |= _PAGE_NO_CACHE|_PAGE_GUARDED; +#else +#warning What do we have to do here?? +#endif if (remap_page_range(vma->vm_start, vma->vm_offset, vma->vm_end - vma->vm_start, vma->vm_page_prot)) return -EAGAIN; @@ -228,34 +416,25 @@ static int fb_mmap(struct file *file, struct vm_area_struct * vma) static int fb_open(struct inode *inode, struct file *file) { - int fbidx=GET_FB_IDX(inode->i_rdev); - int vidx=GET_FB_VAR_IDX(inode->i_rdev); - struct fb_ops *fb = registered_fb[fbidx]; - int err; - - if (! vidx) /* fb?current always succeeds */ - return 0; - if (vidx > registered_fb_var_num[fbidx]) - return -EINVAL; - if (fb_curr_open[fbidx] && fb_curr_open[fbidx] != vidx) - return -EBUSY; - if (file->f_mode & 2) /* only set parameters if opened writeable */ - if ((err=fb->fb_set_var(registered_fb_var[fbidx] + vidx-1, PROC_CONSOLE()))) - return err; - fb_curr_open[fbidx] = vidx; - fb_open_count[fbidx]++; - return 0; + int fbidx = GET_FB_IDX(inode->i_rdev); + struct fb_info *info; + +#ifdef CONFIG_KERNELD + if (!(info = registered_fb[fbidx])) + try_to_load(fbidx); +#endif + if (!(info = registered_fb[fbidx])) + return -ENODEV; + return info->fbops->fb_open(info); } static int fb_release(struct inode *inode, struct file *file) { - int fbidx=GET_FB_IDX(inode->i_rdev); - int vidx=GET_FB_VAR_IDX(inode->i_rdev); - if (! vidx) - return 0; - if (! (--fb_open_count[fbidx])) - fb_curr_open[fbidx]=0; + int fbidx = GET_FB_IDX(inode->i_rdev); + struct fb_info *info = registered_fb[fbidx]; + + info->fbops->fb_release(info); return 0; } @@ -273,37 +452,181 @@ static struct file_operations fb_fops = { }; int -register_framebuffer(char *id, int *node, struct fb_ops *fbops, int fbvar_num, - struct fb_var_screeninfo *fbvar) +register_framebuffer(struct fb_info *fb_info) { - int i; + int i, j; + static int fb_ever_opened[FB_MAX]; + + if (num_registered_fb == FB_MAX) + return -ENXIO; + num_registered_fb++; for (i = 0 ; i < FB_MAX; i++) - if (! registered_fb[i]) + if (!registered_fb[i]) break; - if (i == FB_MAX) - return -ENXIO; - registered_fb[i]=fbops; - registered_fb_var[i]=fbvar; - registered_fb_var_num[i]=fbvar_num; - *node=GET_INODE(i); + fb_info->node=GET_INODE(i); + registered_fb[i] = fb_info; + if (!fb_ever_opened[i]) { + /* + * We assume initial frame buffer devices can be opened this + * many times + */ + for (j = 0; j < MAX_NR_CONSOLES; j++) + if (con2fb_map[j] == i) + fb_info->fbops->fb_open(fb_info); + fb_ever_opened[i] = 1; + } return 0; } int -unregister_framebuffer(int node) +unregister_framebuffer(const struct fb_info *fb_info) { - int i=GET_FB_IDX(node); - if (! registered_fb[i]) + int i, j; + + i = GET_FB_IDX(fb_info->node); + for (j = 0; j < MAX_NR_CONSOLES; j++) + if (con2fb_map[j] == i) + return -EBUSY; + if (!registered_fb[i]) return -EINVAL; registered_fb[i]=NULL; - registered_fb_var[i]=NULL; + num_registered_fb--; return 0; } +#ifdef CONFIG_PROC_FS +static struct proc_dir_entry *proc_fbmem; +#endif + __initfunc(void fbmem_init(void)) { +#ifdef CONFIG_PROC_FS + proc_fbmem = create_proc_entry("fb", 0, 0); + if (proc_fbmem) + proc_fbmem->read_proc = fbmem_read_proc; +#endif + if (register_chrdev(FB_MAJOR,"fb",&fb_fops)) printk("unable to get major %d for fb devs\n", FB_MAJOR); } + +int fbmon_valid_timings(u_int pixclock, u_int htotal, u_int vtotal, + const struct fb_info *fb_info) +{ +#if 0 + /* + * long long divisions .... $#%%#$ + */ + unsigned long long hpicos, vpicos; + const unsigned long long _1e12 = 1000000000000ULL; + const struct fb_monspecs *monspecs = &fb_info->monspecs; + + hpicos = (unsigned long long)htotal*(unsigned long long)pixclock; + vpicos = (unsigned long long)vtotal*(unsigned long long)hpicos; + if (!vpicos) + return 0; + + if (monspecs->hfmin == 0) + return 1; + + if (hpicos*monspecs->hfmin > _1e12 || hpicos*monspecs->hfmax < _1e12 || + vpicos*monspecs->vfmin > _1e12 || vpicos*monspecs->vfmax < _1e12) + return 0; +#endif + return 1; +} + +int fbmon_dpms(const struct fb_info *fb_info) +{ + return fb_info->monspecs.dpms; +} + + + /* + * Probe for all builtin frame buffer devices + */ + +__initfunc(unsigned long probe_framebuffers(unsigned long kmem_start)) +{ + int i; + + for (i = 0; i < num_pref_init_funcs; i++) + kmem_start = pref_init_funcs[i](kmem_start); + + for (i = 0; i < NUM_FB_DRIVERS; i++) + if (fb_drivers[i].init) + kmem_start = fb_drivers[i].init(kmem_start); + + return kmem_start; +} + + + /* + * Command line options + */ + +__initfunc(void video_setup(char *options, int *ints)) +{ + int i, j; + + if (!options || !*options) + return; + + if (!strncmp(options, "map:", 4)) { + options += 4; + if (*options) + for (i = 0, j = 0; i < MAX_NR_CONSOLES; i++) { + if (!options[j]) + j = 0; + con2fb_map[i] = (options[j++]-'0') % FB_MAX; + } + return; + } + + if (num_pref_init_funcs == FB_MAX) + return; + + for (i = 0; i < NUM_FB_DRIVERS; i++) { + j = strlen(fb_drivers[i].name); + if (!strncmp(options, fb_drivers[i].name, j) && + options[j] == ':') { + if (!strcmp(options+j+1, "off")) + fb_drivers[i].init = NULL; + else { + if (fb_drivers[i].init) { + pref_init_funcs[num_pref_init_funcs++] = + fb_drivers[i].init; + fb_drivers[i].init = NULL; + } + if (fb_drivers[i].setup) + fb_drivers[i].setup(options+j+1, ints); + } + return; + } + } + /* + * If we get here no fb was specified and we default to pass the + * options to the first frame buffer that has an init and a setup + * fuction. + */ + for (i = 0; i < NUM_FB_DRIVERS; i++) { + if (fb_drivers[i].init && fb_drivers[i].setup) { + pref_init_funcs[num_pref_init_funcs++] = + fb_drivers[i].init; + fb_drivers[i].init = NULL; + + fb_drivers[i].setup(options, ints); + return; + } + } +} + + + /* + * Visible symbols for modules + */ + +EXPORT_SYMBOL(register_framebuffer); +EXPORT_SYMBOL(unregister_framebuffer); diff --git a/drivers/char/h8.c b/drivers/char/h8.c index 73941a0591e8..12d90ebeef85 100644 --- a/drivers/char/h8.c +++ b/drivers/char/h8.c @@ -775,7 +775,7 @@ h8_cmd_done(h8_cmd_q_t *qp) case H8_RD_SN: case H8_RD_ENET_ADDR: - printk("H8: Read ethernet addr - command done - address: %x - %x - %x - %x - %x - %x \n", + printk("H8: read Ethernet address: command done - address: %x - %x - %x - %x - %x - %x \n", qp->rcvbuf[0], qp->rcvbuf[1], qp->rcvbuf[2], qp->rcvbuf[3], qp->rcvbuf[4], qp->rcvbuf[5]); QUEUE_ENTER(&h8_freeq, qp, link, h8_cmd_q_t *); @@ -908,7 +908,7 @@ h8_cmd_done(h8_cmd_q_t *qp) } /* - * Retrieve the current cpu temperature and case temperature. Provides + * Retrieve the current CPU temperature and case temperature. Provides * the feedback for the thermal control algorithm. Synchcronized via * sleep() for priority so that no other actions in the process will take * place before the data becomes available. @@ -954,7 +954,7 @@ h8_get_max_temp(void) /* * Assigns an upper limit to the value of the H8 thermal interrupt. * As an example setting a value of 115 F here will cause the - * interrupt to trigger when the cpu temperature reaches 115 F. + * interrupt to trigger when the CPU temperature reaches 115 F. */ static void h8_set_upper_therm_thold(int thold) @@ -1072,7 +1072,7 @@ h8_monitor_thread(void * unused) /* * If an external DC supply is removed or added make - * appropriate cpu speed adjustments. + * appropriate CPU speed adjustments. */ if (h8_event_mask & H8_MANAGE_BATTERY) { h8_run_level_3_manage(H8_RUN); @@ -1106,7 +1106,7 @@ h8_manage_therm(void) h8_set_cpu_speed(h8_udamp); h8_clear_event_mask(H8_MANAGE_UTHERM); h8_set_event_mask(H8_MANAGE_LTHERM); - /* Check again in 30 seconds for cpu temperature */ + /* Check again in 30 seconds for CPU temperature */ h8_start_monitor_timer(H8_TIMEOUT_INTERVAL); } else if (h8_event_mask & H8_MANAGE_LTHERM) { /* See how cool the system has become as a result @@ -1116,7 +1116,7 @@ h8_manage_therm(void) if (curr_temp[0] < (h8_uthermal_threshold - h8_uthermal_window)) { /* System cooling has progressed to a point - that the cpu may be speeded up. */ + that the CPU may be sped up. */ h8_set_upper_therm_thold(h8_uthermal_threshold); h8_set_cpu_speed(h8_ldamp); /* adjustable */ if(h8_debug & 0x10) @@ -1144,7 +1144,7 @@ h8_set_cpu_speed(int speed_divisor) /* * global_rpb_counter is consumed by alpha_delay() in determining just * how much time to delay. It is necessary that the number of microseconds - * in DELAY(n) be kept consistent over a variety of cpu clock speeds. + * in DELAY(n) be kept consistent over a variety of CPU clock speeds. * To that end global_rpb_counter is here adjusted. */ @@ -1183,7 +1183,7 @@ h8_set_cpu_speed(int speed_divisor) } /* - * Gets value stored in rpb representing cpu clock speed and adjusts this + * Gets value stored in rpb representing CPU clock speed and adjusts this * value based on the current clock speed divisor. */ u_long diff --git a/drivers/char/h8.h b/drivers/char/h8.h index 533c4ece1179..b59aadea8d27 100644 --- a/drivers/char/h8.h +++ b/drivers/char/h8.h @@ -183,7 +183,7 @@ #define H8_SYSTEM_DELAY_TEST 0x100000 #define H8_POWER_SWITCH_TEST 0x200000 -/* cpu speeds and clock divisor values */ +/* CPU speeds and clock divisor values */ #define MHZ_14 5 #define MHZ_28 4 #define MHZ_57 3 diff --git a/drivers/char/i2c.h b/drivers/char/i2c.h index 66aef224c5b6..44c09570de2d 100644 --- a/drivers/char/i2c.h +++ b/drivers/char/i2c.h @@ -6,7 +6,7 @@ * There are: * * i2c the basic control module (like scsi_mod) - * bus driver a driver with a i2c bus (hostadapter driver) + * bus driver a driver with a i2c bus (host adapter driver) * chip driver a driver for a chip connected * to a i2c bus (cdrom/hd driver) * diff --git a/drivers/char/mem.c b/drivers/char/mem.c index cf2dea85a401..ef6abbd4f87e 100644 --- a/drivers/char/mem.c +++ b/drivers/char/mem.c @@ -41,8 +41,8 @@ int isdn_init(void); #ifdef CONFIG_VIDEO_DEV extern int videodev_init(void); #endif -#if defined(CONFIG_FB) -extern void fbmem_init( void ); +#ifdef CONFIG_FB +extern void fbmem_init(void); #endif static ssize_t do_write_mem(struct file * file, void *p, unsigned long realp, @@ -63,7 +63,7 @@ static ssize_t do_write_mem(struct file * file, void *p, unsigned long realp, written+=sz; } #endif - if (copy_from_user(p, buf, count) < 0) + if (copy_from_user(p, buf, count)) return -EFAULT; written += count; *ppos += written; @@ -104,7 +104,7 @@ static ssize_t read_mem(struct file * file, char * buf, } } #endif - if (copy_to_user(buf, __va(p), count) < 0) + if (copy_to_user(buf, __va(p), count)) return -EFAULT; read += count; *ppos += read; @@ -552,7 +552,7 @@ __initfunc(int chr_dev_init(void)) #endif #ifdef CONFIG_JOYSTICK /* - * Some joysticks only appear when the soundcard they are + * Some joysticks only appear when the sound card they are * connected to is configured. Keep the sound/joystick ordering. */ js_init(); diff --git a/drivers/char/msp3400.c b/drivers/char/msp3400.c index e783a15ad27c..3c2d9f54e332 100644 --- a/drivers/char/msp3400.c +++ b/drivers/char/msp3400.c @@ -5,17 +5,17 @@ * * what works and what doesn't: * - * AM-Mono + * AM mono * probably doesn't (untested) * - * FM-Mono - * should work. The stereo modes are backward compatible to FM-mono, - * therefore FM-Mono should be allways available. + * FM-mono + * should work. FM stereo modes are backward-compatible to mono. + * Therefore FM mono should always be available. * - * FM-Stereo (B/G, used in germany) + * FM stereo (B/G, used in Germany) * should work, with autodetect * - * FM-Stereo (satellite) + * FM stereo (satellite) * should work, no autodetect (i.e. default is mono, but you can * switch to stereo -- untested) * @@ -605,7 +605,7 @@ static int msp3400c_thread(void *data) dprintk("msp3400: carrier2 val: %5d / %s\n", val,cd[this].name); } - /* programm the msp3400 according to the results */ + /* program the msp3400 according to the results */ switch (max1) { case 0: /* 4.5 */ case 1: /* 5.5 */ diff --git a/drivers/char/random.c b/drivers/char/random.c index 0b0433b17956..39c0128340f3 100644 --- a/drivers/char/random.c +++ b/drivers/char/random.c @@ -1715,9 +1715,9 @@ __u32 secure_tcp_sequence_number(__u32 saddr, __u32 daddr, /* * As close as possible to RFC 793, which - * suggests using a 250kHz clock. - * Further reading shows this assumes 2Mb/s networks. - * For 10Mb/s ethernet, a 1MHz clock is appropriate. + * suggests using a 250 kHz clock. + * Further reading shows this assumes 2 Mb/s networks. + * For 10 Mb/s Ethernet, a 1 MHz clock is appropriate. * That's funny, Linux has one built in! Use it! * (Networks are faster now - should this be increased?) */ diff --git a/drivers/char/rtc.c b/drivers/char/rtc.c index 5f827bed9719..1a0079531498 100644 --- a/drivers/char/rtc.c +++ b/drivers/char/rtc.c @@ -134,11 +134,8 @@ static void rtc_interrupt(int irq, void *dev_id, struct pt_regs *regs) rtc_irq_data |= (CMOS_READ(RTC_INTR_FLAGS) & 0xF0); wake_up_interruptible(&rtc_wait); - if (rtc_status & RTC_TIMER_ON) { - del_timer(&rtc_irq_timer); - rtc_irq_timer.expires = jiffies + HZ/rtc_freq + 2*HZ/100; - add_timer(&rtc_irq_timer); - } + if (rtc_status & RTC_TIMER_ON) + mod_timer(&rtc_irq_timer, jiffies + HZ/rtc_freq + 2*HZ/100); } /* @@ -596,9 +593,7 @@ void rtc_dropped_irq(unsigned long data) unsigned long flags; printk(KERN_INFO "rtc: lost some interrupts at %ldHz.\n", rtc_freq); - del_timer(&rtc_irq_timer); - rtc_irq_timer.expires = jiffies + HZ/rtc_freq + 2*HZ/100; - add_timer(&rtc_irq_timer); + mod_timer(&rtc_irq_timer, jiffies + HZ/rtc_freq + 2*HZ/100); save_flags(flags); cli(); diff --git a/drivers/char/selection.c b/drivers/char/selection.c index 0a326a55dbea..f3102318cb43 100644 --- a/drivers/char/selection.c +++ b/drivers/char/selection.c @@ -22,6 +22,7 @@ #include #include +#include #include #ifndef MIN @@ -120,15 +121,11 @@ int set_selection(const unsigned long arg, struct tty_struct *tty, int user) int sel_mode, new_sel_start, new_sel_end, spc; char *bp, *obp; int i, ps, pe; - unsigned long num_lines, num_columns, size_row; + unsigned int currcons = fg_console; do_unblank_screen(); poke_blanked_console(); - num_lines = get_video_num_lines(fg_console); - num_columns = get_video_num_columns(fg_console); - size_row = get_video_size_row(fg_console); - { unsigned short *args, xs, ys, xe, ye; args = (unsigned short *)(arg + 1); @@ -150,12 +147,12 @@ int set_selection(const unsigned long arg, struct tty_struct *tty, int user) sel_mode = *args; } xs--; ys--; xe--; ye--; - xs = limit(xs, num_columns - 1); - ys = limit(ys, num_lines - 1); - xe = limit(xe, num_columns - 1); - ye = limit(ye, num_lines - 1); - ps = ys * size_row + (xs << 1); - pe = ye * size_row + (xe << 1); + xs = limit(xs, video_num_columns - 1); + ys = limit(ys, video_num_lines - 1); + xe = limit(xe, video_num_columns - 1); + ye = limit(ye, video_num_lines - 1); + ps = ys * video_size_row + (xs << 1); + pe = ye * video_size_row + (xe << 1); if (sel_mode == 4) { /* useful for screendump without selection highlights */ @@ -195,7 +192,7 @@ int set_selection(const unsigned long arg, struct tty_struct *tty, int user) (!spc && !inword(sel_pos(ps)))) break; new_sel_start = ps; - if (!(ps % size_row)) + if (!(ps % video_size_row)) break; } spc = isspace(sel_pos(pe)); @@ -205,14 +202,14 @@ int set_selection(const unsigned long arg, struct tty_struct *tty, int user) (!spc && !inword(sel_pos(pe)))) break; new_sel_end = pe; - if (!((pe + 2) % size_row)) + if (!((pe + 2) % video_size_row)) break; } break; case 2: /* line-by-line selection */ - new_sel_start = ps - ps % size_row; - new_sel_end = pe + size_row - - pe % size_row - 2; + new_sel_start = ps - ps % video_size_row; + new_sel_end = pe + video_size_row + - pe % video_size_row - 2; break; case 3: highlight_pointer(pe); @@ -226,9 +223,11 @@ int set_selection(const unsigned long arg, struct tty_struct *tty, int user) /* select to end of line if on trailing space */ if (new_sel_end > new_sel_start && - !atedge(new_sel_end, size_row) && isspace(sel_pos(new_sel_end))) { + !atedge(new_sel_end, video_size_row) && + isspace(sel_pos(new_sel_end))) { for (pe = new_sel_end + 2; ; pe += 2) - if (!isspace(sel_pos(pe)) || atedge(pe, size_row)) + if (!isspace(sel_pos(pe)) || + atedge(pe, video_size_row)) break; if (isspace(sel_pos(pe))) new_sel_end = pe; @@ -273,7 +272,7 @@ int set_selection(const unsigned long arg, struct tty_struct *tty, int user) *bp = sel_pos(i); if (!isspace(*bp++)) obp = bp; - if (! ((i + 2) % size_row)) { + if (! ((i + 2) % video_size_row)) { /* strip trailing blanks from line and add newline, unless non-space at end of line. */ if (obp != bp) { diff --git a/drivers/char/tga.c b/drivers/char/tga.c deleted file mode 100644 index 7bab0702365a..000000000000 --- a/drivers/char/tga.c +++ /dev/null @@ -1,1169 +0,0 @@ -/* - * linux/drivers/char/tga.c - * - * Copyright (C) 1995 Jay Estabrook - */ - -/* - * tga.c - * - * This module exports the console io support for DEC's TGA - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -extern struct console vt_console_driver; - -/* TGA hardware description (minimal) */ -/* - * Offsets within Memory Space - */ -#define TGA_ROM_OFFSET 0x0000000 -#define TGA_REGS_OFFSET 0x0100000 -#define TGA_8PLANE_FB_OFFSET 0x0200000 -#define TGA_24PLANE_FB_OFFSET 0x0804000 -#define TGA_24PLUSZ_FB_OFFSET 0x1004000 - -#define TGA_PLANEMASK_REG 0x0028 -#define TGA_MODE_REG 0x0030 -#define TGA_RASTEROP_REG 0x0034 -#define TGA_DEEP_REG 0x0050 -#define TGA_PIXELMASK_REG 0x005c -#define TGA_CURSOR_BASE_REG 0x0060 -#define TGA_HORIZ_REG 0x0064 -#define TGA_VERT_REG 0x0068 -#define TGA_BASE_ADDR_REG 0x006c -#define TGA_VALID_REG 0x0070 -#define TGA_CURSOR_XY_REG 0x0074 -#define TGA_INTR_STAT_REG 0x007c -#define TGA_RAMDAC_SETUP_REG 0x00c0 -#define TGA_BLOCK_COLOR0_REG 0x0140 -#define TGA_BLOCK_COLOR1_REG 0x0144 -#define TGA_CLOCK_REG 0x01e8 -#define TGA_RAMDAC_REG 0x01f0 -#define TGA_CMD_STAT_REG 0x01f8 - -/* - * useful defines for managing the BT485 on the 8-plane TGA - */ -#define BT485_READ_BIT 0x01 -#define BT485_WRITE_BIT 0x00 - -#define BT485_ADDR_PAL_WRITE 0x00 -#define BT485_DATA_PAL 0x02 -#define BT485_PIXEL_MASK 0x04 -#define BT485_ADDR_PAL_READ 0x06 -#define BT485_ADDR_CUR_WRITE 0x08 -#define BT485_DATA_CUR 0x0a -#define BT485_CMD_0 0x0c -#define BT485_ADDR_CUR_READ 0x0e -#define BT485_CMD_1 0x10 -#define BT485_CMD_2 0x12 -#define BT485_STATUS 0x14 -#define BT485_CMD_3 0x14 -#define BT485_CUR_RAM 0x16 -#define BT485_CUR_LOW_X 0x18 -#define BT485_CUR_HIGH_X 0x1a -#define BT485_CUR_LOW_Y 0x1c -#define BT485_CUR_HIGH_Y 0x1e - -/* - * useful defines for managing the BT463 on the 24-plane TGAs - */ -#define BT463_ADDR_LO 0x0 -#define BT463_ADDR_HI 0x1 -#define BT463_REG_ACC 0x2 -#define BT463_PALETTE 0x3 - -#define BT463_CUR_CLR_0 0x0100 -#define BT463_CUR_CLR_1 0x0101 - -#define BT463_CMD_REG_0 0x0201 -#define BT463_CMD_REG_1 0x0202 -#define BT463_CMD_REG_2 0x0203 - -#define BT463_READ_MASK_0 0x0205 -#define BT463_READ_MASK_1 0x0206 -#define BT463_READ_MASK_2 0x0207 -#define BT463_READ_MASK_3 0x0208 - -#define BT463_BLINK_MASK_0 0x0209 -#define BT463_BLINK_MASK_1 0x020a -#define BT463_BLINK_MASK_2 0x020b -#define BT463_BLINK_MASK_3 0x020c - -#define BT463_WINDOW_TYPE_BASE 0x0300 - -/* - * built-in font management constants - * - * NOTE: the built-in font is 8x16, and the video resolution - * is 640x480 @ 60Hz. - * This means we could put 30 rows of text on the screen (480/16). - * However, we wish to make then TGA look just like a VGA, as the - * default, so, we pad the character to 8x18, and leave some scan - * lines at the bottom unused. - */ -#define TGA_F_WIDTH 8 -#define TGA_F_HEIGHT 16 -#define TGA_F_HEIGHT_PADDED 18 - -int tga_type; -unsigned long tga_mem_base; -unsigned long tga_fb_base; -unsigned long tga_regs_base; -unsigned int tga_bpp, tga_fb_width, tga_fb_height, tga_fb_stride; - -static unsigned int fb_offset_presets[4] __initdata = { - TGA_8PLANE_FB_OFFSET, - TGA_24PLANE_FB_OFFSET, - 0xffffffff, - TGA_24PLUSZ_FB_OFFSET -}; - -static unsigned int deep_presets[4] __initdata = { - 0x00014000, - 0x0001440d, - 0xffffffff, - 0x0001441d -}; - -static unsigned int rasterop_presets[4] __initdata = { - 0x00000003, - 0x00000303, - 0xffffffff, - 0x00000303 -}; - -static unsigned int mode_presets[4] __initdata = { - 0x00002000, - 0x00002300, - 0xffffffff, - 0x00002300 -}; - -static unsigned int base_addr_presets[4] __initdata = { - 0x00000000, - 0x00000001, - 0xffffffff, - 0x00000001 -}; - -#define TGA_WRITE_REG(v,r) \ - { writel((v), tga_regs_base+(r)); mb(); } - -#define TGA_READ_REG(r) readl(tga_regs_base+(r)) - -#define BT485_WRITE(v,r) \ - TGA_WRITE_REG((r),TGA_RAMDAC_SETUP_REG); \ - TGA_WRITE_REG(((v)&0xff)|((r)<<8),TGA_RAMDAC_REG); - -#define BT463_LOAD_ADDR(a) \ - TGA_WRITE_REG(BT463_ADDR_LO<<2, TGA_RAMDAC_SETUP_REG); \ - TGA_WRITE_REG((BT463_ADDR_LO<<10)|((a)&0xff), TGA_RAMDAC_REG); \ - TGA_WRITE_REG(BT463_ADDR_HI<<2, TGA_RAMDAC_SETUP_REG); \ - TGA_WRITE_REG((BT463_ADDR_HI<<10)|(((a)>>8)&0xff), TGA_RAMDAC_REG); - -#define BT463_WRITE(m,a,v) \ - BT463_LOAD_ADDR((a)); \ - TGA_WRITE_REG(((m)<<2),TGA_RAMDAC_SETUP_REG); \ - TGA_WRITE_REG(((m)<<10)|((v)&0xff),TGA_RAMDAC_REG); - -extern char tga_builtin_font[]; - -void tga_init_video(void); -void tga_clear_screen(void); - -void -set_palette (void) -{ - int i, j; - - if (console_blanked || vt_cons[fg_console]->vc_mode == KD_GRAPHICS) - return; - - - if (tga_type == 0) { /* 8-plane */ - BT485_WRITE(0x00, BT485_ADDR_PAL_WRITE); - TGA_WRITE_REG(BT485_DATA_PAL, TGA_RAMDAC_SETUP_REG); - - for (i = 0; i < 16; i++) { - j = color_table[i]; - TGA_WRITE_REG(default_red[j]|(BT485_DATA_PAL<<8),TGA_RAMDAC_REG); - TGA_WRITE_REG(default_grn[j]|(BT485_DATA_PAL<<8),TGA_RAMDAC_REG); - TGA_WRITE_REG(default_blu[j]|(BT485_DATA_PAL<<8),TGA_RAMDAC_REG); - } - } else { - BT463_LOAD_ADDR(0x0000); - TGA_WRITE_REG((BT463_PALETTE<<2), TGA_RAMDAC_REG); - - for (i = 0; i < 16; i++) { - j = color_table[i]; - TGA_WRITE_REG(default_red[j]|(BT463_PALETTE<<10), TGA_RAMDAC_REG); - TGA_WRITE_REG(default_grn[j]|(BT463_PALETTE<<10), TGA_RAMDAC_REG); - TGA_WRITE_REG(default_blu[j]|(BT463_PALETTE<<10), TGA_RAMDAC_REG); - } - } -} - -void -__set_origin(unsigned short offset) -{ - /* - * should not be called, but if so, do nothing... - */ -} - -/* - * Hide the cursor from view, during blanking, usually... - */ -void -hide_cursor(void) -{ - unsigned long flags; - save_flags(flags); cli(); - - if (tga_type == 0) { - BT485_WRITE(0x20, BT485_CMD_2); - } else { - TGA_WRITE_REG(0x03, TGA_VALID_REG); /* SCANNING and BLANK */ - } - - restore_flags(flags); -} - -void -set_cursor(int currcons) -{ - unsigned int idx, xt, yt, row, col; - unsigned long flags; - - if (currcons != fg_console || console_blanked || vcmode == KD_GRAPHICS) - return; - - if (__real_origin != __origin) - __set_origin(__real_origin); - - save_flags(flags); cli(); - - if (deccm) { - idx = (pos - video_mem_base) >> 1; - col = idx % 80; - row = (idx - col) / 80; - - if (tga_type == 0) { /* 8-plane */ - - xt = col * TGA_F_WIDTH + 64; - yt = row * TGA_F_HEIGHT_PADDED + 64; - - /* make sure it's enabled */ - BT485_WRITE(0x22, BT485_CMD_2); /* WIN cursor type */ - - BT485_WRITE(xt, BT485_CUR_LOW_X); - BT485_WRITE((xt >> 8), BT485_CUR_HIGH_X); - BT485_WRITE(yt, BT485_CUR_LOW_Y); - BT485_WRITE((yt >> 8), BT485_CUR_HIGH_Y); - - } else { - - xt = col * TGA_F_WIDTH + 144; - yt = row * TGA_F_HEIGHT_PADDED + 35; - - TGA_WRITE_REG(0x05, TGA_VALID_REG); /* SCANNING and CURSOR */ - TGA_WRITE_REG(xt | (yt << 12), TGA_CURSOR_XY_REG); - } - - } else - hide_cursor(); - restore_flags(flags); -} - -__initfunc(unsigned long -con_type_init(unsigned long kmem_start, const char **display_desc)) -{ - can_do_color = 1; - - /* - * fake the screen memory with some CPU memory - */ - video_mem_base = kmem_start; - kmem_start += video_screen_size; - video_mem_term = kmem_start; - - video_type = VIDEO_TYPE_TGAC; - - *display_desc = "TGA"; - - return kmem_start; -} - -__initfunc(void -con_type_init_finish(void)) -{ -} - -/* - * NOTE: get_scrmem() and set_scrmem() are here only because - * the VGA version of set_scrmem() has some direct VGA references. - */ -void -get_scrmem(int currcons) -{ - memcpyw((unsigned short *)vc_scrbuf[currcons], - (unsigned short *)origin, video_screen_size); - origin = video_mem_start = (unsigned long)vc_scrbuf[currcons]; - scr_end = video_mem_end = video_mem_start + video_screen_size; - pos = origin + y*video_size_row + (x<<1); -} - -void -set_scrmem(int currcons, long offset) -{ - if (video_mem_term - video_mem_base < offset + video_screen_size) - offset = 0; /* strange ... */ - memcpyw((unsigned short *)(video_mem_base + offset), - (unsigned short *) origin, video_screen_size); - video_mem_start = video_mem_base; - video_mem_end = video_mem_term; - origin = video_mem_base + offset; - scr_end = origin + video_screen_size; - pos = origin + y*video_size_row + (x<<1); -} - -/* - * PIO_FONT support. - * - * for now, we will use/allow *only* our built-in font... - */ -int -set_get_font(char * arg, int set, int ch512) -{ - return -EINVAL; -} - -/* - * Adjust the screen to fit a font of a certain height - * - * Returns < 0 for error, 0 if nothing changed, and the number - * of lines on the adjusted console if changed. - * - * for now, we only support the built-in font... - */ -int -con_adjust_height(unsigned long fontheight) -{ - return -EINVAL; -} - -/* NOTE: - * this is here, and not in console.c, because the VGA version - * tests the controller type to see if color can be done. We *KNOW* - * that we can do color on the TGA... :-) - * - * FIXME? maybe the init codes for VGA and TGA could set - * a flag for (in)ability to do colormap set/get??? - */ - -int -set_get_cmap(unsigned char * arg, int set) { - int i; - - i = verify_area(set ? VERIFY_READ : VERIFY_WRITE, (void *)arg, 16*3); - if (i) - return i; - - for (i=0; i<16; i++) { - if (set) { - get_user(default_red[i], arg++) ; - get_user(default_grn[i], arg++) ; - get_user(default_blu[i], arg++) ; - } else { - put_user (default_red[i], arg++) ; - put_user (default_grn[i], arg++) ; - put_user (default_blu[i], arg++) ; - } - } - if (set) { - for (i=0; ivc_palette[k++] = default_red[j]; - vc_cons[i].d->vc_palette[k++] = default_grn[j]; - vc_cons[i].d->vc_palette[k++] = default_blu[j]; - } - } - set_palette() ; - } - - return 0; -} - -/* - * dummy routines for the VESA blanking code, which is VGA only, - * so we don't have to carry that stuff around for the TGA... - */ -void vesa_powerdown(void) -{ -} -void vesa_blank(void) -{ -} -void vesa_unblank(void) -{ -} -void set_vesa_blanking(const unsigned long arg) -{ -} - - -/* - * See if we have a TGA card. - * Just a placeholder at the moment, because of the strange - * way the TGA card is initialized. This has to be enabled when - * the kernel initializes PCI devices before the console. - */ -__initfunc(int con_is_present(void)) -{ -#if 0 - unsigned char pci_bus, pci_devfn; - int status; - - status = pcibios_find_device (PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC_TGA, - 0, &pci_bus, &pci_devfn); - return (status == PCIBIOS_DEVICE_NOT_FOUND) ? 0 : 1; -#endif - return 1; -} - -/* - * video init code, called from within the PCI bus probing code; - * when TGA console is configured, at the end of the probing code, - * we call here to look for a TGA device, and proceed... - */ -__initfunc(void -tga_console_init(void)) -{ - struct pci_dev *dev; - - /* - * first, find the TGA among the PCI devices... - */ - if (! (dev = pci_find_device(PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC_TGA, NULL))) { - /* PANIC!!! */ - printk("tga_console_init: TGA not found!!! :-(\n"); - return; - } - - /* - * read BASE_REG_0 for memory address - */ - tga_mem_base = dev->base_address[0] & PCI_BASE_ADDRESS_MEM_MASK; -#ifdef DEBUG - printk("tga_console_init: mem_base 0x%lx\n", tga_mem_base); -#endif /* DEBUG */ - - tga_type = (readl(tga_mem_base) >> 12) & 0x0f; - if (tga_type != 0 && tga_type != 1 && tga_type != 3) { - printk("TGA type (0x%x) unrecognized!\n", tga_type); - return; - } - tga_init_video(); - tga_clear_screen(); - - /* - * FINALLY, we can register TGA as console (whew!) - */ -#ifdef CONFIG_VT_CONSOLE - register_console(&vt_console_driver); -#endif -} - -unsigned char PLLbits[7] __initdata = { 0x80, 0x04, 0x00, 0x24, 0x44, 0x80, 0xb8 }; - -const unsigned long bt485_cursor_source[64] __initdata = { - 0x00000000000000ff,0x00000000000000ff,0x00000000000000ff,0x00000000000000ff, - 0x00000000000000ff,0x00000000000000ff,0x00000000000000ff,0x00000000000000ff, - 0x00000000000000ff,0x00000000000000ff,0x00000000000000ff,0x00000000000000ff, - 0x00000000000000ff,0x00000000000000ff,0x00000000000000ff,0x00000000000000ff, - 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,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -}; - -const unsigned int bt463_cursor_source[256] __initdata = { - 0xffff0000, 0x00000000, 0x00000000, 0x00000000, - 0xffff0000, 0x00000000, 0x00000000, 0x00000000, - 0xffff0000, 0x00000000, 0x00000000, 0x00000000, - 0xffff0000, 0x00000000, 0x00000000, 0x00000000, - 0xffff0000, 0x00000000, 0x00000000, 0x00000000, - 0xffff0000, 0x00000000, 0x00000000, 0x00000000, - 0xffff0000, 0x00000000, 0x00000000, 0x00000000, - 0xffff0000, 0x00000000, 0x00000000, 0x00000000, - 0xffff0000, 0x00000000, 0x00000000, 0x00000000, - 0xffff0000, 0x00000000, 0x00000000, 0x00000000, - 0xffff0000, 0x00000000, 0x00000000, 0x00000000, - 0xffff0000, 0x00000000, 0x00000000, 0x00000000, - 0xffff0000, 0x00000000, 0x00000000, 0x00000000, - 0xffff0000, 0x00000000, 0x00000000, 0x00000000, - 0xffff0000, 0x00000000, 0x00000000, 0x00000000, - 0xffff0000, 0x00000000, 0x00000000, 0x00000000, - 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,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,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,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, - 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,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,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -}; - -__initfunc(void -tga_init_video(void)) -{ - int i, j, temp; - unsigned char *cbp; - - tga_regs_base = (tga_mem_base + TGA_REGS_OFFSET); - tga_fb_base = (tga_mem_base + fb_offset_presets[tga_type]); - - /* first, disable video timing */ - TGA_WRITE_REG(0x03, TGA_VALID_REG); /* SCANNING and BLANK */ - - /* write the DEEP register */ - while (TGA_READ_REG(TGA_CMD_STAT_REG) & 1) /* wait for not busy */ - continue; - - mb(); - TGA_WRITE_REG(deep_presets[tga_type], TGA_DEEP_REG); - while (TGA_READ_REG(TGA_CMD_STAT_REG) & 1) /* wait for not busy */ - continue; - mb(); - - /* write some more registers */ - TGA_WRITE_REG(rasterop_presets[tga_type], TGA_RASTEROP_REG); - TGA_WRITE_REG(mode_presets[tga_type], TGA_MODE_REG); - TGA_WRITE_REG(base_addr_presets[tga_type], TGA_BASE_ADDR_REG); - - /* write the PLL for 640x480 @ 60Hz */ - for (i = 0; i <= 6; i++) { - for (j = 0; j <= 7; j++) { - temp = (PLLbits[i] >> (7-j)) & 1; - if (i == 6 && j == 7) - temp |= 2; - TGA_WRITE_REG(temp, TGA_CLOCK_REG); - } - } - - /* write some more registers */ - TGA_WRITE_REG(0xffffffff, TGA_PLANEMASK_REG); - TGA_WRITE_REG(0xffffffff, TGA_PIXELMASK_REG); - TGA_WRITE_REG(0x12345678, TGA_BLOCK_COLOR0_REG); - TGA_WRITE_REG(0x12345678, TGA_BLOCK_COLOR1_REG); - - /* init video timing regs for 640x480 @ 60 Hz */ - TGA_WRITE_REG(0x018608a0, TGA_HORIZ_REG); - TGA_WRITE_REG(0x084251e0, TGA_VERT_REG); - - if (tga_type == 0) { /* 8-plane */ - - tga_bpp = 1; - - /* init BT485 RAMDAC registers */ - BT485_WRITE(0xa2, BT485_CMD_0); - BT485_WRITE(0x01, BT485_ADDR_PAL_WRITE); - BT485_WRITE(0x14, BT485_CMD_3); /* cursor 64x64 */ - BT485_WRITE(0x40, BT485_CMD_1); - BT485_WRITE(0x22, BT485_CMD_2); /* WIN cursor type */ - BT485_WRITE(0xff, BT485_PIXEL_MASK); - - /* fill palette registers */ - BT485_WRITE(0x00, BT485_ADDR_PAL_WRITE); - TGA_WRITE_REG(BT485_DATA_PAL, TGA_RAMDAC_SETUP_REG); - - for (i = 0; i < 16; i++) { - j = color_table[i]; - TGA_WRITE_REG(default_red[j]|(BT485_DATA_PAL<<8), - TGA_RAMDAC_REG); - TGA_WRITE_REG(default_grn[j]|(BT485_DATA_PAL<<8), - TGA_RAMDAC_REG); - TGA_WRITE_REG(default_blu[j]|(BT485_DATA_PAL<<8), - TGA_RAMDAC_REG); - } - for (i = 0; i < 240*3; i += 4) { - TGA_WRITE_REG(0x55|(BT485_DATA_PAL<<8), TGA_RAMDAC_REG); - TGA_WRITE_REG(0x00|(BT485_DATA_PAL<<8), TGA_RAMDAC_REG); - TGA_WRITE_REG(0x00|(BT485_DATA_PAL<<8), TGA_RAMDAC_REG); - TGA_WRITE_REG(0x00|(BT485_DATA_PAL<<8), TGA_RAMDAC_REG); - } - - /* initialize RAMDAC cursor colors */ - BT485_WRITE(0, BT485_ADDR_CUR_WRITE); - - BT485_WRITE(0xaa, BT485_DATA_CUR); /* overscan WHITE */ - BT485_WRITE(0xaa, BT485_DATA_CUR); /* overscan WHITE */ - BT485_WRITE(0xaa, BT485_DATA_CUR); /* overscan WHITE */ - - BT485_WRITE(0x00, BT485_DATA_CUR); /* color 1 BLACK */ - BT485_WRITE(0x00, BT485_DATA_CUR); /* color 1 BLACK */ - BT485_WRITE(0x00, BT485_DATA_CUR); /* color 1 BLACK */ - - BT485_WRITE(0x00, BT485_DATA_CUR); /* color 2 BLACK */ - BT485_WRITE(0x00, BT485_DATA_CUR); /* color 2 BLACK */ - BT485_WRITE(0x00, BT485_DATA_CUR); /* color 2 BLACK */ - - BT485_WRITE(0x00, BT485_DATA_CUR); /* color 3 BLACK */ - BT485_WRITE(0x00, BT485_DATA_CUR); /* color 3 BLACK */ - BT485_WRITE(0x00, BT485_DATA_CUR); /* color 3 BLACK */ - - /* initialize RAMDAC cursor RAM */ - BT485_WRITE(0x00, BT485_ADDR_PAL_WRITE); - cbp = (unsigned char *)bt485_cursor_source; - for (i = 0; i < 512; i++) { - BT485_WRITE(*cbp++, BT485_CUR_RAM); - } - for (i = 0; i < 512; i++) { - BT485_WRITE(0xff, BT485_CUR_RAM); - } - - } else { /* 24-plane or 24plusZ */ - - tga_bpp = 4; - - TGA_WRITE_REG(0x01, TGA_VALID_REG); /* SCANNING */ - - /* - * init some registers - */ - BT463_WRITE(BT463_REG_ACC, BT463_CMD_REG_0, 0x40); - BT463_WRITE(BT463_REG_ACC, BT463_CMD_REG_1, 0x08); - BT463_WRITE(BT463_REG_ACC, BT463_CMD_REG_2, 0x40); - - BT463_WRITE(BT463_REG_ACC, BT463_READ_MASK_0, 0xff); - BT463_WRITE(BT463_REG_ACC, BT463_READ_MASK_1, 0xff); - BT463_WRITE(BT463_REG_ACC, BT463_READ_MASK_2, 0xff); - BT463_WRITE(BT463_REG_ACC, BT463_READ_MASK_3, 0x0f); - - BT463_WRITE(BT463_REG_ACC, BT463_BLINK_MASK_0, 0x00); - BT463_WRITE(BT463_REG_ACC, BT463_BLINK_MASK_1, 0x00); - BT463_WRITE(BT463_REG_ACC, BT463_BLINK_MASK_2, 0x00); - BT463_WRITE(BT463_REG_ACC, BT463_BLINK_MASK_3, 0x00); - - /* - * fill the palette - */ - BT463_LOAD_ADDR(0x0000); - TGA_WRITE_REG((BT463_PALETTE<<2), TGA_RAMDAC_REG); - - for (i = 0; i < 16; i++) { - j = color_table[i]; - TGA_WRITE_REG(default_red[j]|(BT463_PALETTE<<10), - TGA_RAMDAC_REG); - TGA_WRITE_REG(default_grn[j]|(BT463_PALETTE<<10), - TGA_RAMDAC_REG); - TGA_WRITE_REG(default_blu[j]|(BT463_PALETTE<<10), - TGA_RAMDAC_REG); - } - for (i = 0; i < 512*3; i += 4) { - TGA_WRITE_REG(0x55|(BT463_PALETTE<<10), TGA_RAMDAC_REG); - TGA_WRITE_REG(0x00|(BT463_PALETTE<<10), TGA_RAMDAC_REG); - TGA_WRITE_REG(0x00|(BT463_PALETTE<<10), TGA_RAMDAC_REG); - TGA_WRITE_REG(0x00|(BT463_PALETTE<<10), TGA_RAMDAC_REG); - } - - /* - * fill window type table after start of vertical retrace - */ - while (!(TGA_READ_REG(TGA_INTR_STAT_REG) & 0x01)) - continue; - TGA_WRITE_REG(0x01, TGA_INTR_STAT_REG); - mb(); - while (!(TGA_READ_REG(TGA_INTR_STAT_REG) & 0x01)) - continue; - TGA_WRITE_REG(0x01, TGA_INTR_STAT_REG); - - BT463_LOAD_ADDR(BT463_WINDOW_TYPE_BASE); - TGA_WRITE_REG((BT463_REG_ACC<<2), TGA_RAMDAC_SETUP_REG); - - for (i = 0; i < 16; i++) { - TGA_WRITE_REG(0x00|(BT463_REG_ACC<<10), TGA_RAMDAC_REG); - TGA_WRITE_REG(0x01|(BT463_REG_ACC<<10), TGA_RAMDAC_REG); - TGA_WRITE_REG(0x80|(BT463_REG_ACC<<10), TGA_RAMDAC_REG); - } - - /* - * init cursor colors - */ - BT463_LOAD_ADDR(BT463_CUR_CLR_0); - - TGA_WRITE_REG(0x00|(BT463_REG_ACC<<10), TGA_RAMDAC_REG); /* background */ - TGA_WRITE_REG(0x00|(BT463_REG_ACC<<10), TGA_RAMDAC_REG); /* background */ - TGA_WRITE_REG(0x00|(BT463_REG_ACC<<10), TGA_RAMDAC_REG); /* background */ - - TGA_WRITE_REG(0xff|(BT463_REG_ACC<<10), TGA_RAMDAC_REG); /* foreground */ - TGA_WRITE_REG(0xff|(BT463_REG_ACC<<10), TGA_RAMDAC_REG); /* foreground */ - TGA_WRITE_REG(0xff|(BT463_REG_ACC<<10), TGA_RAMDAC_REG); /* foreground */ - - TGA_WRITE_REG(0x00|(BT463_REG_ACC<<10), TGA_RAMDAC_REG); - TGA_WRITE_REG(0x00|(BT463_REG_ACC<<10), TGA_RAMDAC_REG); - TGA_WRITE_REG(0x00|(BT463_REG_ACC<<10), TGA_RAMDAC_REG); - - TGA_WRITE_REG(0x00|(BT463_REG_ACC<<10), TGA_RAMDAC_REG); - TGA_WRITE_REG(0x00|(BT463_REG_ACC<<10), TGA_RAMDAC_REG); - TGA_WRITE_REG(0x00|(BT463_REG_ACC<<10), TGA_RAMDAC_REG); - - /* - * finally, init the cursor shape - */ - temp = tga_fb_base - 1024; /* this assumes video starts at base - and base is beyond memory start*/ - - for (i = 0; i < 256; i++) { - writel(bt463_cursor_source[i], temp + i*4); - } - TGA_WRITE_REG(temp & 0x000fffff, TGA_CURSOR_BASE_REG); - } - - /* finally, enable video scan & cursor - (and pray for the monitor... :-) */ - TGA_WRITE_REG(0x05, TGA_VALID_REG); /* SCANNING and CURSOR */ - - /* oh, and set the globals describing the resolution... :-) */ - tga_fb_width = 640 * tga_bpp; - tga_fb_height = 480; - tga_fb_stride = tga_fb_width / sizeof(int); -} - -__initfunc(void -tga_clear_screen(void)) -{ - register int i, j; - register unsigned int *dst; - - dst = (unsigned int *) ((unsigned long)tga_fb_base); - for (i = 0; i < tga_fb_height; i++, dst += tga_fb_stride) { - for (j = 0; j < tga_fb_stride; j++) { - writel(0, (dst+j)); - } - } - - /* also clear out the "shadow" screen memory */ - memset((char *)video_mem_base, 0, (video_mem_term - video_mem_base)); -} - -/* - * tga_blitc - * - * Displays an ASCII character at a specified character cell - * position. - * - * Called from scr_writew() when the destination is - * the "shadow" screen - */ -static unsigned int -fontmask_bits[16] = { - 0x00000000, - 0xff000000, - 0x00ff0000, - 0xffff0000, - 0x0000ff00, - 0xff00ff00, - 0x00ffff00, - 0xffffff00, - 0x000000ff, - 0xff0000ff, - 0x00ff00ff, - 0xffff00ff, - 0x0000ffff, - 0xff00ffff, - 0x00ffffff, - 0xffffffff -}; - -int -tga_blitc(unsigned int charattr, unsigned long addr) -{ - int row, col, temp, c, attrib; - register unsigned int fgmask, bgmask, data, rowbits; - register unsigned int *dst; - register unsigned char *font_row; - register int i, j, stride; - - c = charattr & 0x00ff; - attrib = (charattr >> 8) & 0x00ff; - - /* - * extract foreground and background indices - * NOTE: we always treat blink/underline bits as color for now... - */ - fgmask = attrib & 0x0f; - bgmask = (attrib >> 4) & 0x0f; - - i = (c & 0xff) << 4; /* NOTE: assumption of 16 bytes per character bitmap */ - - /* - * calculate (row,col) from addr and video_mem_base - */ - temp = (addr - video_mem_base) >> 1; - col = temp % 80; - row = (temp - col) / 80; - - /* - * calculate destination address - */ - dst = (unsigned int *) ( (unsigned long)tga_fb_base - + ( row * tga_fb_width * TGA_F_HEIGHT_PADDED ) - + ( col * TGA_F_WIDTH * tga_bpp) ); - - font_row = (unsigned char *)&tga_builtin_font[i]; - stride = tga_fb_stride; - - if (tga_type == 0) { /* 8-plane */ - - fgmask = fgmask << 8 | fgmask; - fgmask |= fgmask << 16; - bgmask = bgmask << 8 | bgmask; - bgmask |= bgmask << 16; - - for ( j = 0; j < TGA_F_HEIGHT_PADDED; j++ ) { - if (j < TGA_F_HEIGHT) { - rowbits = font_row[j]; - } else { - /* dup the last n rows only if char > 0x7f */ - if (c & 0x80) - rowbits = font_row[j-(TGA_F_HEIGHT_PADDED-TGA_F_HEIGHT)]; - else - rowbits = 0; - } - data = fontmask_bits[(rowbits>>4)&0xf]; - data = (data & fgmask) | (~data & bgmask); - writel(data, dst); - data = fontmask_bits[rowbits&0xf]; - data = (data & fgmask) | (~data & bgmask); - writel(data, (dst+1)); - dst += stride; - } - } else { /* 24-plane */ - - fgmask = (default_red[fgmask] << 16) | - (default_grn[fgmask] << 8) | - (default_blu[fgmask] << 0); - bgmask = (default_red[bgmask] << 16) | - (default_grn[bgmask] << 8) | - (default_blu[bgmask] << 0); - - for ( i = 0; i < TGA_F_HEIGHT_PADDED; i++ ) { - if (i < TGA_F_HEIGHT) { - rowbits = font_row[i]; - } else { - /* dup the last n rows only if char > 0x7f */ - if (c & 0x80) - rowbits = font_row[i-(TGA_F_HEIGHT_PADDED-TGA_F_HEIGHT)]; - else - rowbits = 0; - } - data = 1 << (TGA_F_WIDTH - 1); - for (j = 0; j < TGA_F_WIDTH; j++, data >>= 1) { - if (rowbits & data) - writel(fgmask, (dst+j)); - else - writel(bgmask, (dst+j)); - } - dst += stride; - } - } - return (0); -} - -/* - * font table of displayable characters. - */ -char tga_builtin_font[]={ -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x7e, 0x81, 0xa5, 0x81, 0x81, 0xbd, 0x99, 0x81, 0x81, 0x7e, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x7e, 0xff, 0xdb, 0xff, 0xff, 0xc3, 0xe7, 0xff, 0xff, 0x7e, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x6c, 0xfe, 0xfe, 0xfe, 0xfe, 0x7c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x7c, 0xfe, 0x7c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x18, 0x3c, 0x3c, 0xe7, 0xe7, 0xe7, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x18, 0x3c, 0x7e, 0xff, 0xff, 0x7e, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xc3, 0xc3, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x42, 0x42, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, -0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x99, 0xbd, 0xbd, 0x99, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff, -0x00, 0x00, 0x1e, 0x0e, 0x1a, 0x32, 0x78, 0xcc, 0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x3c, 0x66, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x7e, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x3f, 0x33, 0x3f, 0x30, 0x30, 0x30, 0x30, 0x70, 0xf0, 0xe0, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x7f, 0x63, 0x7f, 0x63, 0x63, 0x63, 0x63, 0x67, 0xe7, 0xe6, 0xc0, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x18, 0x18, 0xdb, 0x3c, 0xe7, 0x3c, 0xdb, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, -0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfe, 0xf8, 0xf0, 0xe0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, -0x00, 0x02, 0x06, 0x0e, 0x1e, 0x3e, 0xfe, 0x3e, 0x1e, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x7f, 0xdb, 0xdb, 0xdb, 0x7b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x00, 0x00, 0x00, 0x00, -0x00, 0x7c, 0xc6, 0x60, 0x38, 0x6c, 0xc6, 0xc6, 0x6c, 0x38, 0x0c, 0xc6, 0x7c, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x0c, 0xfe, 0x0c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x60, 0xfe, 0x60, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x66, 0xff, 0x66, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x38, 0x7c, 0x7c, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0x7c, 0x7c, 0x38, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x18, 0x3c, 0x3c, 0x3c, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, -0x00, 0x66, 0x66, 0x66, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x6c, 0x6c, 0xfe, 0x6c, 0x6c, 0x6c, 0xfe, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, -0x18, 0x18, 0x7c, 0xc6, 0xc2, 0xc0, 0x7c, 0x06, 0x06, 0x86, 0xc6, 0x7c, 0x18, 0x18, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0xc2, 0xc6, 0x0c, 0x18, 0x30, 0x60, 0xc6, 0x86, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x38, 0x6c, 0x6c, 0x38, 0x76, 0xdc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, -0x00, 0x30, 0x30, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x0c, 0x18, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x18, 0x0c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x30, 0x18, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x3c, 0xff, 0x3c, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xce, 0xde, 0xf6, 0xe6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x18, 0x38, 0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x7c, 0xc6, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x7c, 0xc6, 0x06, 0x06, 0x3c, 0x06, 0x06, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x0c, 0x1c, 0x3c, 0x6c, 0xcc, 0xfe, 0x0c, 0x0c, 0x0c, 0x1e, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xfe, 0xc0, 0xc0, 0xc0, 0xfc, 0x06, 0x06, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x38, 0x60, 0xc0, 0xc0, 0xfc, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xfe, 0xc6, 0x06, 0x06, 0x0c, 0x18, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x06, 0x06, 0x0c, 0x78, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x06, 0x0c, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x0c, 0x18, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x7c, 0xc6, 0xc6, 0x0c, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xde, 0xde, 0xde, 0xdc, 0xc0, 0x7c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x66, 0x66, 0x66, 0x66, 0xfc, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xc0, 0xc0, 0xc2, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xf8, 0x6c, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x6c, 0xf8, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 0x68, 0x60, 0x62, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 0x68, 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xde, 0xc6, 0xc6, 0x66, 0x3a, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x1e, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xe6, 0x66, 0x66, 0x6c, 0x78, 0x78, 0x6c, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xf0, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x62, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xc3, 0xe7, 0xff, 0xff, 0xdb, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xc6, 0xe6, 0xf6, 0xfe, 0xde, 0xce, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xd6, 0xde, 0x7c, 0x0c, 0x0e, 0x00, 0x00, -0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x6c, 0x66, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x7c, 0xc6, 0xc6, 0x60, 0x38, 0x0c, 0x06, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xff, 0xdb, 0x99, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0x66, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xdb, 0xdb, 0xff, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xc3, 0xc3, 0x66, 0x3c, 0x18, 0x18, 0x3c, 0x66, 0xc3, 0xc3, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xc3, 0xc3, 0xc3, 0x66, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xff, 0xc3, 0x86, 0x0c, 0x18, 0x30, 0x60, 0xc1, 0xc3, 0xff, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x3c, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x80, 0xc0, 0xe0, 0x70, 0x38, 0x1c, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x3c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x3c, 0x00, 0x00, 0x00, 0x00, -0x10, 0x38, 0x6c, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, -0x30, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xe0, 0x60, 0x60, 0x78, 0x6c, 0x66, 0x66, 0x66, 0x66, 0x7c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc0, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x1c, 0x0c, 0x0c, 0x3c, 0x6c, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x38, 0x6c, 0x64, 0x60, 0xf0, 0x60, 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0xcc, 0x78, 0x00, -0x00, 0x00, 0xe0, 0x60, 0x60, 0x6c, 0x76, 0x66, 0x66, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x18, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x06, 0x06, 0x00, 0x0e, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x66, 0x66, 0x3c, 0x00, -0x00, 0x00, 0xe0, 0x60, 0x60, 0x66, 0x6c, 0x78, 0x78, 0x6c, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xe6, 0xff, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xf0, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0x0c, 0x1e, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x76, 0x66, 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0x60, 0x38, 0x0c, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x10, 0x30, 0x30, 0xfc, 0x30, 0x30, 0x30, 0x30, 0x36, 0x1c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0x66, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xdb, 0xdb, 0xff, 0x66, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x66, 0x3c, 0x18, 0x3c, 0x66, 0xc3, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0xf8, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xcc, 0x18, 0x30, 0x60, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x0e, 0x18, 0x18, 0x18, 0x70, 0x18, 0x18, 0x18, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x70, 0x18, 0x18, 0x18, 0x0e, 0x18, 0x18, 0x18, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0xc6, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xc0, 0xc2, 0x66, 0x3c, 0x0c, 0x06, 0x7c, 0x00, 0x00, -0x00, 0x00, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, -0x00, 0x0c, 0x18, 0x30, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x10, 0x38, 0x6c, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xcc, 0x00, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, -0x00, 0x60, 0x30, 0x18, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, -0x00, 0x38, 0x6c, 0x38, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x60, 0x60, 0x66, 0x3c, 0x0c, 0x06, 0x3c, 0x00, 0x00, 0x00, -0x00, 0x10, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xc6, 0x00, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x60, 0x30, 0x18, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x66, 0x00, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x18, 0x3c, 0x66, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x60, 0x30, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, -0x00, 0xc6, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, -0x38, 0x6c, 0x38, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, -0x18, 0x30, 0x60, 0x00, 0xfe, 0x66, 0x60, 0x7c, 0x60, 0x60, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x3b, 0x1b, 0x7e, 0xd8, 0xdc, 0x77, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x3e, 0x6c, 0xcc, 0xcc, 0xfe, 0xcc, 0xcc, 0xcc, 0xcc, 0xce, 0x00, 0x00, 0x00, 0x00, -0x00, 0x10, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xc6, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x60, 0x30, 0x18, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x30, 0x78, 0xcc, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, -0x00, 0x60, 0x30, 0x18, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xc6, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0x78, 0x00, -0x00, 0xc6, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, -0x00, 0xc6, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x18, 0x18, 0x7e, 0xc3, 0xc0, 0xc0, 0xc0, 0xc3, 0x7e, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, -0x00, 0x38, 0x6c, 0x64, 0x60, 0xf0, 0x60, 0x60, 0x60, 0x60, 0xe6, 0xfc, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xc3, 0x66, 0x3c, 0x18, 0xff, 0x18, 0xff, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, -0x00, 0xfc, 0x66, 0x66, 0x7c, 0x62, 0x66, 0x6f, 0x66, 0x66, 0x66, 0xf3, 0x00, 0x00, 0x00, 0x00, -0x00, 0x0e, 0x1b, 0x18, 0x18, 0x18, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0xd8, 0x70, 0x00, 0x00, -0x00, 0x18, 0x30, 0x60, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, -0x00, 0x0c, 0x18, 0x30, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x18, 0x30, 0x60, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x18, 0x30, 0x60, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x76, 0xdc, 0x00, 0xdc, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, -0x76, 0xdc, 0x00, 0xc6, 0xe6, 0xf6, 0xfe, 0xde, 0xce, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, -0x00, 0x3c, 0x6c, 0x6c, 0x3e, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x38, 0x6c, 0x6c, 0x38, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x30, 0x30, 0x00, 0x30, 0x30, 0x60, 0xc0, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0xc0, 0xc0, 0xc2, 0xc6, 0xcc, 0x18, 0x30, 0x60, 0xce, 0x9b, 0x06, 0x0c, 0x1f, 0x00, 0x00, -0x00, 0xc0, 0xc0, 0xc2, 0xc6, 0xcc, 0x18, 0x30, 0x66, 0xce, 0x96, 0x3e, 0x06, 0x06, 0x00, 0x00, -0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x3c, 0x3c, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x6c, 0xd8, 0x6c, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x6c, 0x36, 0x6c, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, -0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, -0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, -0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, -0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, -0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, -0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xf6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, -0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x18, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, -0x36, 0x36, 0x36, 0x36, 0x36, 0xf6, 0x06, 0xf6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, -0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, -0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x06, 0xf6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, -0x36, 0x36, 0x36, 0x36, 0x36, 0xf6, 0x06, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, -0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, -0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, -0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, -0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, -0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x30, 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, -0x36, 0x36, 0x36, 0x36, 0x36, 0xf7, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xf7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, -0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, -0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x36, 0x36, 0x36, 0x36, 0x36, 0xf7, 0x00, 0xf7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, -0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, -0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, -0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xff, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, -0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x18, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, -0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, -0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, -0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, -0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0xd8, 0xd8, 0xd8, 0xdc, 0x76, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x78, 0xcc, 0xcc, 0xcc, 0xd8, 0xcc, 0xc6, 0xc6, 0xc6, 0xcc, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xfe, 0xc6, 0xc6, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0xfe, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xfe, 0xc6, 0x60, 0x30, 0x18, 0x30, 0x60, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0x70, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xc0, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x7e, 0x18, 0x3c, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xc6, 0x6c, 0x6c, 0x6c, 0x6c, 0xee, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x1e, 0x30, 0x18, 0x0c, 0x3e, 0x66, 0x66, 0x66, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xdb, 0xdb, 0xdb, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x03, 0x06, 0x7e, 0xdb, 0xdb, 0xf3, 0x7e, 0x60, 0xc0, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x1c, 0x30, 0x60, 0x60, 0x7c, 0x60, 0x60, 0x60, 0x30, 0x1c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e, 0x18, 0x18, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x30, 0x18, 0x0c, 0x06, 0x0c, 0x18, 0x30, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0c, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x0e, 0x1b, 0x1b, 0x1b, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, -0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xd8, 0xd8, 0xd8, 0x70, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x7e, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x00, 0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x38, 0x6c, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0xec, 0x6c, 0x6c, 0x3c, 0x1c, 0x00, 0x00, 0x00, 0x00, -0x00, 0xd8, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x70, 0xd8, 0x30, 0x60, 0xc8, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; diff --git a/drivers/char/vc_screen.c b/drivers/char/vc_screen.c index c0a4dc151e82..deb651e4b76f 100644 --- a/drivers/char/vc_screen.c +++ b/drivers/char/vc_screen.c @@ -31,8 +31,10 @@ #include #include #include +#include #include #include +#include #undef attr #undef org @@ -55,18 +57,15 @@ static int vcs_size(struct inode *inode) { int size; -#ifdef CONFIG_FB_CONSOLE - int cons = MINOR(inode->i_rdev) & 127; - - if (cons == 0) - cons = fg_console; + int currcons = MINOR(inode->i_rdev) & 127; + if (currcons == 0) + currcons = fg_console; else - cons--; - if (!vc_cons_allocated(cons)) + currcons--; + if (!vc_cons_allocated(currcons)) return -ENXIO; -#endif - size = get_video_num_lines(cons) * get_video_num_columns(cons); + size = video_num_lines * video_num_columns; if (MINOR(inode->i_rdev) & 128) size = 2*size + HEADER_SIZE; @@ -132,8 +131,8 @@ vcs_read(struct file *file, char *buf, size_t count, loff_t *ppos) } else { if (p < HEADER_SIZE) { char header[HEADER_SIZE]; - header[0] = (char) get_video_num_lines(currcons); - header[1] = (char) get_video_num_columns(currcons); + header[0] = (char) video_num_lines; + header[1] = (char) video_num_columns; getconsxy(currcons, header+2); while (p < HEADER_SIZE && count > 0) { count--; put_user(header[p++], buf++); } @@ -142,7 +141,11 @@ vcs_read(struct file *file, char *buf, size_t count, loff_t *ppos) p -= HEADER_SIZE; org = screen_pos(currcons, p/2, viewed); if ((p & 1) && count > 0) +#ifdef __BIG_ENDIAN + { count--; put_user(func_scr_readw(org++) & 0xff, buf++); } +#else { count--; put_user(func_scr_readw(org++) >> 8, buf++); } +#endif } while (count > 1) { put_user(func_scr_readw(org++), (unsigned short *) buf); @@ -150,7 +153,11 @@ vcs_read(struct file *file, char *buf, size_t count, loff_t *ppos) count -= 2; } if (count > 0) +#ifdef __BIG_ENDIAN + put_user(func_scr_readw(org) >> 8, buf++); +#else put_user(func_scr_readw(org) & 0xff, buf++); +#endif } read = buf - buf0; *ppos += read; @@ -212,8 +219,13 @@ vcs_write(struct file *file, const char *buf, size_t count, loff_t *ppos) char c; count--; get_user(c,buf++); +#ifdef __BIG_ENDIAN + func_scr_writew(c | + (func_scr_readw(org) & 0xff00), org); +#else func_scr_writew((c << 8) | (func_scr_readw(org) & 0xff), org); +#endif org++; } } @@ -227,14 +239,16 @@ vcs_write(struct file *file, const char *buf, size_t count, loff_t *ppos) if (count > 0) { unsigned char c; get_user(c, (const unsigned char*)buf++); +#ifdef __BIG_ENDIAN + func_scr_writew((func_scr_readw(org) & 0xff) | (c << 8), org); +#else func_scr_writew((func_scr_readw(org) & 0xff00) | c, org); +#endif } } -#ifdef CONFIG_FB_CONSOLE if (currcons == fg_console) /* Horribly inefficient if count < screen size. */ update_screen(currcons); -#endif written = buf - buf0; *ppos += written; RETURN( written ); diff --git a/drivers/char/vesa_blank.c b/drivers/char/vesa_blank.c deleted file mode 100644 index eb957180b827..000000000000 --- a/drivers/char/vesa_blank.c +++ /dev/null @@ -1,290 +0,0 @@ -/* - * vesa_blank.c - * - * Exported functions: - * void vesa_blank(void); - * void vesa_unblank(void); - * void vesa_powerdown(void); - * void set_vesa_blanking(const unsigned long arg); - * - * Not all hardware reacts well to this code - activate at your own risk. - * Activation is done using a sufficiently recent version of setterm - * or using a tiny C program like the following. - * ------------------------------------------------------------------------ -|#include -|#include -|main(int argc, char *argv[]) { -| int fd; -| struct { char ten, onoff; } arg; -| -| if (argc != 2) { -| fprintf(stderr, "usage: setvesablank on|vsync|hsync|powerdown|off\n"); -| exit(1); -| } -| if ((fd = open("/dev/console", 0)) < 0) -| fd = 0; -| arg.ten = 10; -| arg.onoff = 0; -| if (!strcmp(argv[1], "on") || !strcmp(argv[1], "vsync")) -| arg.onoff = 1; -| else if (!strcmp(argv[1], "hsync")) -| arg.onoff = 2; -| else if (!strcmp(argv[1], "powerdown")) -| arg.onoff = 3; -| if (ioctl(fd, TIOCLINUX, &arg)) { -| perror("setvesablank: TIOCLINUX"); -| exit(1); -| } -| exit(0); -|} ------------------------------------------------------------------------ -*/ - -#include -#include -#include -#include - -extern unsigned short video_port_reg, video_port_val; - -/* - * This file handles the VESA Power Saving Protocol that lets a - * monitor be powered down whenever not needed for a longer time. - * The VESA protocol defines: - * - * Mode/Status HSync VSync Video - * ------------------------------------------- - * "On" on on active (mode 0) - * "Suspend" {either} on off blank (mode 1) - * { or } off on blank (mode 2) - * "Off" off off blank (mode 3) - * - * Original code taken from the Power Management Utility (PMU) of - * Huang shi chao, delivered together with many new monitor models - * capable of the VESA Power Saving Protocol. - * - * Adapted to Linux by Christoph Rimek (chrimek@toppoint.de) 15-may-94. - * A slightly adapted fragment of his README follows. - * - * Two-stage blanking by todd j. derr (tjd@barefoot.org) 10-oct-95. - -Patch (based on Linux Kernel revision 1.0) for handling the Power Saving -feature of the new monitor generation. The code works on all these monitors -(mine is a Smile 1506) and should run on *all* video adapter cards (change -some i/o-addresses), although tested only on two different VGA-cards: a -cheap Cirrus Logic (5428) and a miro Crystal 8S (S3-805). - -You can choose from two options: - -(1) Setting vesa_blanking_mode to 1 or 2. - The code will save the current setting of your video adapters' - register settings and then program the controller to turn off - the vertical synchronization pulse (mode 1) or horizontal - synchronization pulse (mode 2). Mode 1 should work with most - monitors, but the VESA spec allows mode 2, so it's included for - completeness. You may set this blanking interval in minutes by - echoing the escape sequence 'ESC[9;interval]' to the terminal. - By default this interval is set to 10 minutes. - - If you use one of these modes, you can also set a second interval - by echoing the escape sequence 'ESC[14;interval]' to the terminal. - The monitor will be turned off completely (mode 3) after being in - suspend mode for the specified interval. An interval of 0 disables - this feature which is the default. - - Both intervals may be set within the range of 0..60 minutes. - -(2) Setting vesa_blanking_mode to 3. - If your monitor locally has an Off_Mode timer then you should not - force your video card to send the OFF-signal - your monitor will - power down by itself. - If your monitor cannot handle this and needs the Off-signal directly, - or if you like your monitor to power down immediately when the - blank_timer times out, then you choose this option. - -On the other hand I'd recommend to not choose this second option unless -it is absolutely necessary. Powering down a monitor to the Off_State with -an approx. power consumption of 3-5 Watts is a rather strong action for -the CRT and it should not be done every now and then. If the software only -sends the signal to enter Standby mode, you have the chance to interfere -before the monitor powers down. Do not set a too short period, if you love -your hardware :-)) . - -By default vesa_blanking_mode is set to 0, thus not using any power saving -features. -*/ - -#define seq_port_reg (0x3c4) /* Sequencer register select port */ -#define seq_port_val (0x3c5) /* Sequencer register value port */ -#define video_misc_rd (0x3cc) /* Video misc. read port */ -#define video_misc_wr (0x3c2) /* Video misc. write port */ - -/* structure holding original VGA register settings */ -static struct { - unsigned char SeqCtrlIndex; /* Sequencer Index reg. */ - unsigned char CrtCtrlIndex; /* CRT-Contr. Index reg. */ - unsigned char CrtMiscIO; /* Miscellaneous register */ - unsigned char HorizontalTotal; /* CRT-Controller:00h */ - unsigned char HorizDisplayEnd; /* CRT-Controller:01h */ - unsigned char StartHorizRetrace; /* CRT-Controller:04h */ - unsigned char EndHorizRetrace; /* CRT-Controller:05h */ - unsigned char Overflow; /* CRT-Controller:07h */ - unsigned char StartVertRetrace; /* CRT-Controller:10h */ - unsigned char EndVertRetrace; /* CRT-Controller:11h */ - unsigned char ModeControl; /* CRT-Controller:17h */ - unsigned char ClockingMode; /* Seq-Controller:01h */ -} vga; - -#define VESA_NO_BLANKING 0 -#define VESA_VSYNC_SUSPEND 1 -#define VESA_HSYNC_SUSPEND 2 -#define VESA_POWERDOWN (VESA_HSYNC_SUSPEND | VESA_VSYNC_SUSPEND) - -#define DEFAULT_VESA_BLANKING_MODE VESA_NO_BLANKING - -static int vesa_blanking_mode = DEFAULT_VESA_BLANKING_MODE; -static int suspend_vesa_blanking_mode = DEFAULT_VESA_BLANKING_MODE; -static int vesa_blanked = 0; - -/* routine to blank a vesa screen */ -void vesa_blank(void) -{ - int mode; - - if((mode = vesa_blanking_mode) == 0) - return; - - /* save original values of VGA controller registers */ - if(!vesa_blanked) { - cli(); - vga.SeqCtrlIndex = inb_p(seq_port_reg); - vga.CrtCtrlIndex = inb_p(video_port_reg); - vga.CrtMiscIO = inb_p(video_misc_rd); - sti(); - - outb_p(0x00,video_port_reg); /* HorizontalTotal */ - vga.HorizontalTotal = inb_p(video_port_val); - outb_p(0x01,video_port_reg); /* HorizDisplayEnd */ - vga.HorizDisplayEnd = inb_p(video_port_val); - outb_p(0x04,video_port_reg); /* StartHorizRetrace */ - vga.StartHorizRetrace = inb_p(video_port_val); - outb_p(0x05,video_port_reg); /* EndHorizRetrace */ - vga.EndHorizRetrace = inb_p(video_port_val); - outb_p(0x07,video_port_reg); /* Overflow */ - vga.Overflow = inb_p(video_port_val); - outb_p(0x10,video_port_reg); /* StartVertRetrace */ - vga.StartVertRetrace = inb_p(video_port_val); - outb_p(0x11,video_port_reg); /* EndVertRetrace */ - vga.EndVertRetrace = inb_p(video_port_val); - outb_p(0x17,video_port_reg); /* ModeControl */ - vga.ModeControl = inb_p(video_port_val); - outb_p(0x01,seq_port_reg); /* ClockingMode */ - vga.ClockingMode = inb_p(seq_port_val); - } - - /* assure that video is enabled */ - /* "0x20" is VIDEO_ENABLE_bit in register 01 of sequencer */ - cli(); - outb_p(0x01,seq_port_reg); - outb_p(vga.ClockingMode | 0x20,seq_port_val); - - /* test for vertical retrace in process.... */ - if ((vga.CrtMiscIO & 0x80) == 0x80) - outb_p(vga.CrtMiscIO & 0xef,video_misc_wr); - - /* - * Set to minimum (0) and - * to maximum (incl. overflow) - * Result: turn off vertical sync (VSync) pulse. - */ - if (mode & VESA_VSYNC_SUSPEND) { - outb_p(0x10,video_port_reg); /* StartVertRetrace */ - outb_p(0xff,video_port_val); /* maximum value */ - outb_p(0x11,video_port_reg); /* EndVertRetrace */ - outb_p(0x40,video_port_val); /* minimum (bits 0..3) */ - outb_p(0x07,video_port_reg); /* Overflow */ - outb_p(vga.Overflow | 0x84,video_port_val); /* bits 9,10 of */ - /* vert. retrace */ - } - - if (mode & VESA_HSYNC_SUSPEND) { - /* - * Set to minimum (0) and - * to maximum - * Result: turn off horizontal sync (HSync) pulse. - */ - outb_p(0x04,video_port_reg); /* StartHorizRetrace */ - outb_p(0xff,video_port_val); /* maximum */ - outb_p(0x05,video_port_reg); /* EndHorizRetrace */ - outb_p(0x00,video_port_val); /* minimum (0) */ - } - - /* restore both index registers */ - outb_p(vga.SeqCtrlIndex,seq_port_reg); - outb_p(vga.CrtCtrlIndex,video_port_reg); - sti(); - - vesa_blanked = mode; -} - -/* routine to unblank a vesa screen */ -void vesa_unblank(void) -{ - if (!vesa_blanked) - return; - - /* restore original values of VGA controller registers */ - cli(); - outb_p(vga.CrtMiscIO,video_misc_wr); - - outb_p(0x00,video_port_reg); /* HorizontalTotal */ - outb_p(vga.HorizontalTotal,video_port_val); - outb_p(0x01,video_port_reg); /* HorizDisplayEnd */ - outb_p(vga.HorizDisplayEnd,video_port_val); - outb_p(0x04,video_port_reg); /* StartHorizRetrace */ - outb_p(vga.StartHorizRetrace,video_port_val); - outb_p(0x05,video_port_reg); /* EndHorizRetrace */ - outb_p(vga.EndHorizRetrace,video_port_val); - outb_p(0x07,video_port_reg); /* Overflow */ - outb_p(vga.Overflow,video_port_val); - outb_p(0x10,video_port_reg); /* StartVertRetrace */ - outb_p(vga.StartVertRetrace,video_port_val); - outb_p(0x11,video_port_reg); /* EndVertRetrace */ - outb_p(vga.EndVertRetrace,video_port_val); - outb_p(0x17,video_port_reg); /* ModeControl */ - outb_p(vga.ModeControl,video_port_val); - outb_p(0x01,seq_port_reg); /* ClockingMode */ - outb_p(vga.ClockingMode,seq_port_val); - - /* restore index/control registers */ - outb_p(vga.SeqCtrlIndex,seq_port_reg); - outb_p(vga.CrtCtrlIndex,video_port_reg); - sti(); - - vesa_blanked = 0; -} - -void set_vesa_blanking(const unsigned long arg) -{ - unsigned char *argp = (unsigned char *)(arg + 1); - unsigned int mode; - - if (verify_area(VERIFY_READ, argp, 1)) - return; - - get_user(mode, argp); - vesa_blanking_mode = suspend_vesa_blanking_mode = - ((mode <= VESA_POWERDOWN) ? mode : DEFAULT_VESA_BLANKING_MODE); -} - -void vesa_powerdown(void) -{ - if(vesa_blanking_mode == VESA_VSYNC_SUSPEND - || vesa_blanking_mode == VESA_HSYNC_SUSPEND) - { - vesa_blanking_mode = VESA_POWERDOWN; - vesa_blank(); - vesa_blanking_mode = suspend_vesa_blanking_mode; - } -} diff --git a/drivers/char/vga.c b/drivers/char/vga.c deleted file mode 100644 index 8efc04f11a99..000000000000 --- a/drivers/char/vga.c +++ /dev/null @@ -1,635 +0,0 @@ -/* - * linux/drivers/char/vga.c - * - * Copyright (C) 1991, 1992 Linus Torvalds - * 1995 Jay Estabrook - */ - -/* - * vga.c - * - * This module exports the console low-level io support for VGA - * - * 'int con_get_font(char *data)' - * 'int con_set_font(char *data, int ch512)' - * 'int con_adjust_height(int fontheight)' - * - * 'int con_get_cmap(char *)' - * 'int con_set_cmap(char *)' - * - * 'int reset_palette(int currcons)' - * 'void set_palette(void)' - * - * User definable mapping table and font loading by Eugene G. Crosser, - * - * - * Improved loadable font/UTF-8 support by H. Peter Anvin - * Feb-Sep 1995 - * - * Colour palette handling, by Simon Tatham - * 17-Jun-95 - * - * if 512 char mode is already enabled don't re-enable it, - * because it causes screen to flicker, by Mitja Horvat - * 5-May-96 - * - * Use 2 outw instead of 4 outb_p to reduce erroneous text - * flashing on RHS of screen during heavy console scrolling . - * Oct 1996, Paul Gortmaker. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#define CAN_LOAD_EGA_FONTS /* undefine if the user must not do this */ -#define CAN_LOAD_PALETTE /* undefine if the user must not do this */ - -#define dac_reg (0x3c8) -#define dac_val (0x3c9) - -#ifdef __powerpc__ -#define VGA_OFFSET 0xC0000000; -#else -#define VGA_OFFSET 0x0 -#endif - -/* - * By replacing the four outb_p with two back to back outw, we can reduce - * the window of opportunity to see text mislocated to the RHS of the - * console during heavy scrolling activity. However there is the remote - * possibility that some pre-dinosaur hardware won't like the back to back - * I/O. Since the Xservers get away with it, we should be able to as well. - */ -static inline void write_vga(unsigned char reg, unsigned int val) -{ -#ifndef SLOW_VGA - unsigned int v1, v2; - - v1 = reg + (val & 0xff00); - v2 = reg + 1 + ((val << 8) & 0xff00); - outw(v1, video_port_reg); - outw(v2, video_port_reg); -#else - outb_p(reg, video_port_reg); - outb_p(val >> 8, video_port_val); - outb_p(reg+1, video_port_reg); - outb_p(val & 0xff, video_port_val); -#endif -} - -void -set_palette (void) -{ - int i, j ; - - if (video_type != VIDEO_TYPE_VGAC || console_blanked || - vt_cons[fg_console]->vc_mode == KD_GRAPHICS) - return ; - - for (i=j=0; i<16; i++) { - outb_p (color_table[i], dac_reg) ; - outb_p (vc_cons[fg_console].d->vc_palette[j++]>>2, dac_val) ; - outb_p (vc_cons[fg_console].d->vc_palette[j++]>>2, dac_val) ; - outb_p (vc_cons[fg_console].d->vc_palette[j++]>>2, dac_val) ; - } -} - -void -__set_origin(unsigned short offset) -{ - clear_selection(); - - __origin = offset; - write_vga(12, offset); -} - -/* - * Put the cursor just beyond the end of the display adaptor memory. - */ -void -hide_cursor(void) -{ - /* This is inefficient, we could just put the cursor at 0xffff, - but perhaps the delays due to the inefficiency are useful for - some hardware... */ - write_vga(14, (video_mem_term - video_mem_base - 1)>>1); -} - -void -set_cursor(int currcons) -{ - if (currcons != fg_console || console_blanked || vcmode == KD_GRAPHICS) - return; - if (__real_origin != __origin) - __set_origin(__real_origin); - if (deccm) { - write_vga(14, (pos - video_mem_base)>>1); - } else - hide_cursor(); -} - -__initfunc(int con_is_present(void)) -{ - unsigned short saved; - unsigned short *p; - - /* - * Find out if there is a graphics card present. - * Are there smarter methods around? - */ - p = (unsigned short *) video_mem_base; - saved = scr_readw(p); - scr_writew(0xAA55, p); - if (scr_readw(p) != 0xAA55) { - scr_writew(saved, p); - return 0; - } - scr_writew(0x55AA, p); - if (scr_readw(p) != 0x55AA) { - scr_writew(saved, p); - return 0; - } - scr_writew(saved, p); - return 1; -} - -__initfunc(unsigned long -con_type_init(unsigned long kmem_start, const char **display_desc)) -{ - if (ORIG_VIDEO_MODE == 7) /* Is this a monochrome display? */ - { - video_mem_base = 0xb0000 + VGA_OFFSET; - video_port_reg = 0x3b4; - video_port_val = 0x3b5; - if ((ORIG_VIDEO_EGA_BX & 0xff) != 0x10) - { - video_type = VIDEO_TYPE_EGAM; - video_mem_term = 0xb8000 + VGA_OFFSET; - *display_desc = "EGA+"; - request_region(0x3b0,16,"ega"); - } - else - { - video_type = VIDEO_TYPE_MDA; - video_mem_term = 0xb2000 + VGA_OFFSET; - *display_desc = "*MDA"; - request_region(0x3b0,12,"mda"); - request_region(0x3bf, 1,"mda"); - } - } - else /* If not, it is color. */ - { - can_do_color = 1; - video_mem_base = 0xb8000 + VGA_OFFSET; - video_port_reg = 0x3d4; - video_port_val = 0x3d5; - if ((ORIG_VIDEO_EGA_BX & 0xff) != 0x10) - { - int i ; - - video_mem_term = 0xc0000 + VGA_OFFSET; - - if (!ORIG_VIDEO_ISVGA) { - video_type = VIDEO_TYPE_EGAC; - *display_desc = "EGA"; - request_region(0x3c0,32,"ega"); - } else { - video_type = VIDEO_TYPE_VGAC; - *display_desc = "VGA+"; - request_region(0x3c0,32,"vga+"); - -#ifdef VGA_CAN_DO_64KB - /* - * get 64K rather than 32K of video RAM. - * This doesn't actually work on all "VGA" - * controllers (it seems like setting MM=01 - * and COE=1 isn't necessarily a good idea) - */ - video_mem_base = 0xa0000 + VGA_OFFSET; - video_mem_term = 0xb0000 + VGA_OFFSET; - outb_p (6, 0x3ce) ; - outb_p (6, 0x3cf) ; -#endif - - /* - * Normalise the palette registers, to point - * the 16 screen colours to the first 16 - * DAC entries. - */ - - for (i=0; i<16; i++) { - inb_p (0x3da) ; - outb_p (i, 0x3c0) ; - outb_p (i, 0x3c0) ; - } - outb_p (0x20, 0x3c0) ; - - /* now set the DAC registers back to their - * default values */ - - for (i=0; i<16; i++) { - outb_p (color_table[i], 0x3c8) ; - outb_p (default_red[i], 0x3c9) ; - outb_p (default_grn[i], 0x3c9) ; - outb_p (default_blu[i], 0x3c9) ; - } - } - } - else - { - video_type = VIDEO_TYPE_CGA; - video_mem_term = 0xba000 + VGA_OFFSET; - *display_desc = "*CGA"; - request_region(0x3d4,2,"cga"); - } - } - return kmem_start; -} - -__initfunc(void -con_type_init_finish(void)) -{ -} - -void -get_scrmem(int currcons) -{ - memcpyw((unsigned short *)vc_scrbuf[currcons], - (unsigned short *)origin, video_screen_size); - origin = video_mem_start = (unsigned long)vc_scrbuf[currcons]; - scr_end = video_mem_end = video_mem_start + video_screen_size; - pos = origin + y*video_size_row + (x<<1); -} - -void -set_scrmem(int currcons, long offset) -{ -#ifdef CONFIG_HGA - /* This works with XFree86 1.2, 1.3 and 2.0 - This code could be extended and made more generally useful if we could - determine the actual video mode. It appears that this should be - possible on a genuine Hercules card, but I (WM) haven't been able to - read from any of the required registers on my clone card. - */ - /* This code should work with Hercules and MDA cards. */ - if (video_type == VIDEO_TYPE_MDA) - { - if (vcmode == KD_TEXT) - { - /* Ensure that the card is in text mode. */ - int i; - static char herc_txt_tbl[12] = { - 0x61,0x50,0x52,0x0f,0x19,6,0x19,0x19,2,0x0d,0x0b,0x0c }; - outb_p(0, 0x3bf); /* Back to power-on defaults */ - outb_p(0, 0x3b8); /* Blank the screen, select page 0, etc */ - for ( i = 0 ; i < 12 ; i++ ) - { - outb_p(i, 0x3b4); - outb_p(herc_txt_tbl[i], 0x3b5); - } - } -#define HGA_BLINKER_ON 0x20 -#define HGA_SCREEN_ON 8 - /* Make sure that the hardware is not blanked */ - outb_p(HGA_BLINKER_ON | HGA_SCREEN_ON, 0x3b8); - } -#endif CONFIG_HGA - - if (video_mem_term - video_mem_base < offset + video_screen_size) - offset = 0; /* strange ... */ - memcpyw((unsigned short *)(video_mem_base + offset), - (unsigned short *) origin, video_screen_size); - video_mem_start = video_mem_base; - video_mem_end = video_mem_term; - origin = video_mem_base + offset; - scr_end = origin + video_screen_size; - pos = origin + y*video_size_row + (x<<1); - has_wrapped = 0; -} - -/* - * PIO_FONT support. - * - * The font loading code goes back to the codepage package by - * Joel Hoffman (joel@wam.umd.edu). (He reports that the original - * reference is: "From: p. 307 of _Programmer's Guide to PC & PS/2 - * Video Systems_ by Richard Wilton. 1987. Microsoft Press".) - * - * Change for certain monochrome monitors by Yury Shevchuck - * (sizif@botik.yaroslavl.su). - */ - -#define colourmap ((char *)0xa0000) -/* Pauline Middelink reports that we - should use 0xA0000 for the bwmap as well.. */ -#define blackwmap ((char *)0xa0000) -#define cmapsz 8192 -#define attrib_port (0x3c0) -#define seq_port_reg (0x3c4) -#define seq_port_val (0x3c5) -#define gr_port_reg (0x3ce) -#define gr_port_val (0x3cf) - -int -set_get_font(char * arg, int set, int ch512) -{ -#ifdef CAN_LOAD_EGA_FONTS - static int ch512enabled = 0; - int i; - char *charmap; - int beg; - unsigned short video_port_status = video_port_reg + 6; - int font_select = 0x00; - - /* no use to "load" CGA... */ - - if (video_type == VIDEO_TYPE_EGAC || video_type == VIDEO_TYPE_VGAC) { - charmap = colourmap; - beg = 0x0e; -#ifdef VGA_CAN_DO_64KB - if (video_type == VIDEO_TYPE_VGAC) - beg = 0x06; -#endif - } else if (video_type == VIDEO_TYPE_EGAM) { - charmap = blackwmap; - beg = 0x0a; - } else - return -EINVAL; - - if (arg) - { - i = verify_area(set ? VERIFY_READ : VERIFY_WRITE, (void *)arg, - ch512 ? 2*cmapsz : cmapsz); - if (i) - return i; - } - else - ch512 = 0; /* Default font is always 256 */ - -#ifdef BROKEN_GRAPHICS_PROGRAMS - /* - * All fonts are loaded in slot 0 (0:1 for 512 ch) - */ - - if (!arg) - return -EINVAL; /* Return to default font not supported */ - - video_font_is_default = 0; - font_select = ch512 ? 0x04 : 0x00; -#else - /* - * The default font is kept in slot 0 and is never touched. - * A custom font is loaded in slot 2 (256 ch) or 2:3 (512 ch) - */ - - if (set) - { - video_font_is_default = !arg; - font_select = arg ? (ch512 ? 0x0e : 0x0a) : 0x00; - } - - if ( !video_font_is_default ) - charmap += 4*cmapsz; -#endif - - cli(); - outb_p( 0x00, seq_port_reg ); /* First, the sequencer */ - outb_p( 0x01, seq_port_val ); /* Synchronous reset */ - outb_p( 0x02, seq_port_reg ); - outb_p( 0x04, seq_port_val ); /* CPU writes only to map 2 */ - outb_p( 0x04, seq_port_reg ); - outb_p( 0x07, seq_port_val ); /* Sequential addressing */ - outb_p( 0x00, seq_port_reg ); - outb_p( 0x03, seq_port_val ); /* Clear synchronous reset */ - - outb_p( 0x04, gr_port_reg ); /* Now, the graphics controller */ - outb_p( 0x02, gr_port_val ); /* select map 2 */ - outb_p( 0x05, gr_port_reg ); - outb_p( 0x00, gr_port_val ); /* disable odd-even addressing */ - outb_p( 0x06, gr_port_reg ); - outb_p( 0x00, gr_port_val ); /* map start at A000:0000 */ - sti(); - - if (arg) - { - if (set) - for (i=0; i 32 || (video_type != VIDEO_TYPE_VGAC && - video_type != VIDEO_TYPE_EGAC && video_type != VIDEO_TYPE_EGAM)) - return -EINVAL; - - if ( fontheight == video_font_height || fontheight == 0 ) - return 0; - - video_font_height = fontheight; - - rows = video_scan_lines/fontheight; /* Number of video rows we end up with */ - maxscan = rows*fontheight - 1; /* Scan lines to actually display-1 */ - - /* Reprogram the CRTC for the new font size - Note: the attempt to read the overflow register will fail - on an EGA, but using 0xff for the previous value appears to - be OK for EGA text modes in the range 257-512 scan lines, so I - guess we don't need to worry about it. - - The same applies for the spill bits in the font size and cursor - registers; they are write-only on EGA, but it appears that they - are all don't care bits on EGA, so I guess it doesn't matter. */ - - cli(); - outb_p( 0x07, video_port_reg ); /* CRTC overflow register */ - ovr = inb_p(video_port_val); - outb_p( 0x09, video_port_reg ); /* Font size register */ - fsr = inb_p(video_port_val); - outb_p( 0x0a, video_port_reg ); /* Cursor start */ - curs = inb_p(video_port_val); - outb_p( 0x0b, video_port_reg ); /* Cursor end */ - cure = inb_p(video_port_val); - sti(); - - vde = maxscan & 0xff; /* Vertical display end reg */ - ovr = (ovr & 0xbd) + /* Overflow register */ - ((maxscan & 0x100) >> 7) + - ((maxscan & 0x200) >> 3); - fsr = (fsr & 0xe0) + (fontheight-1); /* Font size register */ - curs = (curs & 0xc0) + fontheight - (fontheight < 10 ? 2 : 3); - cure = (cure & 0xe0) + fontheight - (fontheight < 10 ? 1 : 2); - - cli(); - outb_p( 0x07, video_port_reg ); /* CRTC overflow register */ - outb_p( ovr, video_port_val ); - outb_p( 0x09, video_port_reg ); /* Font size */ - outb_p( fsr, video_port_val ); - outb_p( 0x0a, video_port_reg ); /* Cursor start */ - outb_p( curs, video_port_val ); - outb_p( 0x0b, video_port_reg ); /* Cursor end */ - outb_p( cure, video_port_val ); - outb_p( 0x12, video_port_reg ); /* Vertical display limit */ - outb_p( vde, video_port_val ); - sti(); - - if ( rows == video_num_lines ) { - /* Change didn't affect number of lines -- no need to scare - the rest of the world */ - return 0; - } - - vc_resize(rows, 0); /* Adjust console size */ - - return rows; -} - -int -set_get_cmap(unsigned char * arg, int set) { -#ifdef CAN_LOAD_PALETTE - int i; - - /* no use to set colourmaps in less than colour VGA */ - - if (video_type != VIDEO_TYPE_VGAC) - return -EINVAL; - - i = verify_area(set ? VERIFY_READ : VERIFY_WRITE, (void *)arg, 16*3); - if (i) - return i; - - for (i=0; i<16; i++) { - if (set) { - get_user(default_red[i], arg++) ; - get_user(default_grn[i], arg++) ; - get_user(default_blu[i], arg++) ; - } else { - put_user (default_red[i], arg++) ; - put_user (default_grn[i], arg++) ; - put_user (default_blu[i], arg++) ; - } - } - if (set) { - for (i=0; ivc_palette[k++] = default_red[j]; - vc_cons[i].d->vc_palette[k++] = default_grn[j]; - vc_cons[i].d->vc_palette[k++] = default_blu[j]; - } - } - set_palette() ; - } - - return 0; -#else - return -EINVAL; -#endif -} diff --git a/drivers/char/vt.c b/drivers/char/vt.c index fd3002d05676..0c1b6d82015b 100644 --- a/drivers/char/vt.c +++ b/drivers/char/vt.c @@ -416,7 +416,11 @@ do_fontx_ioctl(int cmd, struct consolefontdesc *user_cfd, int perm) if (i) return i; i = con_adjust_height(cfdarg.charheight); - return (i <= 0) ? i : kd_size_changed(i, 0); + /* + * ++Geert: vc_resize_con() will take note of the + * changed screen size, if necessary + */ + return (i <= 0) ? i : 0; } else return -EINVAL; case GIO_FONTX: @@ -1013,7 +1017,10 @@ int vt_ioctl(struct tty_struct *tty, struct file * file, if (i) return i; i = con_adjust_height(default_font_height); - if ( i > 0 ) kd_size_changed(i, 0); + /* + * ++Geert: vc_resize_con() will take note of the + * changed screen size, if necessary + */ con_set_default_unimap(); return 0; diff --git a/drivers/char/wdt.c b/drivers/char/wdt.c index e48f22a0fd7a..86ce2974448c 100644 --- a/drivers/char/wdt.c +++ b/drivers/char/wdt.c @@ -184,7 +184,7 @@ static ssize_t wdt_write(struct file *file, const char *buf, size_t count, loff_ } /* - * Read reports the temperature in farenheit + * Read reports the temperature in degrees Fahrenheit. */ static ssize_t wdt_read(struct file *file, char *buf, size_t count, loff_t *ptr) diff --git a/drivers/macintosh/aty.c b/drivers/macintosh/aty.c index abfb90f2bb72..daba7d5011dd 100644 --- a/drivers/macintosh/aty.c +++ b/drivers/macintosh/aty.c @@ -11,16 +11,16 @@ * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. */ -#include /* for CONFIG_CHIP_ID and CONFIG_STAT0 */ +#include #include #include #include #include -#include #include #include #include #include +#include #include #include #include @@ -28,6 +28,9 @@ #include #include "pmac-cons.h" #include "aty.h" +#ifdef CONFIG_ABSCON_COMPAT +#include +#endif struct aty_cmap_regs { unsigned char windex; @@ -708,7 +711,8 @@ aty_init() pmac_init_palette(); /* Initialize colormap */ /* clear screen */ - fb_start = frame_buffer + (((n_scanlines % 16) * line_pitch) >> 1); + fb_start = frame_buffer + ((chip_type == MACH64_GX_ID) ? + init->offset[color_mode] : 0); memsetw((unsigned short *) fb_start, 0, total_vram); display_info.height = n_scanlines; diff --git a/drivers/macintosh/chips.c b/drivers/macintosh/chips.c index 2599e4d51d56..0ea2987672c4 100644 --- a/drivers/macintosh/chips.c +++ b/drivers/macintosh/chips.c @@ -8,13 +8,15 @@ * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. */ +#include #include #include #include #include -#include #include #include +#include +#include #include #include #include @@ -25,6 +27,7 @@ #include #include "pmac-cons.h" #include "chips.h" +#include static unsigned char *frame_buffer; diff --git a/drivers/macintosh/control.c b/drivers/macintosh/control.c index abac1f5f3e04..a3b23a8f198a 100644 --- a/drivers/macintosh/control.c +++ b/drivers/macintosh/control.c @@ -12,8 +12,8 @@ #include #include #include -#include #include +#include #include #include #include @@ -23,6 +23,7 @@ #include #include "pmac-cons.h" #include "control.h" +#include /* * Structure of the registers for the RADACAL colormap device. diff --git a/drivers/macintosh/imstt.c b/drivers/macintosh/imstt.c index 3ab33feebe4e..1792c4dbaba2 100644 --- a/drivers/macintosh/imstt.c +++ b/drivers/macintosh/imstt.c @@ -9,15 +9,16 @@ * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. */ + #include #include #include #include #include -#include #include #include +#include #include #include #include @@ -27,6 +28,7 @@ #include #include "pmac-cons.h" #include "imstt.h" +#include enum { diff --git a/drivers/macintosh/platinum.c b/drivers/macintosh/platinum.c index d1a60cf4d03b..3ae404562601 100644 --- a/drivers/macintosh/platinum.c +++ b/drivers/macintosh/platinum.c @@ -12,8 +12,8 @@ #include #include #include -#include #include +#include #include #include #include @@ -21,6 +21,7 @@ #include #include "pmac-cons.h" #include "platinum.h" +#include /* * Structure of the registers for the DACula colormap device. @@ -37,7 +38,7 @@ struct cmap_regs { }; /* - * Structure of the registers for the "platinum" display adaptor". + * Structure of the registers for the "platinum" display adaptor. */ #define PAD(x) char x[12] @@ -424,7 +425,7 @@ map_platinum(struct device_node *dp) cmap_regs = ioremap(cmap_regs_phys, 0x1000); /* Grok total video ram */ - plat_regs->reg[16].r = (unsigned)frame_buffer; + plat_regs->reg[16].r = (unsigned)frame_buffer_phys; plat_regs->reg[20].r = 0x1011; /* select max vram */ plat_regs->reg[24].r = 0; /* switch in vram */ eieio(); @@ -521,7 +522,7 @@ platinum_init() for (i = 0; i < 26; ++i) plat_regs->reg[i+32].r = init->regs[i]; plat_regs->reg[26+32].r = (one_mb ? init->plat_offset[color_mode] + 4 - color_mode : init->plat_offset[color_mode]); - plat_regs->reg[16].r = (unsigned) frame_buffer; + plat_regs->reg[16].r = (unsigned) frame_buffer_phys + init->fb_offset; plat_regs->reg[18].r = line_pitch; plat_regs->reg[19].r = (one_mb ? init->mode[color_mode+1] : init->mode[color_mode]); plat_regs->reg[20].r = (one_mb ? 0x11 : 0x1011); diff --git a/drivers/macintosh/pmac-cons.c b/drivers/macintosh/pmac-cons.c index 8ab4dd2cb7af..094be24d8afa 100644 --- a/drivers/macintosh/pmac-cons.c +++ b/drivers/macintosh/pmac-cons.c @@ -12,9 +12,9 @@ #include #include #include -#include #include #include +#include #include #include #include @@ -40,6 +40,7 @@ #ifdef CONFIG_IMSTT_VIDEO #include "imstt.h" #endif +#include int video_mode = VMODE_NVRAM; int color_mode = CMODE_NVRAM; @@ -320,7 +321,7 @@ set_cursor(int currcons) hide_cursor(); } else { old_cursor = cursor_pos; - cursor_pos = (pos - video_mem_base) >> 1; + cursor_pos = (pos - video_mem_start) >> 1; if (old_cursor != -1) invert_cursor(-1); invert_cursor(cursor_pos); @@ -394,7 +395,7 @@ set_get_cmap(unsigned char *p, int set) } int -set_get_font(char *p, int set, int ch512) +set_get_font(unsigned char *p, int set, int ch512) { return 0; } diff --git a/drivers/macintosh/valkyrie.c b/drivers/macintosh/valkyrie.c index 1e8e8b6af833..9a0085d4aa71 100644 --- a/drivers/macintosh/valkyrie.c +++ b/drivers/macintosh/valkyrie.c @@ -12,8 +12,8 @@ #include #include #include -#include #include +#include #include #include #include @@ -23,6 +23,7 @@ #include #include "pmac-cons.h" #include "valkyrie.h" +#include /* * Structure of the registers for the Valkyrie colormap registers. diff --git a/drivers/net/3c505.c b/drivers/net/3c505.c index d28bb2c52d5a..a1a822fa01f3 100644 --- a/drivers/net/3c505.c +++ b/drivers/net/3c505.c @@ -1,9 +1,9 @@ /* - * Linux ethernet device driver for the 3Com Etherlink Plus (3C505) + * Linux Ethernet device driver for the 3Com Etherlink Plus (3C505) * By Craig Southeren, Juha Laiho and Philip Blundell * * 3c505.c This module implements an interface to the 3Com - * Etherlink Plus (3c505) ethernet card. Linux device + * Etherlink Plus (3c505) Ethernet card. Linux device * driver interface reverse engineered from the Linux 3C509 * device drivers. Some 3C505 information gleaned from * the Crynwr packet driver. Still this driver would not @@ -1568,7 +1568,7 @@ __initfunc(int elplus_probe(struct device *dev)) outb_control(adapter->hcr_val & ~CMDE, dev); /* - * copy ethernet address into structure + * copy Ethernet address into structure */ for (i = 0; i < 6; i++) dev->dev_addr[i] = adapter->rx_pcb.data.eth_addr[i]; diff --git a/drivers/net/3c505.h b/drivers/net/3c505.h index bea9b5031da2..3ff5bd19d24c 100644 --- a/drivers/net/3c505.h +++ b/drivers/net/3c505.h @@ -216,7 +216,7 @@ struct Memdump { /* Primary Command Block. The most important data structure. All communication between the host and the adapter is done with these. (Except for the actual -ethernet data, which has different packaging.) +Ethernet data, which has different packaging.) */ typedef struct { byte command; diff --git a/drivers/net/Config.in b/drivers/net/Config.in index bb65cb876ad2..7ba1889228e9 100644 --- a/drivers/net/Config.in +++ b/drivers/net/Config.in @@ -188,6 +188,7 @@ bool 'Token Ring driver support' CONFIG_TR if [ "$CONFIG_TR" = "y" ]; then tristate 'IBM Tropic chipset based adaptor support' CONFIG_IBMTR # tristate 'IBM Lanstreamer PCI adaptor support' CONFIG_IBMLS + tristate 'SysKonnect adapter support' CONFIG_SKTR fi if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then diff --git a/drivers/net/Makefile b/drivers/net/Makefile index 263448930cb7..70b955ca8b78 100644 --- a/drivers/net/Makefile +++ b/drivers/net/Makefile @@ -61,6 +61,14 @@ else endif endif +ifeq ($(CONFIG_SKTR),y) +L_OBJS += sktr.o +else + ifeq ($(CONFIG_SKTR),m) + M_OBJS += sktr.o + endif +endif + ifeq ($(CONFIG_ETHERTAP),y) L_OBJS += ethertap.o else diff --git a/drivers/net/Space.c b/drivers/net/Space.c index 88406fc804d4..d50184f27ea3 100644 --- a/drivers/net/Space.c +++ b/drivers/net/Space.c @@ -550,6 +550,9 @@ trif_probe(struct device *dev) if (1 #ifdef CONFIG_IBMTR && ibmtr_probe(dev) +#endif +#ifdef CONFIG_SKTR + && sktr_probe(dev) #endif && 1 ) { return 1; /* -ENODEV or -EAGAIN would be more accurate. */ diff --git a/drivers/net/eexpress.c b/drivers/net/eexpress.c index d38cee9bcc85..38c2b80b85f9 100644 --- a/drivers/net/eexpress.c +++ b/drivers/net/eexpress.c @@ -65,7 +65,7 @@ * Note by Zoltan Szilagyi 10-12-96: * * I've succeeded in eliminating the "CU wedged" messages, and hence the - * lockups, which were only occuring with cards running in 8-bit mode ("force + * lockups, which were only occurring with cards running in 8-bit mode ("force * 8-bit operation" in Intel's SoftSet utility). This version of the driver * sets the 82586 and the ASIC to 8-bit mode at startup; it also stops the * CU before submitting a packet for transmission, and then restarts it as soon diff --git a/drivers/net/sdla_fr.c b/drivers/net/sdla_fr.c index 36b74b90e3ca..303fac4c1f51 100644 --- a/drivers/net/sdla_fr.c +++ b/drivers/net/sdla_fr.c @@ -53,7 +53,7 @@ * This caused the If_send() routine to get into* the if clause for it(0,dev->tbusy) * forever. * The code got into this stage due to an -* interrupt occuring within the if clause for +* interrupt occurring within the if clause for * set_bit(0,dev->tbusy). Since an interrupt * disables furhter transmit interrupt and * makes dev->tbusy = 0, this effect was undone * by making dev->tbusy = 1 in the if clause. @@ -1224,7 +1224,7 @@ static void switch_net_numbers(unsigned char *sendpacket, unsigned long network_ } /* switch_net_numbers */ /*============================================================================ - * Get ethernet-style interface statistics. + * Get Ethernet-style interface statistics. * Return a pointer to struct enet_statistics. */ @@ -2158,7 +2158,7 @@ static int fr508_send(sdla_t * card, int dlci, int attr, int len, void *buf) /****** Firmware Asynchronous Event Handlers ********************************/ /*============================================================================ - * Main asyncronous event/error handler. + * Main asynchronous event/error handler. * This routine is called whenever firmware command returns non-zero * return code. * diff --git a/drivers/net/sdla_ppp.c b/drivers/net/sdla_ppp.c index fa4f98d61b74..6b15441b5609 100644 --- a/drivers/net/sdla_ppp.c +++ b/drivers/net/sdla_ppp.c @@ -841,7 +841,7 @@ static void switch_net_numbers(unsigned char *sendpacket, unsigned long network_ } /* switch_net_numbers */ /*============================================================================ - * Get ethernet-style interface statistics. + * Get Ethernet-style interface statistics. * Return a pointer to struct enet_statistics. */ @@ -2183,7 +2183,7 @@ static int intr_test(sdla_t * card) { ppp_mbox_t *mb = card->mbox; int err, i; - /* The critical flag is unset because during intialization (if_open) + /* The critical flag is unset because during initialization (if_open) * we want the interrupts to be enabled so that when the wpp_isr is * called it does not exit due to critical flag set. */ diff --git a/drivers/net/sdla_x25.c b/drivers/net/sdla_x25.c index af7d318443bf..77567ebcc4e7 100644 --- a/drivers/net/sdla_x25.c +++ b/drivers/net/sdla_x25.c @@ -167,7 +167,7 @@ static int x25_fetch_events (sdla_t* card); static int x25_error (sdla_t* card, int err, int cmd, int lcn); /* X.25 asynchronous event handlers */ -static int incomming_call (sdla_t* card, int cmd, int lcn, TX25Mbox* mb); +static int incoming_call (sdla_t* card, int cmd, int lcn, TX25Mbox* mb); static int call_accepted (sdla_t* card, int cmd, int lcn, TX25Mbox* mb); static int call_cleared (sdla_t* card, int cmd, int lcn, TX25Mbox* mb); static int timeout_event (sdla_t* card, int cmd, int lcn, TX25Mbox* mb); @@ -822,7 +822,7 @@ tx_done: } /*============================================================================ - * Get ethernet-style interface statistics. + * Get Ethernet-style interface statistics. * Return a pointer to struct net_device_stats */ @@ -1177,7 +1177,7 @@ static void poll_active (sdla_t* card) /* If there is a packet queued for transmission then kick * the channel's send routine. When transmission is complete - * or if error has occured, release socket buffer and reset + * or if error has occurred, release socket buffer and reset * 'tbusy' flag. */ if (skb && (chan_send(dev, skb) == 0)) @@ -1204,8 +1204,8 @@ static void poll_active (sdla_t* card) /****** SDLA Firmware-Specific Functions ************************************* * Almost all X.25 commands can unexpetedly fail due to so called 'X.25 - * asynchronous events' such as restart, interrupt, incomming call request, - * call clear request, etc. They can't be ignored and have to be delt with + * asynchronous events' such as restart, interrupt, incoming call request, + * call clear request, etc. They can't be ignored and have to be dealt with * immediately. To tackle with this problem we execute each interface command * in a loop until good return code is received or maximum number of retries * is reached. Each interface command returns non-zero return code, an @@ -1643,8 +1643,8 @@ static int x25_error (sdla_t* card, int err, int cmd, int lcn) mb->data[dlen] = '\0'; switch (mb->cmd.pktType & 0x7F) { - case 0x30: /* incomming call */ - retry = incomming_call(card, cmd, lcn, mb); + case 0x30: /* incoming call */ + retry = incoming_call(card, cmd, lcn, mb); break; case 0x31: /* connected */ @@ -1728,7 +1728,7 @@ static int x25_error (sdla_t* card, int err, int cmd, int lcn) */ /*============================================================================ - * Handle X.25 incomming call request. + * Handle X.25 incoming call request. * RFC 1356 establishes the following rules: * 1. The first octet in the Call User Data (CUD) field of the call * request packet contains NLPID identifying protocol encapsulation. @@ -1736,12 +1736,12 @@ static int x25_error (sdla_t* card, int err, int cmd, int lcn) * protocol encapsulation. * 3. A diagnostic code 249 defined by ISO/IEC 8208 may be used when * clearing a call because protocol encapsulation is not supported. - * 4. If an incomming call is received while a call request is pending - * (i.e. call collision has occured), the incomming call shall be + * 4. If an incoming call is received while a call request is pending + * (i.e. call collision has occurred), the incoming call shall be * rejected and call request shall be retried. */ -static int incomming_call (sdla_t* card, int cmd, int lcn, TX25Mbox* mb) +static int incoming_call (sdla_t* card, int cmd, int lcn, TX25Mbox* mb) { wan_device_t* wandev = &card->wandev; int new_lcn = mb->cmd.lcn; @@ -1754,7 +1754,7 @@ static int incomming_call (sdla_t* card, int cmd, int lcn, TX25Mbox* mb) if (dev != NULL) { printk(KERN_INFO - "%s: X.25 incomming call collision on LCN %d!\n", + "%s: X.25 incoming call collision on LCN %d!\n", card->devname, new_lcn); x25_clear_call(card, new_lcn, 0, 0); return 1; @@ -1764,7 +1764,7 @@ static int incomming_call (sdla_t* card, int cmd, int lcn, TX25Mbox* mb) if (mb->cmd.qdm & 0x02) { printk(KERN_INFO - "%s: X.25 incomming call on LCN %d with D-bit set!\n", + "%s: X.25 incoming call on LCN %d with D-bit set!\n", card->devname, new_lcn); x25_clear_call(card, new_lcn, 0, 0); return 1; @@ -1775,13 +1775,13 @@ static int incomming_call (sdla_t* card, int cmd, int lcn, TX25Mbox* mb) if (info == NULL) { printk(KERN_ERR - "%s: not enough memory to parse X.25 incomming call " + "%s: not enough memory to parse X.25 incoming call " "on LCN %d!\n", card->devname, new_lcn); x25_clear_call(card, new_lcn, 0, 0); return 1; } parse_call_info(mb->data, info); - printk(KERN_INFO "%s: X.25 incomming call on LCN %d! Call data: %s\n", + printk(KERN_INFO "%s: X.25 incoming call on LCN %d! Call data: %s\n", card->devname, new_lcn, mb->data); /* Find available channel */ @@ -1793,7 +1793,7 @@ static int incomming_call (sdla_t* card, int cmd, int lcn, TX25Mbox* mb) continue; if (strcmp(info->src, chan->addr) == 0) break; - /* If just an '@' is specified, accept all incomming calls */ + /* If just an '@' is specified, accept all incoming calls */ if (strcmp(chan->addr, "") == 0) break; } @@ -1809,7 +1809,7 @@ static int incomming_call (sdla_t* card, int cmd, int lcn, TX25Mbox* mb) else if (info->nuser == 0) { printk(KERN_INFO - "%s: no user data in incomming call on LCN %d!\n", + "%s: no user data in incoming call on LCN %d!\n", card->devname, new_lcn); x25_clear_call(card, new_lcn, 0, 0); } @@ -1831,7 +1831,7 @@ static int incomming_call (sdla_t* card, int cmd, int lcn, TX25Mbox* mb) break; default: printk(KERN_INFO - "%s: unsupported NLPID 0x%02X in incomming call " + "%s: unsupported NLPID 0x%02X in incoming call " "on LCN %d!\n", card->devname, info->user[0], new_lcn); x25_clear_call(card, new_lcn, 0, 249); } diff --git a/drivers/net/sdladrv.c b/drivers/net/sdladrv.c index 3adc0ba8ecff..baa18b3d4d72 100644 --- a/drivers/net/sdladrv.c +++ b/drivers/net/sdladrv.c @@ -495,7 +495,7 @@ int sdla_down (sdlahw_t* hw) } /*============================================================================ - * Map shared memory window into SDLA adress space. + * Map shared memory window into SDLA address space. */ EXPORT_SYMBOL(sdla_mapmem); diff --git a/drivers/net/sktr.c b/drivers/net/sktr.c new file mode 100644 index 000000000000..8b8f5358bb5a --- /dev/null +++ b/drivers/net/sktr.c @@ -0,0 +1,2696 @@ +/* + * sktr.c: A network driver for the SysKonnect Token Ring ISA/PCI Adapters. + * + * Written 1997 by Christoph Goos + * + * A fine result of the Linux Systems Network Architecture Project. + * http://samba.anu.edu.au/linux-sna/ + * + * This software may be used and distributed according to the terms + * of the GNU Public License, incorporated herein by reference. + * + * This device driver works with the following SysKonnect adapters: + * - SysKonnect TR4/16(+) ISA (SK-4190) + * - SysKonnect TR4/16(+) PCI (SK-4590) + * - SysKonnect TR4/16 PCI (SK-4591) + * + * Sources: + * - The hardware related parts of this driver are take from + * the SysKonnect Token Ring driver for Windows NT. + * - I used the IBM Token Ring driver 'ibmtr.c' as a base for this + * driver, as well as the 'skeleton.c' driver by Donald Becker. + * - Also various other drivers in the linux source tree were taken + * as samples for some tasks. + * + * Maintainer(s): + * JS Jay Schulist jschlst@samba.anu.edu.au + * CG Christoph Goos cgoos@syskonnect.de + * + * Modification History: + * 29-Aug-97 CG Created + * 04-Apr-98 CG Fixed problems caused by tok_timer_check + * 10-Apr-98 CG Fixed lockups at cable disconnection + * 27-May-98 JS Formated to Linux Kernel Format + * 31-May-98 JS Hacked in PCI support + * 16-Jun-98 JS Modulized for multiple cards with one driver + * + * To do: + * 1. Selectable 16 Mbps or 4Mbps + * 2. Multi/Broadcast packet handling + * + */ + +static const char *version = "sktr.c: v1.01 08/29/97 by Christoph Goos\n"; + +#include +#ifdef MODULE +#include +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "sktr.h" /* Our Stuff */ +#include "sktr_firmware.h" /* SysKonnect adapter firmware */ + +/* A zero-terminated list of I/O addresses to be probed. */ +static unsigned int sktr_portlist[] __initdata = { + 0x0A20, 0x1A20, 0x0B20, 0x1B20, 0x0980, 0x1980, 0x0900, 0x1900, + 0 +}; + +/* A zero-terminated list of IRQs to be probed. + * Used again after initial probe for sktr_chipset_init, called from sktr_open. + */ +static unsigned short sktr_irqlist[] = { + 3, 5, 9, 10, 11, 12, 15, + 0 +}; + +/* A zero-terminated list of DMAs to be probed. */ +static int sktr_dmalist[] __initdata = { + 5, 6, 7, + 0 +}; + +/* Card names */ +static char *pci_cardname = "SK NET TR 4/16 PCI\0"; +static char *isa_cardname = "SK NET TR 4/16 ISA\0"; +static char *AdapterName; + +/* Use 0 for production, 1 for verification, 2 for debug, and + * 3 for very verbose debug. + */ +#ifndef SKTR_DEBUG +#define SKTR_DEBUG 1 +#endif +static unsigned int sktr_debug = SKTR_DEBUG; + +/* The number of low I/O ports used by the tokencard. */ +#define SKTR_IO_EXTENT 32 + +/* Index to functions, as function prototypes. + * Alphabetical by function name. + */ + +/* "B" */ +static int sktr_bringup_diags(struct device *dev); +/* "C" */ +static void sktr_cancel_tx_queue(struct net_local* tp); +static int sktr_chipset_init(struct device *dev); +static void sktr_chk_irq(struct device *dev); +static unsigned char sktr_chk_frame(struct device *dev, unsigned char *Addr); +static void sktr_chk_outstanding_cmds(struct device *dev); +static void sktr_chk_src_addr(unsigned char *frame, unsigned char *hw_addr); +static unsigned char sktr_chk_ssb(struct net_local *tp, unsigned short IrqType); +static int sktr_close(struct device *dev); +static void sktr_cmd_status_irq(struct device *dev); +/* "D" */ +static void sktr_disable_interrupts(struct device *dev); +static void sktr_dump(unsigned char *Data, int length); +/* "E" */ +static void sktr_enable_interrupts(struct device *dev); +static void sktr_exec_cmd(struct device *dev, unsigned short Command); +static void sktr_exec_sifcmd(struct device *dev, unsigned int WriteValue); +/* "F" */ +static unsigned char *sktr_fix_srouting(unsigned char *buf, short *FrameLen); +/* "G" */ +static struct enet_statistics *sktr_get_stats(struct device *dev); +/* "H" */ +static void sktr_hardware_send_packet(struct device *dev, + struct net_local* tp); +/* "I" */ +static int sktr_init_adapter(struct device *dev); +static int sktr_init_card(struct device *dev); +static void sktr_init_ipb(struct net_local *tp); +static void sktr_init_net_local(struct device *dev); +static void sktr_init_opb(struct net_local *tp); +static void sktr_interrupt(int irq, void *dev_id, struct pt_regs *regs); +static int sktr_isa_chk_card(struct device *dev, int ioaddr); +static int sktr_isa_chk_ioaddr(int ioaddr); +/* "O" */ +static int sktr_open(struct device *dev); +static void sktr_open_adapter(struct device *dev); +/* "P" */ +static int sktr_pci_chk_card(struct device *dev); +int sktr_probe(struct device *dev); +static int sktr_probe1(struct device *dev, int ioaddr); +/* "R" */ +static void sktr_rcv_status_irq(struct device *dev); +static void sktr_read_addr(struct device *dev, unsigned char *Address); +static void sktr_read_ptr(struct device *dev); +static void sktr_read_ram(struct device *dev, unsigned char *Data, + unsigned short Address, int Length); +static int sktr_reset_adapter(struct device *dev); +static void sktr_reset_interrupt(struct device *dev); +static void sktr_ring_status_irq(struct device *dev); +/* "S" */ +static int sktr_send_packet(struct sk_buff *skb, struct device *dev); +static void sktr_set_multicast_list(struct device *dev); +/* "T" */ +static void sktr_timer_chk(unsigned long data); +static void sktr_timer_end_wait(unsigned long data); +static void sktr_tx_status_irq(struct device *dev); +/* "U" */ +static void sktr_update_rcv_stats(struct net_local *tp, + unsigned char DataPtr[], unsigned int Length); +/* "W" */ +static void sktr_wait(unsigned long time); +static void sktr_write_rpl_status(RPL *rpl, unsigned int Status); +static void sktr_write_tpl_status(TPL *tpl, unsigned int Status); + +/* + * Check for a network adapter of this type, and return '0' if one exists. + * If dev->base_addr == 0, probe all likely locations. + * If dev->base_addr == 1, always return failure. + */ +__initfunc(int sktr_probe(struct device *dev)) +{ + int i; + int base_addr = dev ? dev->base_addr : 0; + + if(base_addr > 0x1ff) /* Check a single specified location. */ + return (sktr_probe1(dev, base_addr)); + else if(base_addr != 0) /* Don't probe at all. */ + return (-ENXIO); + + for(i = 0; sktr_portlist[i]; i++) + { + int ioaddr = sktr_portlist[i]; + if(check_region(ioaddr, SKTR_IO_EXTENT)) + continue; + if(sktr_probe1(dev, ioaddr)) + { +#ifndef MODULE + tr_freedev(dev); +#endif + } + else + return (0); + } + + return (-ENODEV); +} + +/* + * Detect and setup the PCI SysKonnect TR cards in slot order. + */ +__initfunc(static int sktr_pci_chk_card(struct device *dev)) +{ + static int pci_index = 0; + unsigned char pci_bus, pci_device_fn; + + if(!pci_present()) + return (-1); /* No PCI present. */ + + for(; pci_index < 0xff; pci_index++) + { + unsigned int pci_irq_line; + struct pci_dev *pdev; + unsigned short pci_command, new_command, vendor, device; + unsigned int pci_ioaddr; + + if(pcibios_find_class(PCI_CLASS_NETWORK_TOKEN_RING << 8, + pci_index, &pci_bus, &pci_device_fn) + != PCIBIOS_SUCCESSFUL) + { + break; + } + + pcibios_read_config_word(pci_bus, pci_device_fn, + PCI_VENDOR_ID, &vendor); + pcibios_read_config_word(pci_bus, pci_device_fn, + PCI_DEVICE_ID, &device); + + pdev = pci_find_slot(pci_bus, pci_device_fn); + pci_irq_line = pdev->irq; + pci_ioaddr = pdev->base_address[0]; + + pcibios_read_config_word(pci_bus, pci_device_fn, + PCI_COMMAND, &pci_command); + + /* Remove I/O space marker in bit 0. */ + pci_ioaddr &= ~3; + + if(vendor != PCI_VENDOR_ID_SK) + continue; + if(device != PCI_DEVICE_ID_SK_TR) + continue; + if(check_region(pci_ioaddr, SKTR_IO_EXTENT)) + continue; + request_region(pci_ioaddr, SKTR_IO_EXTENT, pci_cardname); + if(request_irq(pdev->irq, sktr_interrupt, SA_SHIRQ, + pci_cardname, dev)) + return (-ENODEV); /* continue; ?? */ + + AdapterName = pci_cardname; + + new_command = (pci_command|PCI_COMMAND_MASTER|PCI_COMMAND_IO); + + if(pci_command != new_command) + { + printk("The PCI BIOS has not enabled this" + "device! Updating PCI command %4.4x->%4.4x.\n", + pci_command, new_command); + pcibios_write_config_word(pci_bus, pci_device_fn, + PCI_COMMAND, new_command); + } + + /* At this point we have found a valid PCI TR card. */ + dev->base_addr = pci_ioaddr; + dev->irq = pci_irq_line; + dev->dma = 0; + + printk("%s: %s found at %#4x, using IRQ %d.\n", + dev->name, AdapterName, pci_ioaddr, dev->irq); + + return (0); + } + + return (-1); +} + +/* + * Detect and setup the ISA SysKonnect TR cards. + */ +__initfunc(static int sktr_isa_chk_card(struct device *dev, int ioaddr)) +{ + int i, err; + + err = sktr_isa_chk_ioaddr(ioaddr); + if(err < 0) + return (-ENODEV); + + if(virt_to_bus((void*)((unsigned long)dev->priv+sizeof(struct net_local))) + > ISA_MAX_ADDRESS) + { + printk("%s: Memory not accessible for DMA\n", dev->name); + kfree(dev->priv); + return (-EAGAIN); + } + + AdapterName = isa_cardname; + + /* Grab the region so that no one else tries to probe our ioports. */ + request_region(ioaddr, SKTR_IO_EXTENT, AdapterName); + dev->base_addr = ioaddr; + + /* Autoselect IRQ and DMA if dev->irq == 0 */ + if(dev->irq == 0) + { + for(i = 0; sktr_irqlist[i] != 0; i++) + { + dev->irq = sktr_irqlist[i]; + err = request_irq(dev->irq, &sktr_interrupt, 0, AdapterName, dev); + if(!err) + break; + } + + if(sktr_irqlist[i] == 0) + { + printk("%s: AutoSelect no IRQ available\n", dev->name); + return (-EAGAIN); + } + } + else + { + err = request_irq(dev->irq, &sktr_interrupt, 0, AdapterName, dev); + if(err) + { + printk("%s: Selected IRQ not available\n", dev->name); + return (-EAGAIN); + } + } + + /* Always allocate the DMA channel after IRQ and clean up on failure */ + if(dev->dma == 0) + { + for(i = 0; sktr_dmalist[i] != 0; i++) + { + dev->dma = sktr_dmalist[i]; + err = request_dma(dev->dma, AdapterName); + if(!err) + break; + } + + if(dev->dma == 0) + { + printk("%s: AutoSelect no DMA available\n", dev->name); + free_irq(dev->irq, NULL); + return (-EAGAIN); + } + } + else + { + err = request_dma(dev->dma, AdapterName); + if(err) + { + printk("%s: Selected DMA not available\n", dev->name); + free_irq(dev->irq, NULL); + return (-EAGAIN); + } + } + + disable_dma(dev->dma); + set_dma_mode(dev->dma, DMA_MODE_CASCADE); + enable_dma(dev->dma); + + printk("%s: %s found at %#4x, using IRQ %d and DMA %d.\n", + dev->name, AdapterName, ioaddr, dev->irq, dev->dma); + + return (0); +} + +__initfunc(static int sktr_probe1(struct device *dev, int ioaddr)) +{ + static unsigned version_printed = 0; + struct net_local *tp; + int err; + + if(sktr_debug && version_printed++ == 0) + printk("%s", version); + +#ifndef MODULE + dev = init_trdev(dev, 0); + if(dev == NULL) + return (-ENOMEM); +#endif + + err = sktr_pci_chk_card(dev); + if(err < 0) + { + err = sktr_isa_chk_card(dev, ioaddr); + if(err < 0) + return (-ENODEV); + } + + /* Setup this devices private information structure */ + tp = (struct net_local *)kmalloc(sizeof(struct net_local), GFP_KERNEL | GFP_DMA); + if(tp == NULL) + return (-ENOMEM); + memset(tp, 0, sizeof(struct net_local)); + + dev->priv = tp; + dev->init = sktr_init_card; + dev->open = sktr_open; + dev->stop = sktr_close; + dev->hard_start_xmit = sktr_send_packet; + dev->get_stats = sktr_get_stats; + dev->set_multicast_list = &sktr_set_multicast_list; + + return (0); +} + +/* Dummy function */ +__initfunc(static int sktr_init_card(struct device *dev)) +{ + if(sktr_debug > 3) + printk("%s: sktr_init_card\n", dev->name); + + return (0); +} + +/* + * This function tests if an adapter is really installed at the + * given I/O address. Return negative if no adapter at IO addr. + */ +__initfunc(static int sktr_isa_chk_ioaddr(int ioaddr)) +{ + unsigned char old, chk1, chk2; + + old = inb(ioaddr + SIFADR); /* Get the old SIFADR value */ + + chk1 = 0; /* Begin with check value 0 */ + do { + /* Write new SIFADR value */ + outb(chk1, ioaddr + SIFADR); + + /* Read, invert and write */ + chk2 = inb(ioaddr + SIFADD); + chk2 ^= 0x0FE; + outb(chk2, ioaddr + SIFADR); + + /* Read, invert and compare */ + chk2 = inb(ioaddr + SIFADD); + chk2 ^= 0x0FE; + + if(chk1 != chk2) + return (-1); /* No adapter */ + + chk1 -= 2; + } while(chk1 != 0); /* Repeat 128 times (all byte values) */ + + /* Restore the SIFADR value */ + outb(old, ioaddr + SIFADR); + + return (0); +} + +/* + * Open/initialize the board. This is called sometime after + * booting when the 'ifconfig' program is run. + * + * This routine should set everything up anew at each open, even + * registers that "should" only need to be set once at boot, so that + * there is non-reboot way to recover if something goes wrong. + */ +static int sktr_open(struct device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + int err; + + /* Reset the hardware here. Don't forget to set the station address. */ + err = sktr_chipset_init(dev); + if(err) + { + printk(KERN_INFO "%s: Chipset initialization error\n", + dev->name); + return (-1); + } + + dev->addr_len = 6; + sktr_read_addr(dev, (unsigned char*)dev->dev_addr); + + init_timer(&tp->timer); + tp->timer.expires = jiffies + 30*HZ; + tp->timer.function = sktr_timer_end_wait; + tp->timer.data = (unsigned long)dev; + tp->timer.next = NULL; + tp->timer.prev = NULL; + add_timer(&tp->timer); + + sktr_read_ptr(dev); + sktr_enable_interrupts(dev); + sktr_open_adapter(dev); + + dev->tbusy = 0; + dev->interrupt = 0; + dev->start = 0; + + /* Wait for interrupt from hardware. If interrupt does not come, + * there will be a timeout from the timer. + */ + tp->Sleeping = 1; + interruptible_sleep_on(&tp->wait_for_tok_int); + del_timer(&tp->timer); + + /* If AdapterVirtOpenFlag is 1, the adapter is now open for use */ + if(tp->AdapterVirtOpenFlag == 0) + { + sktr_disable_interrupts(dev); + return (-1); + } + + dev->start = 1; + + tp->StartTime = jiffies; + + /* Start function control timer */ + tp->timer.expires = jiffies + 2*HZ; + tp->timer.function = sktr_timer_chk; + tp->timer.data = (unsigned long)dev; + add_timer(&tp->timer); + +#ifdef MODULE + MOD_INC_USE_COUNT; +#endif + + return (0); +} + +/* + * Timeout function while waiting for event + */ +static void sktr_timer_end_wait(unsigned long data) +{ + struct device *dev = (struct device*)data; + struct net_local *tp = (struct net_local *)dev->priv; + + if(tp->Sleeping) + { + tp->Sleeping = 0; + wake_up_interruptible(&tp->wait_for_tok_int); + } + + return; +} + +/* + * Initialize the chipset + */ +static int sktr_chipset_init(struct device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + unsigned char PosReg, Tmp; + int i, err; + + sktr_init_ipb(tp); + sktr_init_opb(tp); + sktr_init_net_local(dev); + + /* Set pos register: selects irq and dma channel. + * Only for ISA bus adapters. + */ + if(dev->dma > 0) + { + PosReg = 0; + for(i = 0; sktr_irqlist[i] != 0; i++) + { + if(sktr_irqlist[i] == dev->irq) + break; + } + + /* Choose default cycle time, 500 nsec */ + PosReg |= CYCLE_TIME << 2; + PosReg |= i << 4; + i = dev->dma - 5; + PosReg |= i; + + if(tp->DataRate == SPEED_4) + PosReg |= LINE_SPEED_BIT; + else + PosReg &= ~LINE_SPEED_BIT; + + outb(PosReg, dev->base_addr + POSREG); + Tmp = inb(dev->base_addr + POSREG); + if((Tmp & ~CYCLE_TIME) != (PosReg & ~CYCLE_TIME)) + printk(KERN_INFO "%s: POSREG error\n", dev->name); + } + + err = sktr_reset_adapter(dev); + if(err < 0) + return (-1); + + err = sktr_bringup_diags(dev); + if(err < 0) + return (-1); + + err = sktr_init_adapter(dev); + if(err < 0) + return (-1); + + return (0); +} + +/* + * Initializes the net_local structure. + */ +static void sktr_init_net_local(struct device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + int i; + + tp->scb.CMD = 0; + tp->scb.Parm[0] = 0; + tp->scb.Parm[1] = 0; + + tp->ssb.STS = 0; + tp->ssb.Parm[0] = 0; + tp->ssb.Parm[1] = 0; + tp->ssb.Parm[2] = 0; + + tp->CMDqueue = 0; + + tp->AdapterOpenFlag = 0; + tp->AdapterVirtOpenFlag = 0; + tp->ScbInUse = 0; + tp->OpenCommandIssued = 0; + tp->ReOpenInProgress = 0; + tp->HaltInProgress = 0; + tp->TransmitHaltScheduled = 0; + tp->LobeWireFaultLogged = 0; + tp->LastOpenStatus = 0; + tp->MaxPacketSize = DEFAULT_PACKET_SIZE; + + skb_queue_head_init(&tp->SendSkbQueue); + tp->QueueSkb = MAX_TX_QUEUE; + + /* Create circular chain of transmit lists */ + for (i = 0; i < TPL_NUM; i++) + { + tp->Tpl[i].NextTPLAddr = htonl((unsigned long) virt_to_bus(&tp->Tpl[(i+1) % TPL_NUM])); + tp->Tpl[i].Status = 0; + tp->Tpl[i].FrameSize = 0; + tp->Tpl[i].FragList[0].DataCount = 0; + tp->Tpl[i].FragList[0].DataAddr = 0; + tp->Tpl[i].NextTPLPtr = &tp->Tpl[(i+1) % TPL_NUM]; + tp->Tpl[i].MData = NULL; + tp->Tpl[i].TPLIndex = i; + tp->Tpl[i].BusyFlag = 0; + } + + tp->TplFree = tp->TplBusy = &tp->Tpl[0]; + + /* Create circular chain of receive lists */ + for (i = 0; i < RPL_NUM; i++) + { + tp->Rpl[i].NextRPLAddr = htonl((unsigned long) virt_to_bus(&tp->Rpl[(i+1) % RPL_NUM])); + tp->Rpl[i].Status = (RX_VALID | RX_START_FRAME | RX_END_FRAME | RX_FRAME_IRQ); + tp->Rpl[i].FrameSize = 0; + tp->Rpl[i].FragList[0].DataCount = SWAPB(tp->MaxPacketSize); + + /* Alloc skb and point adapter to data area */ + tp->Rpl[i].Skb = dev_alloc_skb(tp->MaxPacketSize); + + /* skb == NULL ? then use local buffer */ + if(tp->Rpl[i].Skb == NULL) + { + tp->Rpl[i].SkbStat = SKB_UNAVAILABLE; + tp->Rpl[i].FragList[0].DataAddr = htonl(virt_to_bus(tp->LocalRxBuffers[i])); + tp->Rpl[i].MData = tp->LocalRxBuffers[i]; + } + else /* SKB != NULL */ + { + tp->Rpl[i].Skb->dev = dev; + skb_put(tp->Rpl[i].Skb, tp->MaxPacketSize); + + /* data unreachable for DMA ? then use local buffer */ + if(virt_to_bus(tp->Rpl[i].Skb->data) + tp->MaxPacketSize > ISA_MAX_ADDRESS) + { + tp->Rpl[i].SkbStat = SKB_DATA_COPY; + tp->Rpl[i].FragList[0].DataAddr = htonl(virt_to_bus(tp->LocalRxBuffers[i])); + tp->Rpl[i].MData = tp->LocalRxBuffers[i]; + } + else /* DMA directly in skb->data */ + { + tp->Rpl[i].SkbStat = SKB_DMA_DIRECT; + tp->Rpl[i].FragList[0].DataAddr = htonl(virt_to_bus(tp->Rpl[i].Skb->data)); + tp->Rpl[i].MData = tp->Rpl[i].Skb->data; + } + } + + tp->Rpl[i].NextRPLPtr = &tp->Rpl[(i+1) % RPL_NUM]; + tp->Rpl[i].RPLIndex = i; + } + + tp->RplHead = &tp->Rpl[0]; + tp->RplTail = &tp->Rpl[RPL_NUM-1]; + tp->RplTail->Status = (RX_START_FRAME | RX_END_FRAME | RX_FRAME_IRQ); + + return; +} + +/* + * Initializes the initialisation parameter block. + */ +static void sktr_init_ipb(struct net_local *tp) +{ + tp->ipb.Init_Options = BURST_MODE; + tp->ipb.CMD_Status_IV = 0; + tp->ipb.TX_IV = 0; + tp->ipb.RX_IV = 0; + tp->ipb.Ring_Status_IV = 0; + tp->ipb.SCB_Clear_IV = 0; + tp->ipb.Adapter_CHK_IV = 0; + tp->ipb.RX_Burst_Size = BURST_SIZE; + tp->ipb.TX_Burst_Size = BURST_SIZE; + tp->ipb.DMA_Abort_Thrhld = DMA_RETRIES; + tp->ipb.SCB_Addr = 0; + tp->ipb.SSB_Addr = 0; + + return; +} + +/* + * Initializes the open parameter block. + */ +static void sktr_init_opb(struct net_local *tp) +{ + unsigned long Addr; + unsigned short RplSize = RPL_SIZE; + unsigned short TplSize = TPL_SIZE; + unsigned short BufferSize = BUFFER_SIZE; + + tp->ocpl.OPENOptions = 0; + tp->ocpl.OPENOptions |= ENABLE_FULL_DUPLEX_SELECTION; + tp->ocpl.OPENOptions |= PAD_ROUTING_FIELD; + tp->ocpl.FullDuplex = 0; + tp->ocpl.FullDuplex |= OPEN_FULL_DUPLEX_OFF; + + /* Fixme: If mac address setable: + * for (i=0; iVam->ocpl.NodeAddr[i] = mac->CurrentAddress[i]; + */ + + tp->ocpl.GroupAddr = 0; + tp->ocpl.FunctAddr = 0; + tp->ocpl.RxListSize = SWAPB(RplSize); + tp->ocpl.TxListSize = SWAPB(TplSize); + tp->ocpl.BufSize = SWAPB(BufferSize); + tp->ocpl.Reserved = 0; + tp->ocpl.TXBufMin = TX_BUF_MIN; + tp->ocpl.TXBufMax = TX_BUF_MAX; + + Addr = htonl(virt_to_bus(tp->ProductID)); + + tp->ocpl.ProdIDAddr[0] = LOWORD(Addr); + tp->ocpl.ProdIDAddr[1] = HIWORD(Addr); + + return; +} + +/* + * Send OPEN command to adapter + */ +static void sktr_open_adapter(struct device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + + if(tp->OpenCommandIssued) + return; + + tp->OpenCommandIssued = 1; + sktr_exec_cmd(dev, OC_OPEN); + + return; +} + +/* + * Clear the adapter's interrupt flag. Clear system interrupt enable + * (SINTEN): disable adapter to system interrupts. + */ +static void sktr_disable_interrupts(struct device *dev) +{ + outb(0, dev->base_addr + SIFACL); + + return; +} + +/* + * Set the adapter's interrupt flag. Set system interrupt enable + * (SINTEN): enable adapter to system interrupts. + */ +static void sktr_enable_interrupts(struct device *dev) +{ + outb(ACL_SINTEN, dev->base_addr + SIFACL); + + return; +} + +/* + * Put command in command queue, try to execute it. + */ +static void sktr_exec_cmd(struct device *dev, unsigned short Command) +{ + struct net_local *tp = (struct net_local *)dev->priv; + + tp->CMDqueue |= Command; + sktr_chk_outstanding_cmds(dev); + + return; +} + +/* + * Linux always gives 18 byte of source routing information in the frame header. + * But the length field can indicate shorter length. Then cut header + * appropriate. + */ +static unsigned char *sktr_fix_srouting(unsigned char *buf, short *FrameLen) +{ + struct trh_hdr *trh = (struct trh_hdr *)buf; + int len; + + if(buf[8] & TR_RII) + { + trh->rcf &= ~SWAPB((unsigned short) TR_RCF_LONGEST_FRAME_MASK); + trh->rcf |= SWAPB((unsigned short) TR_RCF_FRAME4K); + len = (SWAPB(trh->rcf) & TR_RCF_LEN_MASK) >> 8; + if(len < 18) + { + memcpy(&buf[18-len],buf,sizeof(struct trh_hdr)-18+len); + *FrameLen -= (18 - len); + } + return (&buf[18-len]); + } + + return (buf); +} + +/* + * Gets skb from system, queues it and checks if it can be sent + */ +static int sktr_send_packet(struct sk_buff *skb, struct device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + + if(dev->tbusy) + { + /* + * If we get here, some higher level has decided we are broken. + * There should really be a "kick me" function call instead. + * + * Resetting the token ring adapter takes a long time so just + * fake transmission time and go on trying. Our own timeout + * routine is in sktr_timer_chk() + */ + dev->tbusy = 0; + dev->trans_start = jiffies; + return (1); + } + + /* + * If some higher layer thinks we've missed an tx-done interrupt we + * are passed NULL. + */ + if(skb == NULL) + return (0); + + /* + * Block a timer-based transmit from overlapping. This could better be + * done with atomic_swap(1, dev->tbusy), but set_bit() works as well. + */ + if(test_and_set_bit(0, (void*)&dev->tbusy) != 0) + { + printk("%s: Transmitter access conflict.\n", dev->name); + return (1); + } + + if(tp->QueueSkb == 0) + return (1); /* Return with tbusy set: queue full */ + + tp->QueueSkb--; + skb_queue_tail(&tp->SendSkbQueue, skb); + sktr_hardware_send_packet(dev, tp); + if(tp->QueueSkb > 0) + dev->tbusy = 0; + + return (0); +} + +/* + * Move frames from internal skb queue into adapter tx queue + */ +static void sktr_hardware_send_packet(struct device *dev, struct net_local* tp) +{ + TPL *tpl; + short length; + unsigned char *buf, *newbuf; + struct sk_buff *skb; + int i; + + for(;;) + { + /* Try to get a free TPL from the chain. + * + * NOTE: We *must* always leave one unused TPL in the chain, + * because otherwise the adapter might send frames twice. + */ + if(tp->TplFree->NextTPLPtr->BusyFlag) /* No free TPL */ + { + printk(KERN_INFO "%s: No free TPL\n", dev->name); + return; + } + + /* Send first buffer from queue */ + skb = skb_dequeue(&tp->SendSkbQueue); + if(skb == NULL) + return; + + tp->QueueSkb++; + /* Is buffer reachable for Busmaster-DMA? */ + if(virt_to_bus((void*)(((long) skb->data) + skb->len)) + > ISA_MAX_ADDRESS) + { + /* Copy frame to local buffer */ + i = tp->TplFree->TPLIndex; + length = skb->len; + buf = tp->LocalTxBuffers[i]; + memcpy(buf, skb->data, length); + newbuf = sktr_fix_srouting(buf, &length); + } + else + { + /* Send direct from skb->data */ + length = skb->len; + newbuf = sktr_fix_srouting(skb->data, &length); + } + + /* Source address in packet? */ + sktr_chk_src_addr(newbuf, dev->dev_addr); + + tp->LastSendTime = jiffies; + tpl = tp->TplFree; /* Get the "free" TPL */ + tpl->BusyFlag = 1; /* Mark TPL as busy */ + tp->TplFree = tpl->NextTPLPtr; + + /* Save the skb for delayed return of skb to system */ + tpl->Skb = skb; + tpl->FragList[0].DataCount = (unsigned short) SWAPB(length); + tpl->FragList[0].DataAddr = htonl(virt_to_bus(newbuf)); + + /* Write the data length in the transmit list. */ + tpl->FrameSize = (unsigned short) SWAPB(length); + tpl->MData = newbuf; + + /* Transmit the frame and set the status values. */ + sktr_write_tpl_status(tpl, TX_VALID | TX_START_FRAME + | TX_END_FRAME | TX_PASS_SRC_ADDR + | TX_FRAME_IRQ); + + /* Let adapter send the frame. */ + sktr_exec_sifcmd(dev, CMD_TX_VALID); + } + + return; +} + +/* + * Write the given value to the 'Status' field of the specified TPL. + * NOTE: This function should be used whenever the status of any TPL must be + * modified by the driver, because the compiler may otherwise change the + * order of instructions such that writing the TPL status may be executed at + * an undesireable time. When this function is used, the status is always + * written when the function is called. + */ +static void sktr_write_tpl_status(TPL *tpl, unsigned int Status) +{ + tpl->Status = Status; +} + +static void sktr_chk_src_addr(unsigned char *frame, unsigned char *hw_addr) +{ + unsigned char SRBit; + + if((((unsigned long)frame[8]) & ~0x80) != 0) /* Compare 4 bytes */ + return; + if((unsigned short)frame[12] != 0) /* Compare 2 bytes */ + return; + + SRBit = frame[8] & 0x80; + memcpy(&frame[8], hw_addr, 6); + frame[8] |= SRBit; + + return; +} + +/* + * The timer routine: Check if adapter still open and working, reopen if not. + */ +static void sktr_timer_chk(unsigned long data) +{ + struct device *dev = (struct device*)data; + struct net_local *tp = (struct net_local*)dev->priv; + + if(tp->HaltInProgress) + return; + + sktr_chk_outstanding_cmds(dev); + if(tp->LastSendTime + SEND_TIMEOUT < jiffies + && (tp->QueueSkb < MAX_TX_QUEUE || tp->TplFree != tp->TplBusy)) + { + /* Anything to send, but stalled to long */ + tp->LastSendTime = jiffies; + sktr_exec_cmd(dev, OC_CLOSE); /* Does reopen automatically */ + } + + tp->timer.expires = jiffies + 2*HZ; + add_timer(&tp->timer); + + if(tp->AdapterOpenFlag || tp->ReOpenInProgress) + return; + tp->ReOpenInProgress = 1; + sktr_open_adapter(dev); + + return; +} + +/* + * The typical workload of the driver: Handle the network interface interrupts. + */ +static void sktr_interrupt(int irq, void *dev_id, struct pt_regs *regs) +{ + struct device *dev = dev_id; + struct net_local *tp; + int ioaddr; + unsigned short irq_type; + + if(dev == NULL) + { + printk("%s: irq %d for unknown device.\n", dev->name, irq); + return; + } + + dev->interrupt = 1; + + ioaddr = dev->base_addr; + tp = (struct net_local *)dev->priv; + + irq_type = inw(ioaddr + SIFSTS); + + while(irq_type & STS_SYSTEM_IRQ) + { + irq_type &= STS_IRQ_MASK; + + if(!sktr_chk_ssb(tp, irq_type)) + { + printk(KERN_INFO "%s: DATA LATE occured\n", dev->name); + break; + } + + switch(irq_type) + { + case STS_IRQ_RECEIVE_STATUS: + sktr_reset_interrupt(dev); + sktr_rcv_status_irq(dev); + break; + + case STS_IRQ_TRANSMIT_STATUS: + /* Check if TRANSMIT.HALT command is complete */ + if(tp->ssb.Parm[0] & COMMAND_COMPLETE) + { + tp->TransmitCommandActive = 0; + tp->TransmitHaltScheduled = 0; + + /* Issue a new transmit command. */ + sktr_exec_cmd(dev, OC_TRANSMIT); + } + + sktr_reset_interrupt(dev); + sktr_tx_status_irq(dev); + break; + + case STS_IRQ_COMMAND_STATUS: + /* The SSB contains status of last command + * other than receive/transmit. + */ + sktr_cmd_status_irq(dev); + break; + + case STS_IRQ_SCB_CLEAR: + /* The SCB is free for another command. */ + tp->ScbInUse = 0; + sktr_chk_outstanding_cmds(dev); + break; + + case STS_IRQ_RING_STATUS: + sktr_ring_status_irq(dev); + break; + + case STS_IRQ_ADAPTER_CHECK: + sktr_chk_irq(dev); + break; + + default: + printk(KERN_INFO "Unknown Token Ring IRQ\n"); + break; + } + + /* Reset system interrupt if not already done. */ + if(irq_type != STS_IRQ_TRANSMIT_STATUS + && irq_type != STS_IRQ_RECEIVE_STATUS) + { + sktr_reset_interrupt(dev); + } + + irq_type = inw(ioaddr + SIFSTS); + } + + dev->interrupt = 0; + + return; +} + +/* + * Reset the INTERRUPT SYSTEM bit and issue SSB CLEAR command. + */ +static void sktr_reset_interrupt(struct device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + SSB *ssb = &tp->ssb; + + /* + * [Workaround for "Data Late"] + * Set all fields of the SSB to well-defined values so we can + * check if the adapter has written the SSB. + */ + + ssb->STS = (unsigned short) -1; + ssb->Parm[0] = (unsigned short) -1; + ssb->Parm[1] = (unsigned short) -1; + ssb->Parm[2] = (unsigned short) -1; + + /* Free SSB by issuing SSB_CLEAR command after reading IRQ code + * and clear STS_SYSTEM_IRQ bit: enable adapter for further interrupts. + */ + sktr_exec_sifcmd(dev, CMD_SSB_CLEAR | CMD_CLEAR_SYSTEM_IRQ); + + return; +} + +/* + * Check if the SSB has actually been written by the adapter. + */ +static unsigned char sktr_chk_ssb(struct net_local *tp, unsigned short IrqType) +{ + SSB *ssb = &tp->ssb; /* The address of the SSB. */ + + /* C 0 1 2 INTERRUPT CODE + * - - - - -------------- + * 1 1 1 1 TRANSMIT STATUS + * 1 1 1 1 RECEIVE STATUS + * 1 ? ? 0 COMMAND STATUS + * 0 0 0 0 SCB CLEAR + * 1 1 0 0 RING STATUS + * 0 0 0 0 ADAPTER CHECK + * + * 0 = SSB field not affected by interrupt + * 1 = SSB field is affected by interrupt + * + * C = SSB ADDRESS +0: COMMAND + * 0 = SSB ADDRESS +2: STATUS 0 + * 1 = SSB ADDRESS +4: STATUS 1 + * 2 = SSB ADDRESS +6: STATUS 2 + */ + + /* Check if this interrupt does use the SSB. */ + + if(IrqType != STS_IRQ_TRANSMIT_STATUS + && IrqType != STS_IRQ_RECEIVE_STATUS + && IrqType != STS_IRQ_COMMAND_STATUS + && IrqType != STS_IRQ_RING_STATUS) + { + return (1); /* SSB not involved. */ + } + + /* Note: All fields of the SSB have been set to all ones (-1) after it + * has last been used by the software (see DriverIsr()). + * + * Check if the affected SSB fields are still unchanged. + */ + + if(ssb->STS == (unsigned short) -1) + return (0); /* Command field not yet available. */ + if(IrqType == STS_IRQ_COMMAND_STATUS) + return (1); /* Status fields not always affected. */ + if(ssb->Parm[0] == (unsigned short) -1) + return (0); /* Status 1 field not yet available. */ + if(IrqType == STS_IRQ_RING_STATUS) + return (1); /* Status 2 & 3 fields not affected. */ + + /* Note: At this point, the interrupt is either TRANSMIT or RECEIVE. */ + if(ssb->Parm[1] == (unsigned short) -1) + return (0); /* Status 2 field not yet available. */ + if(ssb->Parm[2] == (unsigned short) -1) + return (0); /* Status 3 field not yet available. */ + + return (1); /* All SSB fields have been written by the adapter. */ +} + +/* + * Evaluates the command results status in the SSB status field. + */ +static void sktr_cmd_status_irq(struct device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + unsigned short ssb_cmd, ssb_parm_0; + unsigned short ssb_parm_1; + char *open_err = "Open error -"; + char *code_err = "Open code -"; + + /* Copy the ssb values to local variables */ + ssb_cmd = tp->ssb.STS; + ssb_parm_0 = tp->ssb.Parm[0]; + ssb_parm_1 = tp->ssb.Parm[1]; + + if(ssb_cmd == OPEN) + { + tp->Sleeping = 0; + if(!tp->ReOpenInProgress) + wake_up_interruptible(&tp->wait_for_tok_int); + + tp->OpenCommandIssued = 0; + tp->ScbInUse = 0; + + if((ssb_parm_0 & 0x00FF) == GOOD_COMPLETION) + { + /* Success, the adapter is open. */ + tp->LobeWireFaultLogged = 0; + tp->AdapterOpenFlag = 1; + tp->AdapterVirtOpenFlag = 1; + tp->TransmitCommandActive = 0; + sktr_exec_cmd(dev, OC_TRANSMIT); + sktr_exec_cmd(dev, OC_RECEIVE); + + if(tp->ReOpenInProgress) + tp->ReOpenInProgress = 0; + + return; + } + else /* The adapter did not open. */ + { + if(ssb_parm_0 & NODE_ADDR_ERROR) + printk(KERN_INFO "%s: Node address error\n", + dev->name); + if(ssb_parm_0 & LIST_SIZE_ERROR) + printk(KERN_INFO "%s: List size error\n", + dev->name); + if(ssb_parm_0 & BUF_SIZE_ERROR) + printk(KERN_INFO "%s: Buffer size error\n", + dev->name); + if(ssb_parm_0 & TX_BUF_COUNT_ERROR) + printk(KERN_INFO "%s: Tx buffer count error\n", + dev->name); + if(ssb_parm_0 & INVALID_OPEN_OPTION) + printk(KERN_INFO "%s: Invalid open option\n", + dev->name); + if(ssb_parm_0 & OPEN_ERROR) + { + /* Show the open phase. */ + switch(ssb_parm_0 & OPEN_PHASES_MASK) + { + case LOBE_MEDIA_TEST: + if(!tp->LobeWireFaultLogged) + { + tp->LobeWireFaultLogged = 1; + printk(KERN_INFO "%s: %s Lobe wire fault (check cable !).\n", dev->name, open_err); + } + tp->ReOpenInProgress = 1; + tp->AdapterOpenFlag = 0; + tp->AdapterVirtOpenFlag = 1; + sktr_open_adapter(dev); + return; + + case PHYSICAL_INSERTION: + printk(KERN_INFO "%s: %s Physical insertion.\n", dev->name, open_err); + break; + + case ADDRESS_VERIFICATION: + printk(KERN_INFO "%s: %s Address verification.\n", dev->name, open_err); + break; + + case PARTICIPATION_IN_RING_POLL: + printk(KERN_INFO "%s: %s Participation in ring poll.\n", dev->name, open_err); + break; + + case REQUEST_INITIALISATION: + printk(KERN_INFO "%s: %s Request initialisation.\n", dev->name, open_err); + break; + + case FULLDUPLEX_CHECK: + printk(KERN_INFO "%s: %s Full duplex check.\n", dev->name, open_err); + break; + + default: + printk(KERN_INFO "%s: %s Unknown open phase\n", dev->name, open_err); + break; + } + + /* Show the open errors. */ + switch(ssb_parm_0 & OPEN_ERROR_CODES_MASK) + { + case OPEN_FUNCTION_FAILURE: + printk(KERN_INFO "%s: %s OPEN_FUNCTION_FAILURE", dev->name, code_err); + tp->LastOpenStatus = + OPEN_FUNCTION_FAILURE; + break; + + case OPEN_SIGNAL_LOSS: + printk(KERN_INFO "%s: %s OPEN_SIGNAL_LOSS\n", dev->name, code_err); + tp->LastOpenStatus = + OPEN_SIGNAL_LOSS; + break; + + case OPEN_TIMEOUT: + printk(KERN_INFO "%s: %s OPEN_TIMEOUT\n", dev->name, code_err); + tp->LastOpenStatus = + OPEN_TIMEOUT; + break; + + case OPEN_RING_FAILURE: + printk(KERN_INFO "%s: %s OPEN_RING_FAILURE\n", dev->name, code_err); + tp->LastOpenStatus = + OPEN_RING_FAILURE; + break; + + case OPEN_RING_BEACONING: + printk(KERN_INFO "%s: %s OPEN_RING_BEACONING\n", dev->name, code_err); + tp->LastOpenStatus = + OPEN_RING_BEACONING; + break; + + case OPEN_DUPLICATE_NODEADDR: + printk(KERN_INFO "%s: %s OPEN_DUPLICATE_NODEADDR\n", dev->name, code_err); + tp->LastOpenStatus = + OPEN_DUPLICATE_NODEADDR; + break; + + case OPEN_REQUEST_INIT: + printk(KERN_INFO "%s: %s OPEN_REQUEST_INIT\n", dev->name, code_err); + tp->LastOpenStatus = + OPEN_REQUEST_INIT; + break; + + case OPEN_REMOVE_RECEIVED: + printk(KERN_INFO "%s: %s OPEN_REMOVE_RECEIVED", dev->name, code_err); + tp->LastOpenStatus = + OPEN_REMOVE_RECEIVED; + break; + + case OPEN_FULLDUPLEX_SET: + printk(KERN_INFO "%s: %s OPEN_FULLDUPLEX_SET\n", dev->name, code_err); + tp->LastOpenStatus = + OPEN_FULLDUPLEX_SET; + break; + + default: + printk(KERN_INFO "%s: %s Unknown open err code", dev->name, code_err); + tp->LastOpenStatus = + OPEN_FUNCTION_FAILURE; + break; + } + } + + tp->AdapterOpenFlag = 0; + tp->AdapterVirtOpenFlag = 0; + + return; + } + } + else + { + if(ssb_cmd != READ_ERROR_LOG) + return; + + /* Add values from the error log table to the MAC + * statistics counters and update the errorlogtable + * memory. + */ + tp->MacStat.line_errors += tp->errorlogtable.Line_Error; + tp->MacStat.burst_errors += tp->errorlogtable.Burst_Error; + tp->MacStat.A_C_errors += tp->errorlogtable.ARI_FCI_Error; + tp->MacStat.lost_frames += tp->errorlogtable.Lost_Frame_Error; + tp->MacStat.recv_congest_count += tp->errorlogtable.Rx_Congest_Error; + tp->MacStat.rx_errors += tp->errorlogtable.Rx_Congest_Error; + tp->MacStat.frame_copied_errors += tp->errorlogtable.Frame_Copied_Error; + tp->MacStat.token_errors += tp->errorlogtable.Token_Error; + tp->MacStat.dummy1 += tp->errorlogtable.DMA_Bus_Error; + tp->MacStat.dummy1 += tp->errorlogtable.DMA_Parity_Error; + tp->MacStat.abort_delimiters += tp->errorlogtable.AbortDelimeters; + tp->MacStat.frequency_errors += tp->errorlogtable.Frequency_Error; + tp->MacStat.internal_errors += tp->errorlogtable.Internal_Error; + } + + return; +} + +/* + * The inverse routine to sktr_open(). + */ +static int sktr_close(struct device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + + dev->tbusy = 1; + dev->start = 0; + + del_timer(&tp->timer); + + /* Flush the Tx and disable Rx here. */ + + tp->HaltInProgress = 1; + sktr_exec_cmd(dev, OC_CLOSE); + tp->timer.expires = jiffies + 1*HZ; + tp->timer.function = sktr_timer_end_wait; + tp->timer.data = (unsigned long)dev; + add_timer(&tp->timer); + + sktr_enable_interrupts(dev); + + tp->Sleeping = 1; + interruptible_sleep_on(&tp->wait_for_tok_int); + tp->TransmitCommandActive = 0; + + del_timer(&tp->timer); + sktr_disable_interrupts(dev); + + if(dev->dma > 0) + disable_dma(dev->dma); + outw(0xFF00, dev->base_addr + SIFCMD); + if(dev->dma > 0) + outb(0xff, dev->base_addr + POSREG); + +#ifdef MODULE + MOD_DEC_USE_COUNT; +#endif + + sktr_cancel_tx_queue(tp); + + return (0); +} + +/* + * Get the current statistics. This may be called with the card open + * or closed. + */ +static struct enet_statistics *sktr_get_stats(struct device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + + return ((struct enet_statistics *)&tp->MacStat); +} + +/* + * Set or clear the multicast filter for this adapter. + */ +static void sktr_set_multicast_list(struct device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + unsigned int OpenOptions; + + OpenOptions = tp->ocpl.OPENOptions & + ~(PASS_ADAPTER_MAC_FRAMES + | PASS_ATTENTION_FRAMES + | PASS_BEACON_MAC_FRAMES + | COPY_ALL_MAC_FRAMES + | COPY_ALL_NON_MAC_FRAMES); + + if(dev->flags & IFF_PROMISC) + /* Enable promiscuous mode */ + OpenOptions |= COPY_ALL_NON_MAC_FRAMES | COPY_ALL_MAC_FRAMES; + else + { + if(dev->flags & IFF_ALLMULTI) + /* || dev->mc_count > HW_MAX_ADDRS) */ + { + /* Disable promiscuous mode, use normal mode. */ + } + else + { + if(dev->mc_count) + { + /* Walk the address list, and load the filter */ + } + } + } + + tp->ocpl.OPENOptions = OpenOptions; + sktr_exec_cmd(dev, OC_MODIFY_OPEN_PARMS); + + return; +} + +/* + * Wait for some time (microseconds) + */ +static void sktr_wait(unsigned long time) +{ + long tmp; + + tmp = jiffies + time/(1000000/HZ); + do { + current->timeout = tmp; + current->state = TASK_INTERRUPTIBLE; + schedule(); + } while(tmp > jiffies); + + return; +} + +/* + * Write a command value to the SIFCMD register + */ +static void sktr_exec_sifcmd(struct device *dev, unsigned int WriteValue) +{ + int ioaddr = dev->base_addr; + unsigned short cmd; + unsigned short SifStsValue; + unsigned long loop_counter; + + WriteValue = ((WriteValue ^ CMD_SYSTEM_IRQ) | CMD_INTERRUPT_ADAPTER); + cmd = (unsigned short)WriteValue; + loop_counter = 0,5 * 800000; + do { + SifStsValue = inw(ioaddr + SIFSTS); + } while((SifStsValue & CMD_INTERRUPT_ADAPTER) && loop_counter--); + outw(cmd, ioaddr + SIFCMD); + + return; +} + +/* + * Processes adapter hardware reset, halts adapter and downloads firmware, + * clears the halt bit. + */ +static int sktr_reset_adapter(struct device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + unsigned short *fw_ptr = (unsigned short *)&sktr_code; + unsigned short count, c; + int ioaddr = dev->base_addr; + + /* Hardware adapter reset */ + outw(ACL_ARESET, ioaddr + SIFACL); + sktr_wait(40); + + c = inw(ioaddr + SIFACL); + sktr_wait(20); + + if(dev->dma == 0) /* For PCI adapters */ + { + c &= ~(ACL_SPEED4 | ACL_SPEED16); /* Clear bits */ + if(tp->DataRate == SPEED_4) + c |= ACL_SPEED4; /* Set 4Mbps */ + else + c |= ACL_SPEED16; /* Set 16Mbps */ + } + + /* In case a comand is pending - forget it */ + tp->ScbInUse = 0; + + c &= ~ACL_ARESET; /* Clear adapter reset bit */ + c |= ACL_CPHALT; /* Halt adapter CPU, allow download */ + c &= ~ACL_PSDMAEN; /* Clear pseudo dma bit */ + outw(c, ioaddr + SIFACL); + sktr_wait(40); + + /* Download firmware via DIO interface: */ + do { + /* Download first address part */ + outw(*fw_ptr, ioaddr + SIFADX); + fw_ptr++; + + /* Download second address part */ + outw(*fw_ptr, ioaddr + SIFADD); + fw_ptr++; + + if((count = *fw_ptr) != 0) /* Load loop counter */ + { + fw_ptr++; /* Download block data */ + for(; count > 0; count--) + { + outw(*fw_ptr, ioaddr + SIFINC); + fw_ptr++; + } + } + else /* Stop, if last block downloaded */ + { + c = inw(ioaddr + SIFACL); + c &= (~ACL_CPHALT | ACL_SINTEN); + + /* Clear CPHALT and start BUD */ + outw(c, ioaddr + SIFACL); + return (1); + } + } while(count == 0); + + return (-1); +} + +/* + * Starts bring up diagnostics of token ring adapter and evaluates + * diagnostic results. + */ +static int sktr_bringup_diags(struct device *dev) +{ + int loop_cnt, retry_cnt; + unsigned short Status; + int ioaddr = dev->base_addr; + + sktr_wait(HALF_SECOND); + sktr_exec_sifcmd(dev, EXEC_SOFT_RESET); + sktr_wait(HALF_SECOND); + + retry_cnt = BUD_MAX_RETRIES; /* maximal number of retrys */ + + do { + retry_cnt--; + if(sktr_debug > 3) + printk(KERN_INFO "BUD-Status: \n"); + loop_cnt = BUD_MAX_LOOPCNT; /* maximum: three seconds*/ + do { /* Inspect BUD results */ + loop_cnt--; + sktr_wait(HALF_SECOND); + Status = inw(ioaddr + SIFSTS); + Status &= STS_MASK; + + if(sktr_debug > 3) + printk(KERN_INFO " %04X \n", Status); + /* BUD successfully completed */ + if(Status == STS_INITIALIZE) + return (1); + /* Unrecoverable hardware error, BUD not completed? */ + } while((loop_cnt > 0) && ((Status & (STS_ERROR | STS_TEST)) + != (STS_ERROR | STS_TEST))); + + /* Error preventing completion of BUD */ + if(retry_cnt > 0) + { + printk(KERN_INFO "%s: Adapter Software Reset.\n", + dev->name); + sktr_exec_sifcmd(dev, EXEC_SOFT_RESET); + sktr_wait(HALF_SECOND); + } + } while(retry_cnt > 0); + + Status = inw(ioaddr + SIFSTS); + Status &= STS_ERROR_MASK; /* Hardware error occured! */ + + printk(KERN_INFO "%s: Bring Up Diagnostics Error (%04X) occurred\n", + dev->name, Status); + + return (-1); +} + +/* + * Copy initialisation data to adapter memory, beginning at address + * 1:0A00; Starting DMA test and evaluating result bits. + */ +static int sktr_init_adapter(struct device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + + const unsigned char SCB_Test[6] = {0x00, 0x00, 0xC1, 0xE2, 0xD4, 0x8B}; + const unsigned char SSB_Test[8] = {0xFF, 0xFF, 0xD1, 0xD7, + 0xC5, 0xD9, 0xC3, 0xD4}; + void *ptr = (void *)&tp->ipb; + unsigned short *ipb_ptr = (unsigned short *)ptr; + unsigned char *cb_ptr = (unsigned char *) &tp->scb; + unsigned char *sb_ptr = (unsigned char *) &tp->ssb; + unsigned short Status; + int i, loop_cnt, retry_cnt; + int ioaddr = dev->base_addr; + + /* Normalize: byte order low/high, word order high/low! (only IPB!) */ + tp->ipb.SCB_Addr = SWAPW(virt_to_bus(&tp->scb)); + tp->ipb.SSB_Addr = SWAPW(virt_to_bus(&tp->ssb)); + + /* Maximum: three initialization retries */ + retry_cnt = INIT_MAX_RETRIES; + + do { + retry_cnt--; + + /* Transfer initialization block */ + outw(0x0001, ioaddr + SIFADX); + + /* To address 0001:0A00 of adapter RAM */ + outw(0x0A00, ioaddr + SIFADD); + + /* Write 11 words to adapter RAM */ + for(i = 0; i < 11; i++) + outw(ipb_ptr[i], ioaddr + SIFINC); + + /* Execute SCB adapter command */ + sktr_exec_sifcmd(dev, CMD_EXECUTE); + + loop_cnt = INIT_MAX_LOOPCNT; /* Maximum: 11 seconds */ + + /* While remaining retries, no error and not completed */ + do { + Status = 0; + loop_cnt--; + sktr_wait(HALF_SECOND); + + /* Mask interesting status bits */ + Status = inw(ioaddr + SIFSTS); + Status &= STS_MASK; + } while(((Status &(STS_INITIALIZE | STS_ERROR | STS_TEST)) != 0) + && ((Status & STS_ERROR) == 0) && (loop_cnt != 0)); + + if((Status & (STS_INITIALIZE | STS_ERROR | STS_TEST)) == 0) + { + /* Initialization completed without error */ + i = 0; + do { /* Test if contents of SCB is valid */ + if(SCB_Test[i] != *(cb_ptr + i)) + /* DMA data error: wrong data in SCB */ + return (-1); + i++; + } while(i < 6); + + i = 0; + do { /* Test if contents of SSB is valid */ + if(SSB_Test[i] != *(sb_ptr + i)) + /* DMA data error: wrong data in SSB */ + return (-1); + i++; + } while (i < 8); + + return (1); /* Adapter successfully initialized */ + } + else + { + if((Status & STS_ERROR) != 0) + { + /* Initialization error occured */ + Status = inw(ioaddr + SIFSTS); + Status &= STS_ERROR_MASK; + /* ShowInitialisationErrorCode(Status); */ + return (-1); /* Unrecoverable error */ + } + else + { + if(retry_cnt > 0) + { + /* Reset adapter and try init again */ + sktr_exec_sifcmd(dev, EXEC_SOFT_RESET); + sktr_wait(HALF_SECOND); + } + } + } + } while(retry_cnt > 0); + + return (-1); +} + +/* + * Check for outstanding commands in command queue and tries to execute + * command immediately. Corresponding command flag in command queue is cleared. + */ +static void sktr_chk_outstanding_cmds(struct device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + unsigned long Addr = 0; + unsigned char i = 0; + + if(tp->CMDqueue == 0) + return; /* No command execution */ + + /* If SCB in use: no command */ + if(tp->ScbInUse == 1) + return; + + /* Check if adapter is opened, avoiding COMMAND_REJECT + * interrupt by the adapter! + */ + if(tp->AdapterOpenFlag == 0) + { + if(tp->CMDqueue & OC_OPEN) + { + /* Execute OPEN command */ + tp->CMDqueue ^= OC_OPEN; + + /* Copy the 18 bytes of the product ID */ + while((AdapterName[i] != '\0') && (i < PROD_ID_SIZE)) + { + tp->ProductID[i] = AdapterName[i]; + i++; + } + + Addr = htonl(virt_to_bus(&tp->ocpl)); + tp->scb.Parm[0] = LOWORD(Addr); + tp->scb.Parm[1] = HIWORD(Addr); + tp->scb.CMD = OPEN; + } + else + /* No OPEN command queued, but adapter closed. Note: + * We'll try to re-open the adapter in DriverPoll() + */ + return; /* No adapter command issued */ + } + else + { + /* Adapter is open; evaluate command queue: try to execute + * outstanding commands (depending on priority!) CLOSE + * command queued + */ + if(tp->CMDqueue & OC_CLOSE) + { + tp->CMDqueue ^= OC_CLOSE; + tp->AdapterOpenFlag = 0; + tp->scb.Parm[0] = 0; /* Parm[0], Parm[1] are ignored */ + tp->scb.Parm[1] = 0; /* but should be set to zero! */ + tp->scb.CMD = CLOSE; + if(!tp->HaltInProgress) + tp->CMDqueue |= OC_OPEN; /* re-open adapter */ + else + tp->CMDqueue = 0; /* no more commands */ + } + else + { + if(tp->CMDqueue & OC_RECEIVE) + { + tp->CMDqueue ^= OC_RECEIVE; + Addr = htonl(virt_to_bus(tp->RplHead)); + tp->scb.Parm[0] = LOWORD(Addr); + tp->scb.Parm[1] = HIWORD(Addr); + tp->scb.CMD = RECEIVE; + } + else + { + if(tp->CMDqueue & OC_TRANSMIT_HALT) + { + /* NOTE: TRANSMIT.HALT must be checked + * before TRANSMIT. + */ + tp->CMDqueue ^= OC_TRANSMIT_HALT; + tp->scb.CMD = TRANSMIT_HALT; + + /* Parm[0] and Parm[1] are ignored + * but should be set to zero! + */ + tp->scb.Parm[0] = 0; + tp->scb.Parm[1] = 0; + } + else + { + if(tp->CMDqueue & OC_TRANSMIT) + { + /* NOTE: TRANSMIT must be + * checked after TRANSMIT.HALT + */ + if(tp->TransmitCommandActive) + { + if(!tp->TransmitHaltScheduled) + { + tp->TransmitHaltScheduled = 1; + sktr_exec_cmd(dev, OC_TRANSMIT_HALT) ; + } + tp->TransmitCommandActive = 0; + return; + } + + tp->CMDqueue ^= OC_TRANSMIT; + sktr_cancel_tx_queue(tp); + Addr = htonl(virt_to_bus(tp->TplBusy)); + tp->scb.Parm[0] = LOWORD(Addr); + tp->scb.Parm[1] = HIWORD(Addr); + tp->scb.CMD = TRANSMIT; + tp->TransmitCommandActive = 1; + } + else + { + if(tp->CMDqueue & OC_MODIFY_OPEN_PARMS) + { + tp->CMDqueue ^= OC_MODIFY_OPEN_PARMS; + tp->scb.Parm[0] = tp->ocpl.OPENOptions; /* new OPEN options*/ + tp->scb.Parm[0] |= ENABLE_FULL_DUPLEX_SELECTION; + tp->scb.Parm[1] = 0; /* is ignored but should be zero */ + tp->scb.CMD = MODIFY_OPEN_PARMS; + } + else + { + if(tp->CMDqueue & OC_SET_FUNCT_ADDR) + { + tp->CMDqueue ^= OC_SET_FUNCT_ADDR; + tp->scb.Parm[0] = LOWORD(tp->ocpl.FunctAddr); + tp->scb.Parm[1] = HIWORD(tp->ocpl.FunctAddr); + tp->scb.CMD = SET_FUNCT_ADDR; + } + else + { + if(tp->CMDqueue & OC_SET_GROUP_ADDR) + { + tp->CMDqueue ^= OC_SET_GROUP_ADDR; + tp->scb.Parm[0] = LOWORD(tp->ocpl.GroupAddr); + tp->scb.Parm[1] = HIWORD(tp->ocpl.GroupAddr); + tp->scb.CMD = SET_GROUP_ADDR; + } + else + { + if(tp->CMDqueue & OC_READ_ERROR_LOG) + { + tp->CMDqueue ^= OC_READ_ERROR_LOG; + Addr = htonl(virt_to_bus(&tp->errorlogtable)); + tp->scb.Parm[0] = LOWORD(Addr); + tp->scb.Parm[1] = HIWORD(Addr); + tp->scb.CMD = READ_ERROR_LOG; + } + else + { + printk(KERN_WARNING "CheckForOutstandingCommand: unknown Command\n"); + tp->CMDqueue = 0; + return; + } + } + } + } + } + } + } + } + } + + tp->ScbInUse = 1; /* Set semaphore: SCB in use. */ + + /* Execute SCB and generate IRQ when done. */ + sktr_exec_sifcmd(dev, CMD_EXECUTE | CMD_SCB_REQUEST); + + return; +} + +/* + * IRQ conditions: signal loss on the ring, transmit or receive of beacon + * frames (disabled if bit 1 of OPEN option is set); report error MAC + * frame transmit (disabled if bit 2 of OPEN option is set); open or short + * cirquit fault on the lobe is detected; remove MAC frame received; + * error counter overflow (255); opened adapter is the only station in ring. + * After some of the IRQs the adapter is closed! + */ +static void sktr_ring_status_irq(struct device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + + tp->CurrentRingStatus = SWAPB(tp->ssb.Parm[0]); + + /* First: fill up statistics */ + if(tp->ssb.Parm[0] & SIGNAL_LOSS) + { + printk(KERN_INFO "%s: Signal Loss\n", dev->name); + tp->MacStat.line_errors++; + } + + /* Adapter is closed, but initialized */ + if(tp->ssb.Parm[0] & LOBE_WIRE_FAULT) + { + printk(KERN_INFO "%s: Lobe Wire Fault, Reopen Adapter\n", + dev->name); + tp->MacStat.line_errors++; + } + + if(tp->ssb.Parm[0] & RING_RECOVERY) + printk(KERN_INFO "%s: Ring Recovery\n", dev->name); + + /* Counter overflow: read error log */ + if(tp->ssb.Parm[0] & COUNTER_OVERFLOW) + { + printk(KERN_INFO "%s: Counter Overflow\n", dev->name); + sktr_exec_cmd(dev, OC_READ_ERROR_LOG); + } + + /* Adapter is closed, but initialized */ + if(tp->ssb.Parm[0] & REMOVE_RECEIVED) + printk(KERN_INFO "%s: Remove Received, Reopen Adapter\n", + dev->name); + + /* Adapter is closed, but initialized */ + if(tp->ssb.Parm[0] & AUTO_REMOVAL_ERROR) + printk(KERN_INFO "%s: Auto Removal Error, Reopen Adapter\n", + dev->name); + + if(tp->ssb.Parm[0] & HARD_ERROR) + printk(KERN_INFO "%s: Hard Error\n", dev->name); + + if(tp->ssb.Parm[0] & SOFT_ERROR) + printk(KERN_INFO "%s: Soft Error\n", dev->name); + + if(tp->ssb.Parm[0] & TRANSMIT_BEACON) + printk(KERN_INFO "%s: Transmit Beacon\n", dev->name); + + if(tp->ssb.Parm[0] & SINGLE_STATION) + printk(KERN_INFO "%s: Single Station\n", dev->name); + + /* Check if adapter has been closed */ + if(tp->ssb.Parm[0] & ADAPTER_CLOSED) + { + printk(KERN_INFO "%s: Adapter closed (Reopening)," + "QueueSkb %d, CurrentRingStat %x\n", + dev->name, tp->QueueSkb, tp->CurrentRingStatus); + tp->AdapterOpenFlag = 0; + sktr_open_adapter(dev); + } + + return; +} + +/* + * Issued if adapter has encountered an unrecoverable hardware + * or software error. + */ +static void sktr_chk_irq(struct device *dev) +{ + int i; + unsigned short AdapterCheckBlock[4]; + unsigned short ioaddr = dev->base_addr; + struct net_local *tp = (struct net_local *)dev->priv; + + tp->AdapterOpenFlag = 0; /* Adapter closed now */ + + /* Page number of adapter memory */ + outw(0x0001, ioaddr + SIFADX); + /* Address offset */ + outw(CHECKADDR, ioaddr + SIFADR); + + /* Reading 8 byte adapter check block. */ + for(i = 0; i < 4; i++) + AdapterCheckBlock[i] = inw(ioaddr + SIFINC); + + if(sktr_debug > 3) + { + printk("%s: AdapterCheckBlock: ", dev->name); + for (i = 0; i < 4; i++) + printk("%04X", AdapterCheckBlock[i]); + printk("\n"); + } + + switch(AdapterCheckBlock[0]) + { + case DIO_PARITY: + printk(KERN_INFO "%s: DIO parity error\n", dev->name); + break; + + case DMA_READ_ABORT: + printk(KERN_INFO "%s DMA read operation aborted:\n", + dev->name); + switch (AdapterCheckBlock[1]) + { + case 0: + printk(KERN_INFO "Timeout\n"); + printk(KERN_INFO "Address: %04X %04X\n", + AdapterCheckBlock[2], + AdapterCheckBlock[3]); + break; + + case 1: + printk(KERN_INFO "Parity error\n"); + printk(KERN_INFO "Address: %04X %04X\n", + AdapterCheckBlock[2], + AdapterCheckBlock[3]); + break; + + case 2: + printk(KERN_INFO "Bus error\n"); + printk(KERN_INFO "Address: %04X %04X\n", + AdapterCheckBlock[2], + AdapterCheckBlock[3]); + break; + + default: + printk(KERN_INFO "Unknown error.\n"); + break; + } + break; + + case DMA_WRITE_ABORT: + printk(KERN_INFO "%s: DMA write operation aborted: \n", + dev->name); + switch (AdapterCheckBlock[1]) + { + case 0: + printk(KERN_INFO "Timeout\n"); + printk(KERN_INFO "Address: %04X %04X\n", + AdapterCheckBlock[2], + AdapterCheckBlock[3]); + break; + + case 1: + printk(KERN_INFO "Parity error\n"); + printk(KERN_INFO "Address: %04X %04X\n", + AdapterCheckBlock[2], + AdapterCheckBlock[3]); + break; + + case 2: + printk(KERN_INFO "Bus error\n"); + printk(KERN_INFO "Address: %04X %04X\n", + AdapterCheckBlock[2], + AdapterCheckBlock[3]); + break; + + default: + printk(KERN_INFO "Unknown error.\n"); + break; + } + break; + + case ILLEGAL_OP_CODE: + printk("%s: Illegal operation code in firmware\n", + dev->name); + /* Parm[0-3]: adapter internal register R13-R15 */ + break; + + case PARITY_ERRORS: + printk("%s: Adapter internal bus parity error\n", + dev->name); + /* Parm[0-3]: adapter internal register R13-R15 */ + break; + + case RAM_DATA_ERROR: + printk("%s: RAM data error\n", dev->name); + /* Parm[0-1]: MSW/LSW address of RAM location. */ + break; + + case RAM_PARITY_ERROR: + printk("%s: RAM parity error\n", dev->name); + /* Parm[0-1]: MSW/LSW address of RAM location. */ + break; + + case RING_UNDERRUN: + printk("%s: Internal DMA underrun detected\n", + dev->name); + break; + + case INVALID_IRQ: + printk("%s: Unrecognized interrupt detected\n", + dev->name); + /* Parm[0-3]: adapter internal register R13-R15 */ + break; + + case INVALID_ERROR_IRQ: + printk("%s: Unrecognized error interrupt detected\n", + dev->name); + /* Parm[0-3]: adapter internal register R13-R15 */ + break; + + case INVALID_XOP: + printk("%s: Unrecognized XOP request detected\n", + dev->name); + /* Parm[0-3]: adapter internal register R13-R15 */ + break; + + default: + printk("%s: Unknown status", dev->name); + break; + } + + if(sktr_chipset_init(dev) == 1) + { + /* Restart of firmware successful */ + tp->AdapterOpenFlag = 1; + } + + return; +} + +/* + * Internal adapter pointer to RAM data are copied from adapter into + * host system. + */ +static void sktr_read_ptr(struct device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + unsigned short adapterram; + + sktr_read_ram(dev, (unsigned char *)&tp->intptrs.BurnedInAddrPtr, + ADAPTER_INT_PTRS, 16); + sktr_read_ram(dev, (unsigned char *)&adapterram, + (unsigned short)SWAPB(tp->intptrs.AdapterRAMPtr), 2); + + printk(KERN_INFO "%s: Adapter RAM size: %d K\n", + dev->name, SWAPB(adapterram)); + + return; +} + +/* + * Reads a number of bytes from adapter to system memory. + */ +static void sktr_read_ram(struct device *dev, unsigned char *Data, + unsigned short Address, int Length) +{ + int i; + unsigned short old_sifadx, old_sifadr, InWord; + unsigned short ioaddr = dev->base_addr; + + /* Save the current values */ + old_sifadx = inw(ioaddr + SIFADX); + old_sifadr = inw(ioaddr + SIFADR); + + /* Page number of adapter memory */ + outw(0x0001, ioaddr + SIFADX); + /* Address offset in adapter RAM */ + outw(Address, ioaddr + SIFADR); + + /* Copy len byte from adapter memory to system data area. */ + i = 0; + for(;;) + { + InWord = inw(ioaddr + SIFINC); + + *(Data + i) = HIBYTE(InWord); /* Write first byte */ + if(++i == Length) /* All is done break */ + break; + + *(Data + i) = LOBYTE(InWord); /* Write second byte */ + if (++i == Length) /* All is done break */ + break; + } + + /* Restore original values */ + outw(old_sifadx, ioaddr + SIFADX); + outw(old_sifadr, ioaddr + SIFADR); + + return; +} + +/* + * Reads MAC address from adapter ROM. + */ +static void sktr_read_addr(struct device *dev, unsigned char *Address) +{ + int i, In; + unsigned short ioaddr = dev->base_addr; + + /* Address: 0000:0000 */ + outw(0, ioaddr + SIFADX); + outw(0, ioaddr + SIFADR); + + /* Read six byte MAC address data */ + for(i = 0; i < 6; i++) + { + In = inw(ioaddr + SIFINC); + *(Address + i) = (unsigned char)(In >> 8); + } + + return; +} + +/* + * Cancel all queued packets in the transmission queue. + */ +static void sktr_cancel_tx_queue(struct net_local* tp) +{ + TPL *tpl; + struct sk_buff *skb; + + /* + * NOTE: There must not be an active TRANSMIT command pending, when + * this function is called. + */ + if(tp->TransmitCommandActive) + return; + + for(;;) + { + tpl = tp->TplBusy; + if(!tpl->BusyFlag) + break; + /* "Remove" TPL from busy list. */ + tp->TplBusy = tpl->NextTPLPtr; + sktr_write_tpl_status(tpl, 0); /* Clear VALID bit */ + tpl->BusyFlag = 0; /* "free" TPL */ + + printk(KERN_INFO "Cancel tx (%08lXh).\n", (unsigned long)tpl); + + dev_kfree_skb(tpl->Skb); + } + + for(;;) + { + skb = skb_dequeue(&tp->SendSkbQueue); + if(skb == NULL) + break; + tp->QueueSkb++; + dev_kfree_skb(skb); + } + + return; +} + +/* + * This function is called whenever a transmit interrupt is generated by the + * adapter. For a command complete interrupt, it is checked if we have to + * issue a new transmit command or not. + */ +static void sktr_tx_status_irq(struct device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + unsigned char HighByte, HighAc, LowAc; + TPL *tpl; + + /* NOTE: At this point the SSB from TRANSMIT STATUS is no longer + * available, because the CLEAR SSB command has already been issued. + * + * Process all complete transmissions. + */ + + for(;;) + { + tpl = tp->TplBusy; + if(!tpl->BusyFlag || (tpl->Status + & (TX_VALID | TX_FRAME_COMPLETE)) + != TX_FRAME_COMPLETE) + { + break; + } + + /* "Remove" TPL from busy list. */ + tp->TplBusy = tpl->NextTPLPtr ; + + if(sktr_debug > 3) + sktr_dump(tpl->MData, SWAPB(tpl->FrameSize)); + + /* Check the transmit status field only for directed frames*/ + if(DIRECTED_FRAME(tpl) && (tpl->Status & TX_ERROR) == 0) + { + HighByte = GET_TRANSMIT_STATUS_HIGH_BYTE(tpl->Status); + HighAc = GET_FRAME_STATUS_HIGH_AC(HighByte); + LowAc = GET_FRAME_STATUS_LOW_AC(HighByte); + + if((HighAc != LowAc) || (HighAc == AC_NOT_RECOGNIZED)) + { + printk(KERN_INFO "%s: (DA=%08lX not recognized)", + dev->name, + *(unsigned long *)&tpl->MData[2+2]); + } + else + { + if(sktr_debug > 3) + printk("%s: Directed frame tx'd\n", + dev->name); + } + } + else + { + if(!DIRECTED_FRAME(tpl)) + { + if(sktr_debug > 3) + printk("%s: Broadcast frame tx'd\n", + dev->name); + } + } + + tp->MacStat.tx_packets++; + dev_kfree_skb(tpl->Skb); + tpl->BusyFlag = 0; /* "free" TPL */ + } + + dev->tbusy = 0; + if(tp->QueueSkb < MAX_TX_QUEUE) + sktr_hardware_send_packet(dev, tp); + + return; +} + +/* + * Called if a frame receive interrupt is generated by the adapter. + * Check if the frame is valid and indicate it to system. + */ +static void sktr_rcv_status_irq(struct device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + unsigned char *ReceiveDataPtr; + struct sk_buff *skb; + unsigned int Length, Length2; + RPL *rpl; + RPL *SaveHead; + + /* NOTE: At this point the SSB from RECEIVE STATUS is no longer + * available, because the CLEAR SSB command has already been issued. + * + * Process all complete receives. + */ + + for(;;) + { + rpl = tp->RplHead; + if(rpl->Status & RX_VALID) + break; /* RPL still in use by adapter */ + + /* Forward RPLHead pointer to next list. */ + SaveHead = tp->RplHead; + tp->RplHead = rpl->NextRPLPtr; + + /* Get the frame size (Byte swap for Intel). + * Do this early (see workaround comment below) + */ + Length = (unsigned short)SWAPB(rpl->FrameSize); + + /* Check if the Frame_Start, Frame_End and + * Frame_Complete bits are set. + */ + if((rpl->Status & VALID_SINGLE_BUFFER_FRAME) + == VALID_SINGLE_BUFFER_FRAME) + { + ReceiveDataPtr = rpl->MData; + + /* Workaround for delayed write of FrameSize on ISA + * (FrameSize is false but valid-bit is reset) + * Frame size is set to zero when the RPL is freed. + * Length2 is there because there have also been + * cases where the FrameSize was partially written + */ + Length2 = (unsigned short)SWAPB(rpl->FrameSize); + + if(Length == 0 || Length != Length2) + { + tp->RplHead = SaveHead; + break; /* Return to sktr_interrupt */ + } + + /* Drop frames sent by myself */ + if(sktr_chk_frame(dev, rpl->MData)) + { + printk(KERN_INFO "%s: Received my own frame\n", + dev->name); + if(rpl->Skb != NULL) + dev_kfree_skb(rpl->Skb); + } + else + { + sktr_update_rcv_stats(tp,ReceiveDataPtr,Length); + + if(sktr_debug > 3) + printk("%s: Packet Length %04X (%d)\n", + dev->name, Length, Length); + + /* Indicate the received frame to system the + * adapter does the Source-Routing padding for + * us. See: OpenOptions in sktr_init_opb() + */ + skb = rpl->Skb; + if(rpl->SkbStat == SKB_UNAVAILABLE) + { + /* Try again to allocate skb */ + skb = dev_alloc_skb(tp->MaxPacketSize); + if(skb == NULL) + { + /* Update Stats ?? */ + } + else + { + skb->dev = dev; + skb_put(skb, tp->MaxPacketSize); + rpl->SkbStat = SKB_DATA_COPY; + ReceiveDataPtr = rpl->MData; + } + } + + if(rpl->SkbStat == SKB_DATA_COPY + || rpl->SkbStat == SKB_DMA_DIRECT) + { + if(rpl->SkbStat == SKB_DATA_COPY) + { + memmove(skb->data, ReceiveDataPtr, Length); + } + + /* Deliver frame to system */ + rpl->Skb = NULL; + skb_trim(skb,Length); + skb->protocol = tr_type_trans(skb,dev); + netif_rx(skb); + } + } + } + else /* Invalid frame */ + { + if(rpl->Skb != NULL) + dev_kfree_skb(rpl->Skb); + + /* Skip list. */ + if(rpl->Status & RX_START_FRAME) + /* Frame start bit is set -> overflow. */ + tp->MacStat.rx_errors++; + } + + /* Allocate new skb for rpl */ + rpl->Skb = dev_alloc_skb(tp->MaxPacketSize); + + /* skb == NULL ? then use local buffer */ + if(rpl->Skb == NULL) + { + rpl->SkbStat = SKB_UNAVAILABLE; + rpl->FragList[0].DataAddr = htonl(virt_to_bus(tp->LocalRxBuffers[rpl->RPLIndex])); + rpl->MData = tp->LocalRxBuffers[rpl->RPLIndex]; + } + else /* skb != NULL */ + { + rpl->Skb->dev = dev; + skb_put(rpl->Skb, tp->MaxPacketSize); + + /* Data unreachable for DMA ? then use local buffer */ + if(virt_to_bus(rpl->Skb->data) + tp->MaxPacketSize + > ISA_MAX_ADDRESS) + { + rpl->SkbStat = SKB_DATA_COPY; + rpl->FragList[0].DataAddr = htonl(virt_to_bus(tp->LocalRxBuffers[rpl->RPLIndex])); + rpl->MData = tp->LocalRxBuffers[rpl->RPLIndex]; + } + else + { + /* DMA directly in skb->data */ + rpl->SkbStat = SKB_DMA_DIRECT; + rpl->FragList[0].DataAddr = htonl(virt_to_bus(rpl->Skb->data)); + rpl->MData = rpl->Skb->data; + } + } + + rpl->FragList[0].DataCount = SWAPB(tp->MaxPacketSize); + rpl->FrameSize = 0; + + /* Pass the last RPL back to the adapter */ + tp->RplTail->FrameSize = 0; + + /* Reset the CSTAT field in the list. */ + sktr_write_rpl_status(tp->RplTail, RX_VALID | RX_FRAME_IRQ); + + /* Current RPL becomes last one in list. */ + tp->RplTail = tp->RplTail->NextRPLPtr; + + /* Inform adapter about RPL valid. */ + sktr_exec_sifcmd(dev, CMD_RX_VALID); + } + + return; +} + +/* + * This function should be used whenever the status of any RPL must be + * modified by the driver, because the compiler may otherwise change the + * order of instructions such that writing the RPL status may be executed + * at an undesireable time. When this function is used, the status is + * always written when the function is called. + */ +static void sktr_write_rpl_status(RPL *rpl, unsigned int Status) +{ + rpl->Status = Status; + + return; +} + +/* + * The function updates the statistic counters in mac->MacStat. + * It differtiates between directed and broadcast/multicast ( ==functional) + * frames. + */ +static void sktr_update_rcv_stats(struct net_local *tp, unsigned char DataPtr[], + unsigned int Length) +{ + tp->MacStat.rx_packets++; + + /* Test functional bit */ + if(DataPtr[2] & GROUP_BIT) + tp->MacStat.multicast++; + + return; +} + +/* + * Check if it is a frame of myself. Compare source address with my current + * address in reverse direction, and mask out the TR_RII. + */ +static unsigned char sktr_chk_frame(struct device *dev, unsigned char *Addr) +{ + int i; + + for(i = 5; i > 0; i--) + { + if(Addr[8 + i] != dev->dev_addr[i]) + return (0); + } + + /* Mask out RIF bit. */ + if((Addr[8] & ~TR_RII) != (unsigned char)(dev->dev_addr[0])) + return (0); + + return (1); /* It is my frame. */ +} + +/* + * Dump Packet (data) + */ +static void sktr_dump(unsigned char *Data, int length) +{ + int i, j; + + for (i = 0, j = 0; i < length / 8; i++, j += 8) + { + printk(KERN_DEBUG "%02x %02x %02x %02x %02x %02x %02x %02x\n", + Data[j+0],Data[j+1],Data[j+2],Data[j+3], + Data[j+4],Data[j+5],Data[j+6],Data[j+7]); + } + + return; +} + +#ifdef MODULE + +static struct device* dev_sktr[SKTR_MAX_ADAPTERS]; +static int io[SKTR_MAX_ADAPTERS] = { 0, 0 }; +static int irq[SKTR_MAX_ADAPTERS] = { 0, 0 }; +static int mem[SKTR_MAX_ADAPTERS] = { 0, 0 }; + +MODULE_PARM(io, "1-" __MODULE_STRING(SKTR_MAX_ADAPTERS) "i"); +MODULE_PARM(irq, "1-" __MODULE_STRING(SKTR_MAX_ADAPTERS) "i"); +MODULE_PARM(mem, "1-" __MODULE_STRING(SKTR_MAX_ADAPTERS) "i"); + +int init_module(void) +{ + int i; + + for(i = 0; i < SKTR_MAX_ADAPTERS; i++) + { + irq[i] = 0; + mem[i] = 0; + dev_sktr[i] = NULL; + dev_sktr[i] = init_trdev(dev_sktr[i], 0); + if(dev_sktr[i] == NULL) + return (-ENOMEM); + + dev_sktr[i]->base_addr = io[i]; + dev_sktr[i]->irq = irq[i]; + dev_sktr[i]->mem_start = mem[i]; + dev_sktr[i]->init = &sktr_probe; + + if(register_trdev(dev_sktr[i]) != 0) + { + kfree_s(dev_sktr[i], sizeof(struct device)); + dev_sktr[i] = NULL; + if(i == 0) + { + printk("sktr: register_trdev() returned non-zero.\n"); + return (-EIO); + } + else + return (0); + } + } + + return (0); +} + +void cleanup_module(void) +{ + int i; + + for(i = 0; i < SKTR_MAX_ADAPTERS; i++) + { + if(dev_sktr[i]) + { + unregister_trdev(dev_sktr[i]); + release_region(dev_sktr[i]->base_addr, SKTR_IO_EXTENT); + if(dev_sktr[i]->irq) + free_irq(dev_sktr[i]->irq, dev_sktr[i]); + if(dev_sktr[i]->dma > 0) + free_dma(dev_sktr[i]->dma); + if(dev_sktr[i]->priv) + kfree_s(dev_sktr[i]->priv, sizeof(struct net_local)); + kfree_s(dev_sktr[i], sizeof(struct device)); + dev_sktr[i] = NULL; + } + } +} +#endif /* MODULE */ diff --git a/drivers/net/sktr.h b/drivers/net/sktr.h new file mode 100644 index 000000000000..e0fe718e7a49 --- /dev/null +++ b/drivers/net/sktr.h @@ -0,0 +1,1098 @@ +/* sktr.h: SysKonnect TokenRing driver for Linux + * + * Authors: + * - Christoph Goos + */ + +#ifndef __LINUX_SKTR_H +#define __LINUX_SKTR_H + +#ifdef __KERNEL__ + +#define SKTR_MAX_ADAPTERS 7 + +#define SEND_TIMEOUT 10*HZ + +#define TR_RCF_LONGEST_FRAME_MASK 0x0070 +#define TR_RCF_FRAME4K 0x0030 + +/*------------------------------------------------------------------*/ +/* Bit order for adapter communication with DMA */ +/* -------------------------------------------------------------- */ +/* Bit 8 | 9| 10| 11|| 12| 13| 14| 15|| 0| 1| 2| 3|| 4| 5| 6| 7| */ +/* -------------------------------------------------------------- */ +/* The bytes in a word must be byte swapped. Also, if a double */ +/* word is used for storage, then the words, as well as the bytes, */ +/* must be swapped. */ +/* Bit order for adapter communication with DIO */ +/* -------------------------------------------------------------- */ +/* Bit 0 | 1| 2| 3|| 4| 5| 6| 7|| 8| 9| 10| 11|| 12| 13| 14| 15| */ +/* -------------------------------------------------------------- */ +/*------------------------------------------------------------------*/ + +/* Swap bytes of a word. */ +#define SWAPB(x) (((unsigned short)((x) << 8)) | ((unsigned short)((x) >> 8))) + +/* Swap words of a long. */ +#define SWAPW(x) (((x) << 16) | ((x) >> 16)) + +/* Get the low byte of a word. */ +#define LOBYTE(w) ((unsigned char)(w)) + +/* Get the high byte of a word. */ +#define HIBYTE(w) ((unsigned char)((unsigned short)(w) >> 8)) + +/* Get the low word of a long. */ +#define LOWORD(l) ((unsigned short)(l)) + +/* Get the high word of a long. */ +#define HIWORD(l) ((unsigned short)((unsigned long)(l) >> 16)) + + + +/* Token ring adapter I/O addresses for normal mode. */ +#define SIFDAT 0L /* SIF/DMA data. */ +#define SIFINC 2L /* IO Word data with auto increment. */ +#define SIFINH 3L /* IO Byte data with auto increment. */ +#define SIFADR 4L /* SIF/DMA Address. */ +#define SIFCMD 6L /* SIF Command. */ +#define SIFSTS 6L /* SIF Status. */ +#define SIFACL 8L /* SIF Adapter Control Register. */ +#define SIFADD 10L /* SIF/DMA Address. */ +#define SIFADX 12L +#define DMALEN 14L /* SIF DMA length. */ +#define POSREG 16L /* Adapter Program Option Select (POS) + * Register: base IO address + 16 byte. + */ +#define POSREG_2 24L /* only for TR4/16+ adapter + * base IO address + 24 byte. + */ + + +/* SIFCMD command codes (high-low) */ +#define CMD_INTERRUPT_ADAPTER 0x8000 /* Cause internal adapter interrupt */ +#define CMD_ADAPTER_RESET 0x4000 /* Hardware reset of adapter */ +#define CMD_SSB_CLEAR 0x2000 /* Acknowledge to adapter to + * system interrupts. + */ +#define CMD_EXECUTE 0x1000 /* Execute SCB command */ +#define CMD_SCB_REQUEST 0x0800 /* Request adapter to interrupt + * system when SCB is available for + * another command. + */ +#define CMD_RX_CONTINUE 0x0400 /* Continue receive after odd pointer + * stop. (odd pointer receive method) + */ +#define CMD_RX_VALID 0x0200 /* Now actual RPL is valid. */ +#define CMD_TX_VALID 0x0100 /* Now actual TPL is valid. (valid + * bit receive/transmit method) + */ +#define CMD_SYSTEM_IRQ 0x0080 /* Adapter-to-attached-system + * interrupt is reset. + */ +#define CMD_CLEAR_SYSTEM_IRQ 0x0080 /* Clear SYSTEM_INTERRUPT bit. + * (write: 1=ignore, 0=reset) + */ +#define EXEC_SOFT_RESET 0xFF00 /* adapter soft reset. (restart + * adapter after hardware reset) + */ + + +/* ACL commands (high-low) */ +#define ACL_SWHLDA 0x0800 /* Software hold acknowledge. */ +#define ACL_SWDDIR 0x0400 /* Data transfer direction. */ +#define ACL_SWHRQ 0x0200 /* Pseudo DMA operation. */ +#define ACL_PSDMAEN 0x0100 /* Enable pseudo system DMA. */ +#define ACL_ARESET 0x0080 /* Adapter hardware reset command. + * (held in reset condition as + * long as bit is set) + */ +#define ACL_CPHALT 0x0040 /* Communication processor halt. + * (can only be set while ACL_ARESET + * bit is set; prevents adapter + * processor from executing code while + * downloading firmware) + */ +#define ACL_BOOT 0x0020 +#define ACL_SINTEN 0x0008 /* System interrupt enable/disable + * (1/0): can be written if ACL_ARESET + * is zero. + */ +#define ACL_SPEED4 0x0003 +#define ACL_SPEED16 0x0001 +#define PS_DMA_MASK (ACL_SWHRQ | ACL_PSDMAEN) + + +/* SIFSTS register return codes (high-low) */ +#define STS_SYSTEM_IRQ 0x0080 /* Adapter-to-attached-system + * interrupt is valid. + */ +#define STS_INITIALIZE 0x0040 /* INITIALIZE status. (ready to + * initialize) + */ +#define STS_TEST 0x0020 /* TEST status. (BUD not completed) */ +#define STS_ERROR 0x0010 /* ERROR status. (unrecoverable + * HW error occurred) + */ +#define STS_MASK 0x00F0 /* Mask interesting status bits. */ +#define STS_ERROR_MASK 0x000F /* Get Error Code by masking the + * interrupt code bits. + */ +#define ADAPTER_INT_PTRS 0x0A00 /* Address offset of adapter internal + * pointers 01:0a00 (high-low) have to + * be read after init and before open. + */ + + +/* Interrupt Codes (only MAC IRQs) */ +#define STS_IRQ_ADAPTER_CHECK 0x0000 /* unrecoverable hardware or + * software error. + */ +#define STS_IRQ_RING_STATUS 0x0004 /* SSB is updated with ring status. */ +#define STS_IRQ_SCB_CLEAR 0x0006 /* SCB clear, following an + * SCB_REQUEST IRQ. + */ +#define STS_IRQ_COMMAND_STATUS 0x0008 /* SSB is updated with command + * status. + */ +#define STS_IRQ_RECEIVE_STATUS 0x000A /* SSB is updated with receive + * status. + */ +#define STS_IRQ_TRANSMIT_STATUS 0x000C /* SSB is updated with transmit + * status + */ +#define STS_IRQ_MASK 0x000F /* = STS_ERROR_MASK. */ + + +/* TRANSMIT_STATUS completion code: (SSB.Parm[0]) */ +#define COMMAND_COMPLETE 0x0080 /* TRANSMIT command completed + * (avoid this!) issue another transmit + * to send additional frames. + */ +#define FRAME_COMPLETE 0x0040 /* Frame has been transmitted; + * INTERRUPT_FRAME bit was set in the + * CSTAT request; indication of possibly + * more than one frame transmissions! + * SSB.Parm[0-1]: 32 bit pointer to + * TPL of last frame. + */ +#define LIST_ERROR 0x0020 /* Error in one of the TPLs that + * compose the frame; TRANSMIT + * terminated; Parm[1-2]: 32 bit pointer + * to TPL which starts the error + * frame; error details in bits 8-13. + * (14?) + */ +#define FRAME_SIZE_ERROR 0x8000 /* FRAME_SIZE does not equal the sum of + * the valid DATA_COUNT fields; + * FRAME_SIZE less than header plus + * information field. (15 bytes + + * routing field) Or if FRAME_SIZE + * was specified as zero in one list. + */ +#define TX_THRESHOLD 0x4000 /* FRAME_SIZE greater than (BUFFER_SIZE + * - 9) * TX_BUF_MAX. + */ +#define ODD_ADDRESS 0x2000 /* Odd forward pointer value is + * read on a list without END_FRAME + * indication. + */ +#define FRAME_ERROR 0x1000 /* START_FRAME bit is (not) anticipated, + * but (not) set. + */ +#define ACCESS_PRIORITY_ERROR 0x0800 /* Access priority requested has not + * been allowed. + */ +#define UNENABLED_MAC_FRAME 0x0400 /* MAC frame has source class of zero + * or MAC frame PCF ATTN field is + * greater than one. + */ +#define ILLEGAL_FRAME_FORMAT 0x0200 /* Bit 0 or FC field was set to one. */ + + +/* + * Since we need to support some functions even if the adapter is in a + * CLOSED state, we have a (pseudo-) command queue which holds commands + * that are outstandig to be executed. + * + * Each time a command completes, an interrupt occurs and the next + * command is executed. The command queue is actually a simple word with + * a bit for each outstandig command. Therefore the commands will not be + * executed in the order they have been queued. + * + * The following defines the command code bits and the command queue: + */ +#define OC_OPEN 0x0001 /* OPEN command */ +#define OC_TRANSMIT 0x0002 /* TRANSMIT command */ +#define OC_TRANSMIT_HALT 0x0004 /* TRANSMIT_HALT command */ +#define OC_RECEIVE 0x0008 /* RECEIVE command */ +#define OC_CLOSE 0x0010 /* CLOSE command */ +#define OC_SET_GROUP_ADDR 0x0020 /* SET_GROUP_ADDR command */ +#define OC_SET_FUNCT_ADDR 0x0040 /* SET_FUNCT_ADDR command */ +#define OC_READ_ERROR_LOG 0x0080 /* READ_ERROR_LOG command */ +#define OC_READ_ADAPTER 0x0100 /* READ_ADAPTER command */ +#define OC_MODIFY_OPEN_PARMS 0x0400 /* MODIFY_OPEN_PARMS command */ +#define OC_RESTORE_OPEN_PARMS 0x0800 /* RESTORE_OPEN_PARMS command */ +#define OC_SET_FIRST_16_GROUP 0x1000 /* SET_FIRST_16_GROUP command */ +#define OC_SET_BRIDGE_PARMS 0x2000 /* SET_BRIDGE_PARMS command */ +#define OC_CONFIG_BRIDGE_PARMS 0x4000 /* CONFIG_BRIDGE_PARMS command */ + +#define OPEN 0x0300 /* C: open command. S: completion. */ +#define TRANSMIT 0x0400 /* C: transmit command. S: completion + * status. (reject: COMMAND_REJECT if + * adapter not opened, TRANSMIT already + * issued or address passed in the SCB + * not word aligned) + */ +#define TRANSMIT_HALT 0x0500 /* C: interrupt TX TPL chain; if no + * TRANSMIT command issued, the command + * is ignored. (completion with TRANSMIT + * status (0x0400)!) + */ +#define RECEIVE 0x0600 /* C: receive command. S: completion + * status. (reject: COMMAND_REJECT if + * adapter not opened, RECEIVE already + * issued or address passed in the SCB + * not word aligned) + */ +#define CLOSE 0x0700 /* C: close adapter. S: completion. + * (COMMAND_REJECT if adapter not open) + */ +#define SET_GROUP_ADDR 0x0800 /* C: alter adapter group address after + * OPEN. S: completion. (COMMAND_REJECT + * if adapter not open) + */ +#define SET_FUNCT_ADDR 0x0900 /* C: alter adapter functional address + * after OPEN. S: completion. + * (COMMAND_REJECT if adapter not open) + */ +#define READ_ERROR_LOG 0x0A00 /* C: read adapter error counters. + * S: completion. (command ignored + * if adapter not open!) + */ +#define READ_ADAPTER 0x0B00 /* C: read data from adapter memory. + * (important: after init and before + * open!) S: completion. (ADAPTER_CHECK + * interrupt if undefined storage area + * read) + */ +#define MODIFY_OPEN_PARMS 0x0D00 /* C: modify some adapter operational + * parameters. (bit correspondend to + * WRAP_INTERFACE is ignored) + * S: completion. (reject: + * COMMAND_REJECT) + */ +#define RESTORE_OPEN_PARMS 0x0E00 /* C: modify some adapter operational + * parameters. (bit correspondend + * to WRAP_INTERFACE is ignored) + * S: completion. (reject: + * COMMAND_REJECT) + */ +#define SET_FIRST_16_GROUP 0x0F00 /* C: alter the first two bytes in + * adapter group address. + * S: completion. (reject: + * COMMAND_REJECT) + */ +#define SET_BRIDGE_PARMS 0x1000 /* C: values and conditions for the + * adapter hardware to use when frames + * are copied for forwarding. + * S: completion. (reject: + * COMMAND_REJECT) + */ +#define CONFIG_BRIDGE_PARMS 0x1100 /* C: .. + * S: completion. (reject: + * COMMAND_REJECT) + */ + +#define SPEED_4 4 +#define SPEED_16 16 /* Default transmission speed */ + + +/* Initialization Parameter Block (IPB); word alignment necessary! */ +#define BURST_SIZE 0x0018 /* Default burst size */ +#define BURST_MODE 0x9F00 /* Burst mode enable */ +#define DMA_RETRIES 0x0505 /* Magic DMA retry number... */ + +#define CYCLE_TIME 3 /* Default AT-bus cycle time: 500 ns + * (later adapter version: fix cycle time!) + */ +#define LINE_SPEED_BIT 0x80 + +/* Macro definition for the wait function. */ +#define ONE_SECOND_TICKS 1000000 +#define HALF_SECOND (ONE_SECOND_TICKS / 2) +#define ONE_SECOND (ONE_SECOND_TICKS) +#define TWO_SECONDS (ONE_SECOND_TICKS * 2) +#define THREE_SECONDS (ONE_SECOND_TICKS * 3) +#define FOUR_SECONDS (ONE_SECOND_TICKS * 4) +#define FIVE_SECONDS (ONE_SECOND_TICKS * 5) + +#define BUFFER_SIZE 2048 /* Buffers on Adapter */ + +#pragma pack(1) +typedef struct { + unsigned short Init_Options; /* Initialize with burst mode; + * LLC disabled. (MAC only) + */ + + /* Interrupt vectors the adapter places on attached system bus. */ + unsigned char CMD_Status_IV; /* Interrupt vector: command status. */ + unsigned char TX_IV; /* Interrupt vector: transmit. */ + unsigned char RX_IV; /* Interrupt vector: receive. */ + unsigned char Ring_Status_IV; /* Interrupt vector: ring status. */ + unsigned char SCB_Clear_IV; /* Interrupt vector: SCB clear. */ + unsigned char Adapter_CHK_IV; /* Interrupt vector: adapter check. */ + + unsigned short RX_Burst_Size; /* Max. number of transfer cycles. */ + unsigned short TX_Burst_Size; /* During DMA burst; even value! */ + unsigned short DMA_Abort_Thrhld; /* Number of DMA retries. */ + + unsigned long SCB_Addr; /* SCB address: even, word aligned, high-low. */ + unsigned long SSB_Addr; /* SSB address: even, word aligned, high-low. */ +} IPB, *IPB_Ptr; +#pragma pack() + +/* + * OPEN Command Parameter List (OCPL) (can be reused, if the adapter has to + * be reopened) + */ +#define BUFFER_SIZE 2048 /* Buffers on Adapter. */ +#define TPL_SIZE 8+6*TX_FRAG_NUM /* Depending on fragments per TPL. */ +#define RPL_SIZE 14 /* (with TI firmware v2.26 handling + * up to nine fragments possible) + */ +#define TX_BUF_MIN 20 /* ??? (Stephan: calculation with */ +#define TX_BUF_MAX 40 /* BUFFER_SIZE and MAX_FRAME_SIZE) ??? + */ +#define DISABLE_EARLY_TOKEN_RELEASE 0x1000 + +/* OPEN Options (high-low) */ +#define WRAP_INTERFACE 0x0080 /* Inserting omitted for test + * purposes; transmit data appears + * as receive data. (usefull for + * testing; change: CLOSE necessary) + */ +#define DISABLE_HARD_ERROR 0x0040 /* On HARD_ERROR & TRANSMIT_BEACON + * no RING.STATUS interrupt. + */ +#define DISABLE_SOFT_ERROR 0x0020 /* On SOFT_ERROR, no RING.STATUS + * interrupt. + */ +#define PASS_ADAPTER_MAC_FRAMES 0x0010 /* Passing unsupported MAC frames + * to system. + */ +#define PASS_ATTENTION_FRAMES 0x0008 /* All changed attention MAC frames are + * passed to the system. + */ +#define PAD_ROUTING_FIELD 0x0004 /* Routing field is padded to 18 + * bytes. + */ +#define FRAME_HOLD 0x0002 /* Adapter waits for entire frame before + * initiating DMA transfer; otherwise: + * DMA transfer initiation if internal + * buffer filled. + */ +#define CONTENDER 0x0001 /* Adapter participates in the monitor + * contention process. + */ +#define PASS_BEACON_MAC_FRAMES 0x8000 /* Adapter passes beacon MAC frames + * to the system. + */ +#define EARLY_TOKEN_RELEASE 0x1000 /* Only valid in 16 Mbps operation; + * 0 = ETR. (no effect in 4 Mbps + * operation) + */ +#define COPY_ALL_MAC_FRAMES 0x0400 /* All MAC frames are copied to + * the system. (after OPEN: duplicate + * address test (DAT) MAC frame is + * first received frame copied to the + * system) + */ +#define COPY_ALL_NON_MAC_FRAMES 0x0200 /* All non MAC frames are copied to + * the system. + */ +#define PASS_FIRST_BUF_ONLY 0x0100 /* Passes only first internal buffer + * of each received frame; FrameSize + * of RPLs must contain internal + * BUFFER_SIZE bits for promiscous mode. + */ +#define ENABLE_FULL_DUPLEX_SELECTION 0x2000 /* Enable the use of full-duplex + * settings with bits in byte 22 in + * ocpl. (new feature in firmware + * version 3.09) + */ + +/* Full-duplex settings */ +#define OPEN_FULL_DUPLEX_OFF 0x0000 +#define OPEN_FULL_DUPLEX_ON 0x00c0 +#define OPEN_FULL_DUPLEX_AUTO 0x0080 + +#define PROD_ID_SIZE 18 /* Length of product ID. */ + +#define TX_FRAG_NUM 3 /* Number of fragments used in one TPL. */ +#define TX_MORE_FRAGMENTS 0x8000 /* Bit set in DataCount to indicate more + * fragments following. + */ + +#define ISA_MAX_ADDRESS 0x00ffffff + +#pragma pack(1) +typedef struct { + unsigned short OPENOptions; + unsigned char NodeAddr[6]; /* Adapter node address; use ROM + * address + */ + unsigned long GroupAddr; /* Multicast: high order + * bytes = 0xC000 + */ + unsigned long FunctAddr; /* High order bytes = 0xC000 */ + unsigned short RxListSize; /* RPL size: 0 (=26), 14, 20 or + * 26 bytes read by the adapter. + * (Depending on the number of + * fragments/list) + */ + unsigned short TxListSize; /* TPL size */ + unsigned short BufSize; /* Is automatically rounded up to the + * nearest nK boundary. + */ + unsigned short FullDuplex; + unsigned short Reserved; + unsigned char TXBufMin; /* Number of adapter buffers reserved + * for transmission a minimum of 2 + * buffers must be allocated. + */ + unsigned char TXBufMax; /* Maximum number of adapter buffers + * for transmit; a minimum of 2 buffers + * must be available for receive. + * Default: 6 + */ + unsigned short ProdIDAddr[2]; /* Pointer to product ID. */ +} OPB, *OPB_Ptr; +#pragma pack() + +/* + * SCB: adapter commands enabled by the host system started by writing + * CMD_INTERRUPT_ADAPTER | CMD_EXECUTE (|SCB_REQUEST) to the SIFCMD IO + * register. (special case: | CMD_SYSTEM_IRQ for initialization) + */ +#pragma pack(1) +typedef struct { + unsigned short CMD; /* Command code */ + unsigned short Parm[2]; /* Pointer to Command Parameter Block */ +} SCB; /* System Command Block (32 bit physical address; big endian)*/ +#pragma pack() + +/* + * SSB: adapter command return status can be evaluated after COMMAND_STATUS + * adapter to system interrupt after reading SSB, the availability of the SSB + * has to be told the adapter by writing CMD_INTERRUPT_ADAPTER | CMD_SSB_CLEAR + * in the SIFCMD IO register. + */ +#pragma pack(1) +typedef struct { + unsigned short STS; /* Status code */ + unsigned short Parm[3]; /* Parameter or pointer to Status Parameter + * Block. + */ +} SSB; /* System Status Block (big endian - physical address) */ +#pragma pack() + +typedef struct { + unsigned short BurnedInAddrPtr; /* Pointer to adapter burned in + * address. (BIA) + */ + unsigned short SoftwareLevelPtr;/* Pointer to software level data. */ + unsigned short AdapterAddrPtr; /* Pointer to adapter addresses. */ + unsigned short AdapterParmsPtr; /* Pointer to adapter parameters. */ + unsigned short MACBufferPtr; /* Pointer to MAC buffer. (internal) */ + unsigned short LLCCountersPtr; /* Pointer to LLC counters. */ + unsigned short SpeedFlagPtr; /* Pointer to data rate flag. + * (4/16 Mbps) + */ + unsigned short AdapterRAMPtr; /* Pointer to adapter RAM found. (KB) */ +} INTPTRS; /* Adapter internal pointers */ + +#pragma pack(1) +typedef struct { + unsigned char Line_Error; /* Line error: code violation in + * frame or in a token, or FCS error. + */ + unsigned char Internal_Error; /* IBM specific. (Reserved_1) */ + unsigned char Burst_Error; + unsigned char ARI_FCI_Error; /* ARI/FCI bit zero in AMP or + * SMP MAC frame. + */ + unsigned char AbortDelimeters; /* IBM specific. (Reserved_2) */ + unsigned char Reserved_3; + unsigned char Lost_Frame_Error; /* Receive of end of transmitted + * frame failed. + */ + unsigned char Rx_Congest_Error; /* Adapter in repeat mode has not + * enough buffer space to copy incoming + * frame. + */ + unsigned char Frame_Copied_Error;/* ARI bit not zero in frame + * addressed to adapter. + */ + unsigned char Frequency_Error; /* IBM specific. (Reserved_4) */ + unsigned char Token_Error; /* (active only in monitor station) */ + unsigned char Reserved_5; + unsigned char DMA_Bus_Error; /* DMA bus errors not exceeding the + * abort thresholds. + */ + unsigned char DMA_Parity_Error; /* DMA parity errors not exceeding + * the abort thresholds. + */ +} ERRORTAB; /* Adapter error counters */ +#pragma pack() + + +/*--------------------- Send and Receive definitions -------------------*/ +#pragma pack(1) +typedef struct { + unsigned short DataCount; /* Value 0, even and odd values are + * permitted; value is unaltered most + * significant bit set: following + * fragments last fragment: most + * significant bit is not evaluated. + * (???) + */ + unsigned long DataAddr; /* Pointer to frame data fragment; + * even or odd. + */ +} Fragment; +#pragma pack() + +#define MAX_FRAG_NUMBERS 9 /* Maximal number of fragments possible to use + * in one RPL/TPL. (depending on TI firmware + * version) + */ +#define MAX_TX_QUEUE 10 /* Maximal number of skb's queued in driver. */ + +/* + * AC (1), FC (1), Dst (6), Src (6), RIF (18), Data (4472) = 4504 + * The packet size can be one of the follows: 548, 1502, 2084, 4504, 8176, + * 11439, 17832. Refer to TMS380 Second Generation Token Ring User's Guide + * Page 2-27. + */ +#define HEADER_SIZE (1 + 1 + 6 + 6) +#define SRC_SIZE 18 +#define MIN_DATA_SIZE 516 +#define DEFAULT_DATA_SIZE 4472 +#define MAX_DATA_SIZE 17800 + +#define DEFAULT_PACKET_SIZE (HEADER_SIZE + SRC_SIZE + DEFAULT_DATA_SIZE) +#define MIN_PACKET_SIZE (HEADER_SIZE + SRC_SIZE + MIN_DATA_SIZE) +#define MAX_PACKET_SIZE (HEADER_SIZE + SRC_SIZE + MAX_DATA_SIZE) + +/* + * Macros to deal with the frame status field. + */ +#define AC_NOT_RECOGNIZED 0x00 +#define GROUP_BIT 0x80 +#define GET_TRANSMIT_STATUS_HIGH_BYTE(Ts) ((unsigned char)((Ts) >> 8)) +#define GET_FRAME_STATUS_HIGH_AC(Fs) ((unsigned char)(((Fs) & 0xC0) >> 6)) +#define GET_FRAME_STATUS_LOW_AC(Fs) ((unsigned char)(((Fs) & 0x0C) >> 2)) +#define DIRECTED_FRAME(Context) (!((Context)->MData[2] & GROUP_BIT)) + + +/*--------------------- Send Functions ---------------------------------*/ +/* define TX_CSTAT _REQUEST (R) and _COMPLETE (C) values (high-low) */ + +#define TX_VALID 0x0080 /* R: set via TRANSMIT.VALID interrupt. + * C: always reset to zero! + */ +#define TX_FRAME_COMPLETE 0x0040 /* R: must be reset to zero. + * C: set to one. + */ +#define TX_START_FRAME 0x0020 /* R: start of a frame: 1 + * C: unchanged. + */ +#define TX_END_FRAME 0x0010 /* R: end of a frame: 1 + * C: unchanged. + */ +#define TX_FRAME_IRQ 0x0008 /* R: request interrupt generation + * after transmission. + * C: unchanged. + */ +#define TX_ERROR 0x0004 /* R: reserved. + * C: set to one if Error occurred. + */ +#define TX_INTERFRAME_WAIT 0x0004 +#define TX_PASS_CRC 0x0002 /* R: set if CRC value is already + * calculated. (valid only in + * FRAME_START TPL) + * C: unchanged. + */ +#define TX_PASS_SRC_ADDR 0x0001 /* R: adapter uses explicit frame + * source address and does not overwrite + * with the adapter node address. + * (valid only in FRAME_START TPL) + * + * C: unchanged. + */ +#define TX_STRIP_FS 0xFF00 /* R: reserved. + * C: if no Transmission Error, + * field contains copy of FS byte after + * stripping of frame. + */ + +/* + * Structure of Transmit Parameter Lists (TPLs) (only one frame every TPL, + * but possibly multiple TPLs for one frame) the length of the TPLs has to be + * initialized in the OPL. (OPEN parameter list) + */ +#define TPL_NUM 3 /* Number of Transmit Parameter Lists. + * !! MUST BE >= 3 !! + */ + +#pragma pack(1) +typedef struct s_TPL TPL; + +struct s_TPL { /* Transmit Parameter List (align on even word boundaries) */ + unsigned long NextTPLAddr; /* Pointer to next TPL in chain; if + * pointer is odd: this is the last + * TPL. Pointing to itself can cause + * problems! + */ + volatile unsigned short Status; /* Initialized by the adapter: + * CSTAT_REQUEST important: update least + * significant bit first! Set by the + * adapter: CSTAT_COMPLETE status. + */ + unsigned short FrameSize; /* Number of bytes to be transmitted + * as a frame including AC/FC, + * Destination, Source, Routing field + * not including CRC, FS, End Delimiter + * (valid only if START_FRAME bit in + * CSTAT nonzero) must not be zero in + * any list; maximum value: (BUFFER_SIZE + * - 8) * TX_BUF_MAX sum of DataCount + * values in FragmentList must equal + * Frame_Size value in START_FRAME TPL! + * frame data fragment list. + */ + + /* TPL/RPL size in OPEN parameter list depending on maximal + * numbers of fragments used in one parameter list. + */ + Fragment FragList[TX_FRAG_NUM]; /* Maximum: nine frame fragments in one + * TPL actual version of firmware: 9 + * fragments possible. + */ +#pragma pack() + + /* Special proprietary data and precalculations */ + + TPL *NextTPLPtr; /* Pointer to next TPL in chain. */ + unsigned char *MData; + struct sk_buff *Skb; + unsigned char TPLIndex; + volatile unsigned char BusyFlag;/* Flag: TPL busy? */ +}; + +/* ---------------------Receive Functions-------------------------------* + * define RECEIVE_CSTAT_REQUEST (R) and RECEIVE_CSTAT_COMPLETE (C) values. + * (high-low) + */ +#define RX_VALID 0x0080 /* R: set; tell adapter with + * RECEIVE.VALID interrupt. + * C: reset to zero. + */ +#define RX_FRAME_COMPLETE 0x0040 /* R: must be reset to zero, + * C: set to one. + */ +#define RX_START_FRAME 0x0020 /* R: must be reset to zero. + * C: set to one on the list. + */ +#define RX_END_FRAME 0x0010 /* R: must be reset to zero. + * C: set to one on the list + * that ends the frame. + */ +#define RX_FRAME_IRQ 0x0008 /* R: request interrupt generation + * after receive. + * C: unchanged. + */ +#define RX_INTERFRAME_WAIT 0x0004 /* R: after receiving a frame: + * interrupt and wait for a + * RECEIVE.CONTINUE. + * C: unchanged. + */ +#define RX_PASS_CRC 0x0002 /* R: if set, the adapter includes + * the CRC in data passed. (last four + * bytes; valid only if FRAME_START is + * set) + * C: set, if CRC is included in + * received data. + */ +#define RX_PASS_SRC_ADDR 0x0001 /* R: adapter uses explicit frame + * source address and does not + * overwrite with the adapter node + * address. (valid only if FRAME_START + * is set) + * C: unchanged. + */ +#define RX_RECEIVE_FS 0xFC00 /* R: reserved; must be reset to zero. + * C: on lists with START_FRAME, field + * contains frame status field from + * received frame; otherwise cleared. + */ +#define RX_ADDR_MATCH 0x0300 /* R: reserved; must be reset to zero. + * C: address match code mask. + */ +#define RX_STATUS_MASK 0x00FF /* Mask for receive status bits. */ + +#define RX_INTERN_ADDR_MATCH 0x0100 /* C: internally address match. */ +#define RX_EXTERN_ADDR_MATCH 0x0200 /* C: externally matched via + * XMATCH/XFAIL interface. + */ +#define RX_INTEXT_ADDR_MATCH 0x0300 /* C: internally and externally + * matched. + */ +#define RX_READY (RX_VALID | RX_FRAME_IRQ) /* Ready for receive. */ + +/* Constants for Command Status Interrupt. + * COMMAND_REJECT status field bit functions (SSB.Parm[0]) + */ +#define ILLEGAL_COMMAND 0x0080 /* Set if an unknown command + * is issued to the adapter + */ +#define ADDRESS_ERROR 0x0040 /* Set if any address field in + * the SCB is odd. (not word aligned) + */ +#define ADAPTER_OPEN 0x0020 /* Command issued illegal with + * open adapter. + */ +#define ADAPTER_CLOSE 0x0010 /* Command issued illegal with + * closed adapter. + */ +#define SAME_COMMAND 0x0008 /* Command issued with same command + * already executing. + */ + +/* OPEN_COMPLETION values (SSB.Parm[0], MSB) */ +#define NODE_ADDR_ERROR 0x0040 /* Wrong address or BIA read + * zero address. + */ +#define LIST_SIZE_ERROR 0x0020 /* If List_Size value not in 0, + * 14, 20, 26. + */ +#define BUF_SIZE_ERROR 0x0010 /* Not enough available memory for + * two buffers. + */ +#define TX_BUF_COUNT_ERROR 0x0004 /* Remaining receive buffers less than + * two. + */ +#define OPEN_ERROR 0x0002 /* Error during ring insertion; more + * information in bits 8-15. + */ + +/* Standard return codes */ +#define GOOD_COMPLETION 0x0080 /* =OPEN_SUCCESSFULL */ +#define INVALID_OPEN_OPTION 0x0001 /* OPEN options are not supported by + * the adapter. + */ + +/* OPEN phases; details of OPEN_ERROR (SSB.Parm[0], LSB) */ +#define OPEN_PHASES_MASK 0xF000 /* Check only the bits 8-11. */ +#define LOBE_MEDIA_TEST 0x1000 +#define PHYSICAL_INSERTION 0x2000 +#define ADDRESS_VERIFICATION 0x3000 +#define PARTICIPATION_IN_RING_POLL 0x4000 +#define REQUEST_INITIALISATION 0x5000 +#define FULLDUPLEX_CHECK 0x6000 + +/* OPEN error codes; details of OPEN_ERROR (SSB.Parm[0], LSB) */ +#define OPEN_ERROR_CODES_MASK 0x0F00 /* Check only the bits 12-15. */ +#define OPEN_FUNCTION_FAILURE 0x0100 /* Unable to transmit to itself or + * frames received before insertion. + */ +#define OPEN_SIGNAL_LOSS 0x0200 /* Signal loss condition detected at + * receiver. + */ +#define OPEN_TIMEOUT 0x0500 /* Insertion timer expired before + * logical insertion. + */ +#define OPEN_RING_FAILURE 0x0600 /* Unable to receive own ring purge + * MAC frames. + */ +#define OPEN_RING_BEACONING 0x0700 /* Beacon MAC frame received after + * ring insertion. + */ +#define OPEN_DUPLICATE_NODEADDR 0x0800 /* Other station in ring found + * with the same address. + */ +#define OPEN_REQUEST_INIT 0x0900 /* RPS present but does not respond. */ +#define OPEN_REMOVE_RECEIVED 0x0A00 /* Adapter received a remove adapter + * MAC frame. + */ +#define OPEN_FULLDUPLEX_SET 0x0D00 /* Got this with full duplex on when + * trying to connect to a normal ring. + */ + +/* SET_BRIDGE_PARMS return codes: */ +#define BRIDGE_INVALID_MAX_LEN 0x4000 /* MAX_ROUTING_FIELD_LENGTH odd, + * less than 6 or > 30. + */ +#define BRIDGE_INVALID_SRC_RING 0x2000 /* SOURCE_RING number zero, too large + * or = TARGET_RING. + */ +#define BRIDGE_INVALID_TRG_RING 0x1000 /* TARGET_RING number zero, too large + * or = SOURCE_RING. + */ +#define BRIDGE_INVALID_BRDGE_NO 0x0800 /* BRIDGE_NUMBER too large. */ +#define BRIDGE_INVALID_OPTIONS 0x0400 /* Invalid bridge options. */ +#define BRIDGE_DIAGS_FAILED 0x0200 /* Diagnostics of TMS380SRA failed. */ +#define BRIDGE_NO_SRA 0x0100 /* The TMS380SRA does not exist in HW + * configuration. + */ + +/* + * Bring Up Diagnostics error codes. + */ +#define BUD_INITIAL_ERROR 0x0 +#define BUD_CHECKSUM_ERROR 0x1 +#define BUD_ADAPTER_RAM_ERROR 0x2 +#define BUD_INSTRUCTION_ERROR 0x3 +#define BUD_CONTEXT_ERROR 0x4 +#define BUD_PROTOCOL_ERROR 0x5 +#define BUD_INTERFACE_ERROR 0x6 + +/* BUD constants */ +#define BUD_MAX_RETRIES 3 +#define BUD_MAX_LOOPCNT 6 +#define BUD_TIMEOUT 3000 + +/* Initialization constants */ +#define INIT_MAX_RETRIES 3 /* Maximum three retries. */ +#define INIT_MAX_LOOPCNT 22 /* Maximum loop counts. */ + +/* RING STATUS field values (high/low) */ +#define SIGNAL_LOSS 0x0080 /* Loss of signal on the ring + * detected. + */ +#define HARD_ERROR 0x0040 /* Transmitting or receiving beacon + * frames. + */ +#define SOFT_ERROR 0x0020 /* Report error MAC frame + * transmitted. + */ +#define TRANSMIT_BEACON 0x0010 /* Transmitting beacon frames on the + * ring. + */ +#define LOBE_WIRE_FAULT 0x0008 /* Open or short circuit in the + * cable to concentrator; adapter + * closed. + */ +#define AUTO_REMOVAL_ERROR 0x0004 /* Lobe wrap test failed, deinserted; + * adapter closed. + */ +#define REMOVE_RECEIVED 0x0001 /* Received a remove ring station MAC + * MAC frame request; adapter closed. + */ +#define COUNTER_OVERFLOW 0x8000 /* Overflow of one of the adapters + * error counters; READ.ERROR.LOG. + */ +#define SINGLE_STATION 0x4000 /* Adapter is the only station on the + * ring. + */ +#define RING_RECOVERY 0x2000 /* Claim token MAC frames on the ring; + * reset after ring purge frame. + */ + +#define ADAPTER_CLOSED (LOBE_WIRE_FAULT | AUTO_REMOVAL_ERROR |\ + REMOVE_RECEIVED) + +/* Adapter_check_block.Status field bit assignments: */ +#define DIO_PARITY 0x8000 /* Adapter detects bad parity + * through direct I/O access. + */ +#define DMA_READ_ABORT 0x4000 /* Aborting DMA read operation + * from system Parm[0]: 0=timeout, + * 1=parity error, 2=bus error; + * Parm[1]: 32 bit pointer to host + * system address at failure. + */ +#define DMA_WRITE_ABORT 0x2000 /* Aborting DMA write operation + * to system. (parameters analogous to + * DMA_READ_ABORT) + */ +#define ILLEGAL_OP_CODE 0x1000 /* Illegal operation code in the + * the adapters firmware Parm[0]-2: + * communications processor registers + * R13-R15. + */ +#define PARITY_ERRORS 0x0800 /* Adapter detects internal bus + * parity error. + */ +#define RAM_DATA_ERROR 0x0080 /* Valid only during RAM testing; + * RAM data error Parm[0-1]: 32 bit + * pointer to RAM location. + */ +#define RAM_PARITY_ERROR 0x0040 /* Valid only during RAM testing; + * RAM parity error Parm[0-1]: 32 bit + * pointer to RAM location. + */ +#define RING_UNDERRUN 0x0020 /* Internal DMA underrun when + * transmitting onto ring. + */ +#define INVALID_IRQ 0x0008 /* Unrecognized interrupt generated + * internal to adapter Parm[0-2]: + * adapter register R13-R15. + */ +#define INVALID_ERROR_IRQ 0x0004 /* Unrecognized error interrupt + * generated Parm[0-2]: adapter register + * R13-R15. + */ +#define INVALID_XOP 0x0002 /* Unrecognized XOP request in + * communication processor Parm[0-2]: + * adapter register R13-R15. + */ +#define CHECKADDR 0x05E0 /* Adapter check status information + * address offset. + */ +#define ROM_PAGE_0 0x0000 /* Adapter ROM page 0. */ + +/* + * RECEIVE.STATUS interrupt result SSB values: (high-low) + * (RECEIVE_COMPLETE field bit definitions in SSB.Parm[0]) + */ +#define RX_COMPLETE 0x0080 /* SSB.Parm[0]; SSB.Parm[1]: 32 + * bit pointer to last RPL. + */ +#define RX_SUSPENDED 0x0040 /* SSB.Parm[0]; SSB.Parm[1]: 32 + * bit pointer to RPL with odd + * forward pointer. + */ + +/* Valid receive CSTAT: */ +#define RX_FRAME_CONTROL_BITS (RX_VALID | RX_START_FRAME | RX_END_FRAME | \ + RX_FRAME_COMPLETE) +#define VALID_SINGLE_BUFFER_FRAME (RX_START_FRAME | RX_END_FRAME | \ + RX_FRAME_COMPLETE) + +typedef enum SKB_STAT SKB_STAT; +enum SKB_STAT { + SKB_UNAVAILABLE, + SKB_DMA_DIRECT, + SKB_DATA_COPY +}; + +/* Receive Parameter List (RPL) The length of the RPLs has to be initialized + * in the OPL. (OPEN parameter list) + */ +#define RPL_NUM 3 + +#define RX_FRAG_NUM 1 /* Maximal number of used fragments in one RPL. + * (up to firmware v2.24: 3, now: up to 9) + */ + +#pragma pack(1) +typedef struct s_RPL RPL; +struct s_RPL { /* Receive Parameter List */ + unsigned long NextRPLAddr; /* Pointer to next RPL in chain + * (normalized = physical 32 bit + * address) if pointer is odd: this + * is last RPL. Pointing to itself can + * cause problems! + */ + volatile unsigned short Status; /* Set by creation of Receive Parameter + * List RECEIVE_CSTAT_COMPLETE set by + * adapter in lists that start or end + * a frame. + */ + volatile unsigned short FrameSize; /* Number of bytes received as a + * frame including AC/FC, Destination, + * Source, Routing field not including + * CRC, FS (Frame Status), End Delimiter + * (valid only if START_FRAME bit in + * CSTAT nonzero) must not be zero in + * any list; maximum value: (BUFFER_SIZE + * - 8) * TX_BUF_MAX sum of DataCount + * values in FragmentList must equal + * Frame_Size value in START_FRAME TPL! + * frame data fragment list + */ + + /* TPL/RPL size in OPEN parameter list depending on maximal numbers + * of fragments used in one parameter list. + */ + Fragment FragList[RX_FRAG_NUM]; /* Maximum: nine frame fragments in + * one TPL. Actual version of firmware: + * 9 fragments possible. + */ +#pragma pack() + + /* Special proprietary data and precalculations. */ + RPL *NextRPLPtr; /* Logical pointer to next RPL in chain. */ + unsigned char *MData; + struct sk_buff *Skb; + SKB_STAT SkbStat; + int RPLIndex; +}; + +/* Information that need to be kept for each board. */ +typedef struct net_local { +#pragma pack(1) + IPB ipb; /* Initialization Parameter Block. */ + SCB scb; /* System Command Block: system to adapter + * communication. + */ + SSB ssb; /* System Status Block: adapter to system + * communication. + */ + OPB ocpl; /* Open Options Parameter Block. */ + + ERRORTAB errorlogtable; /* Adapter statistic error counters. + * (read from adapter memory) + */ + unsigned char ProductID[PROD_ID_SIZE + 1]; /* Product ID */ +#pragma pack() + + TPL Tpl[TPL_NUM]; + TPL *TplFree; + TPL *TplBusy; + unsigned char LocalTxBuffers[TPL_NUM][DEFAULT_PACKET_SIZE]; + + RPL Rpl[RPL_NUM]; + RPL *RplHead; + RPL *RplTail; + unsigned char LocalRxBuffers[RPL_NUM][DEFAULT_PACKET_SIZE]; + + int DataRate; + unsigned char ScbInUse; + unsigned short CMDqueue; + + unsigned long AdapterOpenFlag:1; + unsigned long AdapterVirtOpenFlag:1; + unsigned long OpenCommandIssued:1; + unsigned long TransmitCommandActive:1; + unsigned long TransmitHaltScheduled:1; + unsigned long HaltInProgress:1; + unsigned long LobeWireFaultLogged:1; + unsigned long ReOpenInProgress:1; + unsigned long Sleeping:1; + + unsigned long LastOpenStatus; + unsigned short CurrentRingStatus; + unsigned long MaxPacketSize; + + unsigned long StartTime; + unsigned long LastSendTime; + + struct sk_buff_head SendSkbQueue; + unsigned short QueueSkb; + + struct tr_statistics MacStat; /* MAC statistics structure */ + + struct timer_list timer; + + struct wait_queue *wait_for_tok_int; + + INTPTRS intptrs; /* Internal adapter pointer. Must be read + * before OPEN command. + */ +} NET_LOCAL; + +#endif /* __KERNEL__ */ +#endif /* __LINUX_SKTR_H */ diff --git a/drivers/net/sktr_firmware.h b/drivers/net/sktr_firmware.h new file mode 100644 index 000000000000..bef17faa448f --- /dev/null +++ b/drivers/net/sktr_firmware.h @@ -0,0 +1,3616 @@ +/* + * The firmware this driver downloads into the tokenring card is a + * seperate program and is not GPL'd source code, even though the Linux + * side driver and the routine that loads this data into the card are. + * + * This firmware is licensed to you strictly for use in conjunction + * with the use of SysKonnect TokenRing adapters. There is no + * waranty expressed or implied about its fitness for any purpose. + */ + +/* sktr_firmware.h: SysKonnect TokenRing driver firmware dump for Linux. + * + * Notes: + * - Loaded from sktr_reset_adapter upon adapter reset. + * + * Authors: + * - Christoph Goos + */ + +#include + +#if defined(CONFIG_SKTR) || defined(CONFIG_SKTR_MODULE) + +unsigned char sktr_code[] = { + 0x00, 0x00, 0x00, 0xA0, 0x00, 0x20, 0x68, 0x54, + 0x73, 0x69, 0x63, 0x20, 0x64, 0x6F, 0x20, 0x65, + 0x73, 0x69, 0x72, 0x20, 0x6C, 0x65, 0x61, 0x65, + 0x65, 0x73, 0x20, 0x64, 0x6E, 0x75, 0x65, 0x64, + 0x20, 0x72, 0x69, 0x6C, 0x65, 0x63, 0x63, 0x6E, + 0x20, 0x65, 0x6E, 0x4F, 0x79, 0x6C, 0x20, 0x2C, + 0x6C, 0x41, 0x20, 0x6C, 0x69, 0x72, 0x68, 0x67, + 0x73, 0x74, 0x72, 0x20, 0x73, 0x65, 0x72, 0x65, + 0x65, 0x76, 0x2E, 0x64, 0x60, 0x01, 0x42, 0x01, + 0x00, 0x08, 0x08, 0x16, 0xB0, 0x03, 0xE0, 0x04, + 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0xFF, 0xFF, + 0xFC, 0x13, 0x80, 0x03, 0xA0, 0x07, 0x42, 0x01, + 0x00, 0x08, 0x20, 0x07, 0x00, 0x00, 0xE0, 0x04, + 0x00, 0x01, 0x8B, 0x07, 0x00, 0x3D, 0x60, 0x01, + 0x42, 0x01, 0x80, 0x00, 0x09, 0x13, 0x8B, 0x07, + 0x00, 0x2D, 0x20, 0xC0, 0x4E, 0x01, 0x80, 0x02, + 0x41, 0x0F, 0x02, 0x11, 0x8B, 0x07, 0x00, 0x3D, + 0x0B, 0xC8, 0x4A, 0x01, 0x00, 0x02, 0x00, 0x90, + 0xA0, 0x09, 0x00, 0xC8, 0x66, 0x01, 0xE0, 0x02, + 0xA0, 0x00, 0xA0, 0x07, 0x04, 0x01, 0x20, 0x00, + 0xA0, 0x01, 0x40, 0x01, 0x00, 0xFE, 0x20, 0x48, + 0x2A, 0xE0, 0x42, 0x01, 0xE0, 0x04, 0x02, 0x01, + 0xE0, 0x04, 0x60, 0x09, 0xE0, 0x04, 0x82, 0x01, + 0x60, 0x01, 0x1C, 0x01, 0x04, 0x00, 0x03, 0x16, + 0xE0, 0x01, 0x40, 0x01, 0x00, 0x0C, 0xA0, 0x06, + 0xBC, 0xA1, 0xA0, 0x07, 0x04, 0x01, 0x2D, 0x00, + 0x20, 0xC2, 0x00, 0xE0, 0x88, 0x02, 0x11, 0xE3, + 0x14, 0x16, 0xA0, 0x07, 0x04, 0x01, 0x2E, 0x00, + 0x60, 0x01, 0x42, 0x01, 0x00, 0x03, 0x0D, 0x16, + 0xA0, 0x07, 0x04, 0x01, 0x21, 0x00, 0x88, 0x07, + 0x00, 0xA0, 0x89, 0x07, 0xFE, 0xFF, 0xA8, 0x09, + 0xA9, 0x09, 0x8A, 0x07, 0x02, 0xE0, 0xA0, 0x06, + 0x84, 0xEC, 0x56, 0x10, 0x88, 0x07, 0x00, 0x90, + 0x89, 0x07, 0xFE, 0x9F, 0xA8, 0x09, 0xA9, 0x09, + 0x8A, 0x07, 0x78, 0xE0, 0xA0, 0x06, 0x84, 0xEC, + 0x4B, 0x10, 0xA0, 0x05, 0x04, 0x01, 0x88, 0x07, + 0x08, 0x00, 0x89, 0x07, 0x7A, 0x00, 0x00, 0x03, + 0x01, 0x00, 0xA0, 0x06, 0xD2, 0xAC, 0x40, 0x10, + 0xA0, 0x06, 0xBC, 0xA1, 0xE0, 0x02, 0xF4, 0x03, + 0x88, 0x07, 0xA0, 0x00, 0x89, 0x07, 0xFE, 0x00, + 0xA0, 0x06, 0xD2, 0xAC, 0x35, 0x10, 0xE0, 0x02, + 0xA0, 0x00, 0xE0, 0x04, 0x7E, 0x01, 0xC8, 0x04, + 0x09, 0x02, 0xF2, 0x03, 0x48, 0x62, 0xE0, 0xC1, + 0x40, 0x01, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x04, + 0x18, 0xCE, 0x09, 0x06, 0xFD, 0x16, 0xA0, 0x01, + 0x40, 0x01, 0x00, 0x40, 0x07, 0xC8, 0x40, 0x01, + 0x88, 0x07, 0xF4, 0x03, 0x89, 0x07, 0xFE, 0x3F, + 0xA0, 0x06, 0xD2, 0xAC, 0x19, 0x10, 0xE0, 0x02, + 0xA0, 0x00, 0xA0, 0x06, 0xFA, 0xAD, 0x14, 0x10, + 0x08, 0xC8, 0x44, 0x04, 0x09, 0xC8, 0x46, 0x04, + 0xA0, 0x06, 0x28, 0xAD, 0x0D, 0x10, 0x81, 0x07, + 0x7C, 0xE0, 0xB1, 0xC0, 0x26, 0x13, 0x01, 0xC8, + 0xE0, 0x00, 0xA0, 0x05, 0x04, 0x01, 0x92, 0x06, + 0x03, 0x10, 0x60, 0xC0, 0xE0, 0x00, 0xF5, 0x10, + 0xE0, 0x01, 0x04, 0x01, 0x10, 0x00, 0xB0, 0x03, + 0xFF, 0x10, 0xA0, 0x01, 0x04, 0x01, 0x00, 0x80, + 0x80, 0x03, 0x80, 0x07, 0xA0, 0x00, 0xC2, 0x04, + 0x80, 0xCC, 0x81, 0x07, 0xAA, 0xA1, 0x82, 0x02, + 0x1E, 0x00, 0x02, 0x16, 0x81, 0x07, 0xB4, 0xA1, + 0x81, 0xC4, 0x81, 0x8C, 0xE9, 0x16, 0x82, 0x02, + 0x7C, 0x00, 0xF2, 0x16, 0x00, 0x03, 0x0F, 0x00, + 0x5B, 0x04, 0x81, 0x07, 0x08, 0xE1, 0x82, 0x07, + 0x04, 0x00, 0xE0, 0x04, 0x80, 0x01, 0xE0, 0x04, + 0x82, 0x01, 0x91, 0xC4, 0xB1, 0x8C, 0xD8, 0x16, + 0x82, 0x02, 0x7C, 0x00, 0xFA, 0x16, 0x20, 0xC8, + 0x04, 0xE0, 0x82, 0x01, 0x20, 0xE8, 0x0C, 0xE0, + 0x82, 0x01, 0x20, 0xC8, 0x10, 0xE0, 0x80, 0x01, + 0x81, 0x07, 0x86, 0xE0, 0xB1, 0xC0, 0x07, 0x13, + 0xB1, 0xC4, 0xFC, 0x10, 0xA0, 0x07, 0x04, 0x01, + 0x2E, 0x00, 0x60, 0x04, 0xAA, 0xA1, 0x81, 0x07, + 0x34, 0xE0, 0x82, 0x07, 0xFC, 0x05, 0x83, 0x07, + 0x0A, 0x00, 0xB1, 0xCC, 0x43, 0x06, 0xFD, 0x16, + 0x02, 0x02, 0x00, 0x06, 0x60, 0xD0, 0x4E, 0x01, + 0xED, 0x13, 0x21, 0x02, 0x00, 0xF7, 0x21, 0x02, + 0x00, 0xC0, 0x81, 0xDC, 0x60, 0xD0, 0x4F, 0x01, + 0xC1, 0xC0, 0x41, 0x09, 0x21, 0x02, 0x00, 0xF0, + 0x81, 0xDC, 0x43, 0x02, 0x00, 0x0F, 0x23, 0x02, + 0x00, 0xF0, 0x83, 0xDC, 0x01, 0x02, 0x32, 0x0C, + 0xA0, 0xC0, 0x44, 0x04, 0xE0, 0xC0, 0x46, 0x04, + 0x03, 0xC1, 0x02, 0x61, 0x84, 0x05, 0x04, 0xC8, + 0x48, 0x04, 0x03, 0xC1, 0x84, 0x05, 0x04, 0xA1, + 0x01, 0xA1, 0x04, 0xC8, 0x30, 0x0C, 0x03, 0xC1, + 0x84, 0x05, 0xF1, 0x04, 0x04, 0x06, 0xFD, 0x16, + 0x08, 0x02, 0x00, 0xA0, 0xA8, 0x09, 0x60, 0xC2, + 0x30, 0x0C, 0x29, 0x02, 0xFF, 0x03, 0xA9, 0x09, + 0x29, 0x02, 0x40, 0x00, 0x80, 0x07, 0x00, 0x90, + 0xA0, 0x09, 0x8A, 0x07, 0xFE, 0x9F, 0x2A, 0x02, + 0xFF, 0x03, 0xAA, 0x09, 0x01, 0x02, 0x32, 0x0C, + 0x05, 0x02, 0x00, 0x00, 0x03, 0xC1, 0x84, 0x05, + 0x11, 0x07, 0xC1, 0x05, 0x85, 0x05, 0x04, 0x06, + 0x0B, 0x13, 0x85, 0x80, 0xF9, 0x1A, 0x05, 0x80, + 0xF8, 0x1A, 0x85, 0x82, 0xF5, 0x1A, 0x05, 0x82, + 0xF4, 0x1A, 0x45, 0x82, 0xF1, 0x1A, 0xF1, 0x10, + 0x20, 0x2D, 0x02, 0x00, 0x60, 0x01, 0x40, 0x01, + 0x00, 0x40, 0x06, 0x16, 0x8A, 0x07, 0x00, 0x08, + 0xA0, 0x01, 0x40, 0x01, 0x00, 0x40, 0x48, 0x10, + 0x60, 0x01, 0x42, 0x01, 0x00, 0x80, 0x06, 0x16, + 0x8A, 0x07, 0x00, 0x10, 0xA0, 0x01, 0x42, 0x01, + 0x00, 0x80, 0x3E, 0x10, 0x60, 0x01, 0x02, 0x01, + 0x00, 0x10, 0x0A, 0x16, 0x60, 0x01, 0x00, 0x01, + 0x00, 0x04, 0x06, 0x16, 0x8A, 0x07, 0x00, 0x80, + 0xA0, 0x01, 0x02, 0x01, 0x00, 0x10, 0x30, 0x10, + 0x60, 0x01, 0x02, 0x01, 0x00, 0x08, 0x0A, 0x16, + 0x60, 0x01, 0x00, 0x01, 0x00, 0x04, 0x06, 0x16, + 0xA0, 0x01, 0x02, 0x01, 0x00, 0x08, 0x0D, 0x02, + 0x01, 0x00, 0x0D, 0x10, 0x60, 0x01, 0x02, 0x01, + 0x00, 0x04, 0x16, 0x16, 0x60, 0x01, 0x00, 0x01, + 0x00, 0x08, 0x12, 0x16, 0xA0, 0x01, 0x02, 0x01, + 0x00, 0x04, 0x0D, 0x02, 0x02, 0x00, 0xA0, 0xC3, + 0x0E, 0x01, 0xE0, 0xC3, 0x10, 0x01, 0x8A, 0x07, + 0x00, 0x20, 0x60, 0x01, 0x00, 0x01, 0x00, 0x80, + 0x0B, 0x13, 0x8A, 0x07, 0x00, 0x40, 0x08, 0x10, + 0x8A, 0x07, 0x04, 0x00, 0x05, 0x10, 0x8A, 0x07, + 0x02, 0x00, 0x02, 0x10, 0x8A, 0x07, 0x08, 0x00, + 0x00, 0x03, 0x00, 0x00, 0xE0, 0x04, 0x82, 0x01, + 0x8B, 0x07, 0xE0, 0x05, 0xCA, 0xCE, 0xCD, 0xCE, + 0xCE, 0xCE, 0xCF, 0xC6, 0x20, 0xC3, 0x58, 0x07, + 0x20, 0x23, 0x04, 0xE0, 0x12, 0x13, 0x8B, 0x07, + 0x18, 0xFF, 0x8A, 0x02, 0x00, 0x80, 0x0A, 0x13, + 0x8B, 0x05, 0xCD, 0xA2, 0x8A, 0x02, 0x00, 0x40, + 0x05, 0x13, 0x8A, 0x02, 0x00, 0x20, 0x02, 0x13, + 0x8B, 0x07, 0x1D, 0xFF, 0x0B, 0xC8, 0x04, 0x01, + 0x0D, 0x10, 0x20, 0xD3, 0x05, 0x01, 0xFD, 0x11, + 0x20, 0xD8, 0xDF, 0x07, 0x17, 0x01, 0x8B, 0x07, + 0x80, 0xFF, 0x0B, 0xC8, 0x04, 0x01, 0x20, 0xE8, + 0x0A, 0xE0, 0x00, 0x01, 0xE0, 0xC2, 0x04, 0x01, + 0xE0, 0x22, 0x86, 0xE1, 0xFB, 0x16, 0xE0, 0x02, + 0xA0, 0x00, 0xE0, 0x04, 0x82, 0x01, 0x20, 0xE8, + 0x0A, 0xE0, 0x00, 0x01, 0xE0, 0xC2, 0x00, 0x01, + 0xE0, 0x22, 0x06, 0xE0, 0xF8, 0x13, 0xA0, 0x01, + 0x40, 0x01, 0x00, 0xF6, 0x60, 0x04, 0x90, 0xA0, + 0x00, 0x03, 0x02, 0x00, 0xA0, 0x07, 0x02, 0x01, + 0xFF, 0xDF, 0x90, 0x03, 0xFF, 0xFF, 0x80, 0x03, + 0x00, 0x03, 0x02, 0x00, 0x09, 0x07, 0xA0, 0xC2, + 0x04, 0x01, 0x8A, 0x01, 0x80, 0x00, 0x4A, 0x52, + 0x89, 0xD2, 0x0A, 0xC8, 0x04, 0x01, 0xA0, 0xD2, + 0x04, 0x01, 0xF9, 0x16, 0x49, 0x05, 0x89, 0x01, + 0x00, 0x80, 0x49, 0x01, 0x00, 0x40, 0x0E, 0x13, + 0x09, 0xF8, 0x3A, 0x07, 0x60, 0xC2, 0x36, 0x07, + 0x03, 0x16, 0x90, 0x03, 0xFF, 0xFF, 0x80, 0x03, + 0xE0, 0x04, 0x36, 0x07, 0x54, 0x04, 0x90, 0x03, + 0xFF, 0xFF, 0x80, 0x03, 0x60, 0x22, 0x86, 0xE1, + 0xC2, 0x13, 0xE0, 0x04, 0x82, 0x01, 0x60, 0x04, + 0xE0, 0xA3, 0x00, 0x03, 0x02, 0x00, 0xA0, 0x07, + 0x62, 0x09, 0xE8, 0x03, 0xC9, 0x04, 0xA0, 0xC1, + 0x34, 0x06, 0x04, 0x16, 0xA0, 0x06, 0x50, 0xB5, + 0xE0, 0x04, 0x20, 0x09, 0x86, 0x07, 0xE8, 0x05, + 0xA0, 0x01, 0x40, 0x01, 0x00, 0x80, 0x20, 0xC2, + 0x84, 0x01, 0x20, 0x48, 0x08, 0xE0, 0x84, 0x01, + 0x20, 0x22, 0x08, 0xE0, 0x08, 0x13, 0x60, 0x01, + 0xAE, 0x01, 0x01, 0x00, 0x04, 0x16, 0xE0, 0x01, + 0x34, 0x06, 0x00, 0x80, 0x06, 0x10, 0x20, 0xC2, + 0x32, 0x09, 0x06, 0x13, 0xE0, 0x01, 0x34, 0x06, + 0x00, 0x08, 0xE0, 0x04, 0x30, 0x06, 0x09, 0x07, + 0xA0, 0x05, 0xEE, 0x05, 0x20, 0x06, 0xEC, 0x05, + 0x02, 0x16, 0x16, 0xC2, 0x03, 0x16, 0x49, 0xC2, + 0x12, 0x16, 0x80, 0x03, 0x98, 0xC5, 0xE8, 0xC1, + 0x02, 0x00, 0xE0, 0xE9, 0x14, 0xE0, 0x04, 0x00, + 0xD7, 0x04, 0x27, 0x02, 0x08, 0x00, 0xA0, 0x06, + 0xE6, 0xB4, 0x16, 0xC2, 0x04, 0x13, 0x28, 0xC8, + 0x08, 0x00, 0xEC, 0x05, 0xEF, 0x13, 0x54, 0x04, + 0x00, 0x03, 0x02, 0x00, 0xE0, 0xC1, 0x86, 0x01, + 0x47, 0x02, 0x0E, 0x00, 0xA7, 0xC2, 0x90, 0xE1, + 0x5A, 0x04, 0x8A, 0x07, 0x00, 0xA0, 0x0A, 0xC8, + 0x86, 0x01, 0xC7, 0xA1, 0x27, 0x02, 0x98, 0xE1, + 0x37, 0xE8, 0x34, 0x06, 0x17, 0xE8, 0xD2, 0x06, + 0xE0, 0x04, 0x30, 0x06, 0x60, 0x04, 0xF2, 0xA9, + 0x0A, 0xE8, 0xD2, 0x06, 0xE0, 0x01, 0x34, 0x06, + 0x00, 0x08, 0xE0, 0x04, 0x30, 0x06, 0x20, 0xE0, + 0x18, 0xE0, 0x5B, 0x04, 0xA0, 0x05, 0x20, 0x09, + 0x20, 0x88, 0x20, 0x09, 0x16, 0xE0, 0xE5, 0x1A, + 0xE0, 0x04, 0x20, 0x09, 0xA0, 0x06, 0xD0, 0xD5, + 0x80, 0x03, 0xA0, 0x05, 0x32, 0x09, 0x80, 0x03, + 0x01, 0xC3, 0xFB, 0x13, 0x60, 0x01, 0x6A, 0x09, + 0x01, 0x00, 0x78, 0x13, 0xA0, 0x05, 0x32, 0x09, + 0x75, 0x10, 0x41, 0xC0, 0x06, 0x13, 0x01, 0xC8, + 0x6C, 0x01, 0xE0, 0xC2, 0x02, 0xFC, 0x01, 0x11, + 0x7B, 0x10, 0x60, 0x01, 0x9C, 0x01, 0x40, 0x00, + 0x79, 0x16, 0x20, 0xD8, 0x2F, 0x09, 0x83, 0x01, + 0x41, 0xC0, 0x04, 0x13, 0x01, 0xC8, 0x8A, 0x01, + 0x01, 0xC8, 0x18, 0x09, 0x86, 0x07, 0x43, 0x00, + 0x06, 0xC8, 0x6C, 0x01, 0x07, 0x02, 0x02, 0xFC, + 0x17, 0xC2, 0x60, 0x04, 0xFA, 0xA6, 0xE0, 0x04, + 0x18, 0x09, 0xC7, 0x61, 0x08, 0x07, 0x60, 0x01, + 0x06, 0xFC, 0x40, 0x00, 0x02, 0x13, 0x08, 0x02, + 0x01, 0x00, 0x09, 0x10, 0x4C, 0xC2, 0x20, 0xC3, + 0x00, 0xFC, 0x2A, 0x13, 0x0C, 0xC8, 0x6C, 0x01, + 0xE0, 0xC2, 0x02, 0xFC, 0x1B, 0x11, 0x4B, 0x01, + 0x00, 0x01, 0xF4, 0x16, 0xC8, 0x22, 0x12, 0x13, + 0xCB, 0x01, 0x00, 0x40, 0x0B, 0xC8, 0x02, 0xFC, + 0x0D, 0x10, 0xE0, 0xC1, 0x18, 0x09, 0x01, 0xC3, + 0x21, 0x13, 0x4C, 0xC2, 0x15, 0x13, 0x0C, 0xC8, + 0x6C, 0x01, 0xE0, 0xC2, 0x02, 0xFC, 0x06, 0x11, + 0xCC, 0x81, 0xD5, 0x13, 0x4C, 0xC2, 0x20, 0xC3, + 0x00, 0xFC, 0xF4, 0x10, 0x09, 0xC8, 0x6C, 0x01, + 0xE0, 0xC2, 0x02, 0xFC, 0x1E, 0x16, 0xA0, 0x07, + 0x02, 0xFC, 0x00, 0x80, 0x09, 0xC3, 0x19, 0x10, + 0x09, 0xC8, 0x6C, 0x01, 0xE0, 0xC2, 0x02, 0xFC, + 0x05, 0x16, 0xA0, 0x07, 0x02, 0xFC, 0x00, 0x80, + 0x09, 0xC3, 0x0F, 0x10, 0xE0, 0xC2, 0x02, 0x0C, + 0x01, 0x11, 0x1E, 0x10, 0x20, 0xD8, 0x00, 0xE2, + 0x83, 0x01, 0x8B, 0x09, 0x8B, 0x09, 0x8B, 0x09, + 0x8B, 0x09, 0xA0, 0x07, 0x8A, 0x01, 0x43, 0x00, + 0x13, 0x10, 0x0C, 0xC8, 0x8A, 0x01, 0x0C, 0xC8, + 0x18, 0x09, 0x0E, 0x10, 0x00, 0x03, 0x02, 0x00, + 0xE0, 0xC0, 0x6C, 0x01, 0x20, 0xC3, 0x8A, 0x01, + 0x20, 0x98, 0x83, 0x01, 0x00, 0xE2, 0x81, 0x13, + 0x60, 0x01, 0x9C, 0x01, 0x40, 0x00, 0xB9, 0x13, + 0x01, 0x83, 0x31, 0x16, 0x03, 0xC8, 0x6C, 0x01, + 0x40, 0x01, 0x10, 0x00, 0x14, 0x16, 0xE0, 0xC2, + 0x2E, 0x06, 0x11, 0x13, 0xE0, 0xC2, 0xF8, 0x05, + 0x0E, 0x13, 0xE0, 0x01, 0x3A, 0x07, 0x00, 0x80, + 0x80, 0x01, 0x10, 0x00, 0xE0, 0xC2, 0x36, 0x07, + 0x06, 0x13, 0xE0, 0x04, 0x36, 0x07, 0x80, 0x01, + 0x20, 0x00, 0x60, 0x04, 0xF2, 0xA9, 0x40, 0x01, + 0x20, 0x00, 0xF9, 0x13, 0x90, 0x03, 0xFF, 0x11, + 0x80, 0x03, 0x08, 0x01, 0x00, 0x04, 0x19, 0x16, + 0x60, 0x01, 0x6A, 0x09, 0x01, 0x00, 0x15, 0x16, + 0x88, 0x01, 0x00, 0x1A, 0xC8, 0x01, 0x00, 0x01, + 0xC8, 0xC5, 0x0F, 0x10, 0xE0, 0x04, 0x18, 0x09, + 0xC0, 0x01, 0x04, 0x00, 0x15, 0x10, 0x81, 0xC1, + 0x01, 0xC8, 0x6C, 0x01, 0x07, 0x02, 0x00, 0xFC, + 0x77, 0xC0, 0x17, 0xC2, 0x48, 0x01, 0x00, 0x18, + 0xE4, 0x13, 0x40, 0x01, 0x40, 0x00, 0x15, 0x16, + 0x80, 0x01, 0x45, 0x00, 0x46, 0xC1, 0x20, 0xD0, + 0x07, 0xFC, 0x60, 0x81, 0x18, 0x09, 0xE6, 0x13, + 0xE0, 0xC2, 0x08, 0xFC, 0x08, 0x11, 0xE0, 0xC2, + 0x0E, 0xFC, 0x07, 0x15, 0x06, 0x13, 0xE0, 0xC2, + 0x14, 0xFC, 0x03, 0x15, 0x02, 0x13, 0xC0, 0x01, + 0x01, 0x00, 0x48, 0x01, 0x00, 0x01, 0x11, 0x13, + 0x40, 0x01, 0x80, 0x40, 0x69, 0x13, 0x60, 0x04, + 0x66, 0xA6, 0x48, 0x01, 0x01, 0x00, 0x03, 0x16, + 0x40, 0x01, 0x00, 0x40, 0x0B, 0x16, 0xC8, 0x01, + 0x00, 0x40, 0xA0, 0x05, 0x32, 0x09, 0xC8, 0xC5, + 0x05, 0x10, 0xC0, 0x01, 0x40, 0x00, 0x40, 0x01, + 0x04, 0x00, 0xEF, 0x13, 0xB7, 0x01, 0x20, 0x00, + 0xD7, 0xC2, 0xC4, 0x62, 0x0B, 0x05, 0x2B, 0x02, + 0xFC, 0xFF, 0xCB, 0xC5, 0x02, 0x15, 0x46, 0x81, + 0x6A, 0x13, 0x08, 0x01, 0x00, 0x5E, 0x67, 0x16, + 0x08, 0x01, 0x88, 0x00, 0x13, 0x16, 0x86, 0x02, + 0x43, 0x00, 0x25, 0x16, 0x40, 0x01, 0x00, 0x40, + 0x0B, 0x13, 0x08, 0x01, 0x03, 0x00, 0x08, 0x13, + 0x84, 0xC2, 0x2A, 0x02, 0xD8, 0xFF, 0x06, 0xC8, + 0x6C, 0x01, 0x0A, 0x68, 0x04, 0xFC, 0x73, 0x10, + 0x60, 0x04, 0xD2, 0xA8, 0x40, 0x01, 0x01, 0x00, + 0xEA, 0x13, 0x08, 0x01, 0x02, 0x00, 0xE7, 0x16, + 0x48, 0x01, 0x01, 0x00, 0xE4, 0x16, 0x40, 0x01, + 0x00, 0x40, 0x04, 0x16, 0x60, 0x01, 0xA8, 0x09, + 0x80, 0x00, 0xDD, 0x13, 0x8A, 0x07, 0x80, 0x00, + 0xA0, 0x06, 0x32, 0xA5, 0xD8, 0x10, 0x00, 0xC0, + 0xE7, 0x11, 0x60, 0xC2, 0x6A, 0x09, 0x40, 0x01, + 0x00, 0x40, 0x0A, 0x13, 0x48, 0x01, 0x01, 0x00, + 0x34, 0x13, 0x48, 0x01, 0x02, 0x00, 0x0A, 0x13, + 0x49, 0x01, 0x04, 0x00, 0xD9, 0x16, 0x06, 0x10, + 0x49, 0x01, 0x02, 0x00, 0x03, 0x13, 0x08, 0x01, + 0x03, 0x00, 0x6E, 0x13, 0x49, 0x01, 0x01, 0x00, + 0x12, 0x13, 0x40, 0x01, 0x80, 0x40, 0x01, 0x16, + 0x46, 0xC1, 0xE0, 0x04, 0x00, 0xFC, 0x87, 0x07, + 0xF8, 0x05, 0x17, 0xC2, 0x14, 0x13, 0xC7, 0x05, + 0x17, 0xC8, 0x6C, 0x01, 0x05, 0xC8, 0x00, 0xFC, + 0xC6, 0xC5, 0x60, 0x04, 0x66, 0xA6, 0x07, 0x02, + 0x02, 0xFC, 0xE0, 0xA1, 0x2C, 0x09, 0xE0, 0xCD, + 0xEE, 0x05, 0xE0, 0xC5, 0x04, 0xFC, 0x20, 0xC8, + 0x2C, 0x09, 0x04, 0xFC, 0xE2, 0x10, 0xC5, 0xCD, + 0xC6, 0xC5, 0x60, 0x04, 0x66, 0xA6, 0x60, 0x04, + 0xB6, 0xA8, 0x06, 0xC8, 0x6C, 0x01, 0x85, 0x81, + 0x1A, 0x13, 0xE0, 0xC2, 0x04, 0xFC, 0x17, 0x15, + 0x86, 0xC2, 0x8A, 0xA2, 0xAA, 0xC1, 0x32, 0x0C, + 0x06, 0xC8, 0x6C, 0x01, 0x0B, 0xA8, 0x04, 0xFC, + 0x1A, 0x09, 0x0A, 0xC8, 0x6C, 0x01, 0xE0, 0xC2, + 0x02, 0xFC, 0xE0, 0x04, 0x00, 0xFC, 0x06, 0xC8, + 0x6C, 0x01, 0x0B, 0xC8, 0x02, 0xFC, 0xA0, 0x06, + 0x3E, 0xB4, 0x06, 0xC8, 0x6C, 0x01, 0xE0, 0x04, + 0x00, 0xFC, 0xA0, 0x01, 0x02, 0xFC, 0x02, 0x00, + 0x87, 0x07, 0x30, 0x06, 0xE7, 0x01, 0x04, 0x00, + 0x40, 0x00, 0xD7, 0x04, 0x27, 0x02, 0x0C, 0x00, + 0x05, 0xC2, 0x60, 0x01, 0x6A, 0x09, 0x04, 0x00, + 0x03, 0x16, 0xE0, 0x01, 0x02, 0xFC, 0x20, 0x00, + 0xA0, 0x06, 0xFC, 0xB4, 0xC0, 0x01, 0x20, 0x00, + 0x60, 0x04, 0x66, 0xA6, 0x48, 0x01, 0x00, 0x18, + 0x03, 0x13, 0x48, 0x01, 0x00, 0x10, 0x02, 0x16, + 0xA0, 0x05, 0x32, 0x09, 0x86, 0x02, 0x43, 0x00, + 0x03, 0x13, 0x40, 0x01, 0x80, 0x40, 0x98, 0x13, + 0x06, 0xC8, 0x6C, 0x01, 0xE0, 0x04, 0x00, 0xFC, + 0x85, 0xC2, 0xA0, 0x06, 0x3E, 0xB4, 0x20, 0x06, + 0x62, 0x09, 0xE6, 0x16, 0xA0, 0x06, 0xD0, 0xD5, + 0xE3, 0x10, 0xA0, 0xC2, 0xF6, 0x05, 0x56, 0x16, + 0x19, 0xC8, 0xF0, 0x05, 0xA9, 0xC2, 0x0A, 0x00, + 0x0D, 0x11, 0xA0, 0xF2, 0x2E, 0x09, 0x0A, 0xD8, + 0x80, 0x01, 0x29, 0xC8, 0x06, 0x00, 0x8C, 0x01, + 0xA0, 0x07, 0x16, 0x09, 0x04, 0x00, 0x09, 0xC8, + 0xF4, 0x05, 0x46, 0x10, 0x29, 0xC8, 0x06, 0x00, + 0x6C, 0x01, 0x20, 0xC8, 0x0E, 0xFC, 0xBC, 0x01, + 0x20, 0xC8, 0x10, 0xFC, 0xB0, 0x01, 0x20, 0xC8, + 0x12, 0xFC, 0xB2, 0x01, 0xA0, 0xF2, 0x2E, 0x09, + 0x8A, 0x01, 0x00, 0x10, 0xA0, 0x01, 0x80, 0x01, + 0x00, 0xC4, 0xE1, 0x10, 0x47, 0x01, 0x08, 0x00, + 0x06, 0x16, 0xA8, 0xC2, 0x06, 0x00, 0xA0, 0x06, + 0x3E, 0xB4, 0xE8, 0x04, 0x06, 0x00, 0x07, 0x01, + 0x20, 0x00, 0x31, 0x13, 0xE8, 0x04, 0x02, 0x00, + 0x3B, 0x10, 0xE0, 0x04, 0x00, 0xFC, 0xA0, 0x06, + 0x3E, 0xB4, 0x29, 0x10, 0x00, 0x03, 0x02, 0x00, + 0x20, 0xC2, 0x8C, 0x01, 0xE0, 0xC0, 0x6C, 0x01, + 0x20, 0xC2, 0xF4, 0x05, 0x28, 0xC8, 0x08, 0x00, + 0x6C, 0x01, 0xE8, 0xC1, 0x0A, 0x00, 0x20, 0xC3, + 0x02, 0xFC, 0x8C, 0x01, 0x20, 0x00, 0x0C, 0xC8, + 0x02, 0xFC, 0x0C, 0x01, 0x00, 0xFE, 0x3B, 0x16, + 0x47, 0x01, 0x40, 0x00, 0x50, 0x13, 0x60, 0xC2, + 0xF0, 0x05, 0xA7, 0x16, 0xE0, 0x04, 0xF4, 0x05, + 0x0C, 0xCA, 0x08, 0x00, 0x47, 0x01, 0x80, 0x00, + 0xC9, 0x16, 0x28, 0xC8, 0x06, 0x00, 0x6C, 0x01, + 0xA0, 0xC2, 0x00, 0xFC, 0xD2, 0x16, 0xE8, 0xC1, + 0x02, 0x00, 0xD7, 0xC2, 0x0F, 0x16, 0x27, 0x02, + 0x10, 0x00, 0xD8, 0x04, 0x57, 0xC2, 0x0E, 0x13, + 0xC7, 0x05, 0x57, 0xC2, 0x48, 0xC6, 0xC8, 0xC5, + 0x03, 0xC8, 0x6C, 0x01, 0x0D, 0x11, 0x90, 0x03, + 0xFF, 0x11, 0x80, 0x03, 0xD7, 0x04, 0xC3, 0x01, + 0x00, 0x80, 0xED, 0x10, 0xE7, 0x01, 0xF4, 0xFF, + 0x20, 0x00, 0xC8, 0xCD, 0xC8, 0xC5, 0xF0, 0x10, + 0x90, 0x03, 0xF8, 0x11, 0xE0, 0x02, 0xC0, 0x00, + 0x60, 0xC3, 0xFA, 0x00, 0xA0, 0xC3, 0xFC, 0x00, + 0xE0, 0xC3, 0xFE, 0x00, 0x54, 0x04, 0xE8, 0xC2, + 0x08, 0x00, 0xA8, 0xC2, 0x06, 0x00, 0x0C, 0xC3, + 0x33, 0x11, 0x20, 0x23, 0x0A, 0xE0, 0x45, 0x13, + 0x20, 0x23, 0x10, 0xE0, 0x46, 0x13, 0x20, 0x23, + 0x0E, 0xE0, 0x13, 0x13, 0xE0, 0x21, 0x16, 0xE0, + 0xB6, 0x16, 0x20, 0x23, 0x06, 0xE0, 0x03, 0x16, + 0x20, 0x27, 0xA8, 0xE4, 0x0A, 0x13, 0xE8, 0xC2, + 0x08, 0x00, 0xA8, 0xC2, 0x06, 0x00, 0x4C, 0x01, + 0x88, 0x00, 0xA9, 0x16, 0x0C, 0x01, 0x44, 0x00, + 0xA6, 0x16, 0x20, 0x06, 0x16, 0x09, 0xA3, 0x13, + 0x0A, 0xC8, 0x6C, 0x01, 0x20, 0xC8, 0x04, 0xE0, + 0x02, 0xFC, 0x0B, 0xC8, 0x6C, 0x01, 0xA0, 0x07, + 0x02, 0xFC, 0x00, 0x81, 0x20, 0xC3, 0x80, 0x01, + 0xA0, 0x01, 0x80, 0x01, 0x00, 0xC4, 0x0C, 0xC8, + 0x80, 0x01, 0x0A, 0xC8, 0x8C, 0x01, 0xAC, 0x10, + 0x0A, 0xC2, 0x0F, 0x13, 0x08, 0xC8, 0x6C, 0x01, + 0xA0, 0xC2, 0x00, 0xFC, 0x20, 0xC3, 0x02, 0xFC, + 0x20, 0x23, 0x12, 0xE0, 0xF5, 0x16, 0x0B, 0xC8, + 0x6C, 0x01, 0x0C, 0xC8, 0x02, 0xFC, 0x60, 0x04, + 0x72, 0xA9, 0x8A, 0x07, 0x00, 0x04, 0x60, 0x04, + 0x8A, 0xA3, 0x8A, 0x07, 0x20, 0x00, 0x60, 0x04, + 0x8A, 0xA3, 0x8A, 0x07, 0x00, 0x02, 0x20, 0x27, + 0x0E, 0xE0, 0x04, 0x16, 0xA0, 0x06, 0x32, 0xA5, + 0xC3, 0x01, 0x00, 0x80, 0xA8, 0xC2, 0x06, 0x00, + 0x60, 0x04, 0x98, 0xA9, 0x00, 0x03, 0x02, 0x00, + 0xC0, 0x01, 0x10, 0x00, 0xE0, 0xC2, 0x2E, 0x06, + 0x08, 0x13, 0xE0, 0xC2, 0xF8, 0x05, 0x05, 0x13, + 0xE0, 0x01, 0x3A, 0x07, 0x00, 0x80, 0x80, 0x01, + 0x10, 0x00, 0x90, 0x03, 0xFF, 0x7F, 0x80, 0x03, + 0x00, 0x03, 0x02, 0x00, 0x20, 0xC2, 0xF6, 0x05, + 0x20, 0xE2, 0xF4, 0x05, 0x0E, 0x16, 0x20, 0xD8, + 0x2E, 0x09, 0x80, 0x01, 0x2B, 0xC8, 0x06, 0x00, + 0x8C, 0x01, 0xA0, 0x07, 0x16, 0x09, 0x04, 0x00, + 0x0B, 0xC8, 0xF4, 0x05, 0x90, 0x03, 0xFF, 0xFF, + 0x80, 0x03, 0x87, 0x07, 0xF0, 0x05, 0xDB, 0x04, + 0x57, 0xC2, 0x05, 0x16, 0xCB, 0xCD, 0xCB, 0xC5, + 0x90, 0x03, 0xFF, 0xFF, 0x80, 0x03, 0xC7, 0x05, + 0x57, 0xC2, 0x4B, 0xC6, 0xCB, 0xC5, 0x90, 0x03, + 0xFF, 0xFF, 0x80, 0x03, 0x00, 0x03, 0x02, 0x00, + 0x0B, 0xC2, 0x20, 0xC3, 0xF4, 0x05, 0x0F, 0x13, + 0xA8, 0xC2, 0x0A, 0x00, 0x4A, 0x01, 0x10, 0x00, + 0x16, 0x16, 0xA0, 0x22, 0x04, 0xE0, 0x1A, 0x16, + 0x08, 0xC3, 0xA0, 0x06, 0x36, 0xAC, 0x0C, 0xC2, + 0x20, 0xC3, 0xF4, 0x05, 0x13, 0x16, 0x68, 0x01, + 0x0A, 0x00, 0x10, 0x00, 0x03, 0x13, 0xE0, 0xC2, + 0xF6, 0x05, 0x05, 0x16, 0xA0, 0x06, 0x78, 0xAC, + 0x90, 0x03, 0xFF, 0xFF, 0x80, 0x03, 0x87, 0x07, + 0xF0, 0x05, 0xA0, 0x06, 0xE6, 0xB4, 0x90, 0x03, + 0xFF, 0xFF, 0x80, 0x03, 0x87, 0x07, 0xF0, 0x05, + 0xA0, 0x06, 0x2C, 0xB5, 0x80, 0x03, 0x00, 0x03, + 0x02, 0x00, 0x87, 0x07, 0xF0, 0x05, 0xCB, 0xC2, + 0x08, 0x16, 0xA0, 0x06, 0x36, 0xAC, 0x20, 0x07, + 0xF6, 0x05, 0x60, 0xCB, 0xF4, 0x05, 0x02, 0x00, + 0x80, 0x03, 0xE0, 0x04, 0xF6, 0x05, 0x20, 0xC2, + 0xF4, 0x05, 0x05, 0x16, 0x17, 0xC2, 0x03, 0x13, + 0xD8, 0xC5, 0xA0, 0x06, 0x78, 0xAC, 0x80, 0x03, + 0x00, 0x03, 0x02, 0x00, 0x0B, 0xC3, 0xA0, 0x06, + 0x36, 0xAC, 0x8C, 0xC2, 0xCC, 0xC1, 0x27, 0x02, + 0x10, 0x00, 0x88, 0x07, 0xF0, 0x05, 0x88, 0xC1, + 0x18, 0xC2, 0x26, 0x13, 0xA8, 0x82, 0x02, 0x00, + 0xFA, 0x16, 0xE8, 0xC2, 0x0A, 0x00, 0xE0, 0x22, + 0x1E, 0xE0, 0xF5, 0x16, 0x98, 0xC5, 0xE0, 0x22, + 0x1C, 0xE0, 0x0B, 0x16, 0x28, 0xC8, 0x06, 0x00, + 0xF4, 0x00, 0xE0, 0x02, 0xE0, 0x00, 0xA0, 0x06, + 0x3E, 0xB4, 0xE0, 0x02, 0xC0, 0x00, 0xE8, 0x04, + 0x06, 0x00, 0xE0, 0x22, 0x18, 0xE0, 0xE4, 0x13, + 0x20, 0xEA, 0x22, 0xE0, 0x0A, 0x00, 0xA0, 0xEA, + 0x18, 0xE0, 0x04, 0x00, 0xDA, 0x04, 0xA0, 0x06, + 0xE6, 0xB4, 0x47, 0x06, 0x06, 0xC2, 0xD8, 0x10, + 0x06, 0xC8, 0xF2, 0x05, 0x60, 0xCB, 0xF4, 0x05, + 0x02, 0x00, 0x54, 0x04, 0x20, 0xC2, 0xF4, 0x05, + 0x13, 0x13, 0xE0, 0x01, 0x9C, 0x01, 0x00, 0x40, + 0x8B, 0x0B, 0x8B, 0x0B, 0x60, 0x01, 0x9C, 0x01, + 0x00, 0x40, 0x0A, 0x16, 0x60, 0xC2, 0x6C, 0x01, + 0x28, 0xC8, 0x06, 0x00, 0x6C, 0x01, 0xA0, 0xC2, + 0x02, 0xFC, 0x03, 0x11, 0x09, 0xC8, 0x6C, 0x01, + 0x5B, 0x04, 0x09, 0xC8, 0x6C, 0x01, 0x4B, 0xC2, + 0x87, 0x07, 0xF0, 0x05, 0xA0, 0x06, 0x2C, 0xB5, + 0xE0, 0x04, 0xF4, 0x05, 0x59, 0x04, 0xA8, 0xC2, + 0x0A, 0x00, 0x0D, 0x11, 0xA0, 0xF2, 0x2E, 0x09, + 0x0A, 0xD8, 0x80, 0x01, 0x28, 0xC8, 0x06, 0x00, + 0x8C, 0x01, 0xA0, 0x07, 0x16, 0x09, 0x04, 0x00, + 0x08, 0xC8, 0xF4, 0x05, 0x5B, 0x04, 0x20, 0xC3, + 0x6C, 0x01, 0x28, 0xC8, 0x06, 0x00, 0x6C, 0x01, + 0x20, 0xC8, 0x0E, 0xFC, 0xBC, 0x01, 0x20, 0xC8, + 0x10, 0xFC, 0xB0, 0x01, 0x20, 0xC8, 0x12, 0xFC, + 0xB2, 0x01, 0x0C, 0xC8, 0x6C, 0x01, 0xA0, 0xF2, + 0x2E, 0x09, 0x8A, 0x01, 0x00, 0x10, 0xA0, 0x01, + 0x80, 0x01, 0x00, 0xC4, 0xDD, 0x10, 0x48, 0xC0, + 0x89, 0xC0, 0x81, 0x60, 0xC2, 0x05, 0x5B, 0x04, + 0x0B, 0xC3, 0xA0, 0x06, 0xC8, 0xAC, 0x41, 0xCC, + 0x42, 0x06, 0xFD, 0x16, 0xA0, 0x06, 0xC8, 0xAC, + 0x01, 0xC1, 0x44, 0x8C, 0x12, 0x16, 0xC4, 0x05, + 0x42, 0x06, 0xFB, 0x16, 0x04, 0x02, 0x0E, 0xAD, + 0x03, 0x02, 0x01, 0x01, 0x94, 0x06, 0x03, 0x02, + 0x5A, 0x5A, 0x94, 0x06, 0x43, 0x05, 0x94, 0x06, + 0x03, 0x07, 0x94, 0x06, 0xC3, 0x04, 0x94, 0x06, + 0xCC, 0x05, 0x5C, 0x04, 0xCB, 0xC1, 0xA0, 0x06, + 0xC8, 0xAC, 0x43, 0xCC, 0x42, 0x06, 0xFD, 0x16, + 0xA0, 0x06, 0xC8, 0xAC, 0x43, 0x8C, 0xF5, 0x16, + 0x42, 0x06, 0xFC, 0x16, 0x57, 0x04, 0x8B, 0xC2, + 0x08, 0xC0, 0x49, 0xC1, 0x85, 0x05, 0x80, 0x02, + 0x40, 0x00, 0x03, 0x11, 0x80, 0x02, 0x4F, 0x00, + 0x45, 0x12, 0x01, 0x02, 0xC8, 0xAC, 0xA1, 0x09, + 0x01, 0x80, 0x40, 0x13, 0x01, 0x02, 0xF8, 0xAD, + 0xA1, 0x09, 0x01, 0x80, 0x3B, 0x13, 0x60, 0xC0, + 0x06, 0x00, 0xA1, 0x09, 0x01, 0x80, 0x36, 0x13, + 0x81, 0x05, 0x01, 0x80, 0x33, 0x13, 0x4A, 0xC0, + 0xA1, 0x09, 0x01, 0x80, 0x2F, 0x13, 0x00, 0xC8, + 0x6A, 0x01, 0x80, 0x02, 0x80, 0x00, 0x17, 0x14, + 0x01, 0x02, 0x00, 0xF8, 0xA0, 0xC1, 0x40, 0x01, + 0xA0, 0x01, 0x40, 0x01, 0x00, 0x04, 0x02, 0x02, + 0x00, 0x10, 0x03, 0x02, 0x00, 0x04, 0xB1, 0xCC, + 0x43, 0x06, 0xFD, 0x16, 0xA0, 0x01, 0x40, 0x01, + 0x00, 0x40, 0x08, 0x02, 0x10, 0xF8, 0x06, 0xC8, + 0x40, 0x01, 0x00, 0xC0, 0x02, 0x13, 0x08, 0x02, + 0x00, 0xF8, 0x09, 0x02, 0xFE, 0xFB, 0xA0, 0x06, + 0xD2, 0xAC, 0x25, 0x10, 0x80, 0x02, 0x80, 0x00, + 0x09, 0x14, 0x01, 0x02, 0x00, 0xF8, 0x02, 0x02, + 0x00, 0x10, 0x03, 0x02, 0x00, 0x04, 0x72, 0xCC, + 0x43, 0x06, 0xFD, 0x16, 0x80, 0x05, 0x80, 0x02, + 0x80, 0x00, 0x04, 0x12, 0x60, 0x01, 0x04, 0x01, + 0x20, 0x00, 0x05, 0x13, 0x40, 0x81, 0xAB, 0x16, + 0x80, 0x02, 0x80, 0x00, 0x0B, 0x14, 0xA0, 0x07, + 0x6A, 0x01, 0x7E, 0x00, 0x02, 0x02, 0x00, 0x10, + 0x03, 0x02, 0x00, 0x04, 0xC1, 0x04, 0x81, 0xCC, + 0x43, 0x06, 0xFD, 0x16, 0xCA, 0x05, 0x5A, 0x04, + 0x00, 0x02, 0xEA, 0xAD, 0x01, 0x02, 0x1A, 0xAF, + 0x40, 0x02, 0x00, 0xFC, 0x41, 0x02, 0x00, 0xFC, + 0x40, 0x80, 0x04, 0x13, 0xA0, 0x07, 0x04, 0x01, + 0x3C, 0x00, 0x5B, 0x04, 0xC0, 0x04, 0x01, 0x02, + 0x08, 0x00, 0x02, 0x02, 0x00, 0x12, 0xE0, 0xC1, + 0x40, 0x01, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x04, + 0x03, 0x02, 0x00, 0x01, 0x00, 0xC8, 0x6A, 0x01, + 0xA0, 0xCC, 0x10, 0xF8, 0x80, 0x05, 0x03, 0x06, + 0xF9, 0x16, 0x22, 0x02, 0x00, 0x02, 0x01, 0x06, + 0xF3, 0x16, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x40, + 0x07, 0xC8, 0x40, 0x01, 0x00, 0x02, 0x00, 0x08, + 0x40, 0xC0, 0x01, 0x06, 0x01, 0xC8, 0x6A, 0x01, + 0x61, 0x02, 0x00, 0x80, 0x01, 0xC8, 0x10, 0xF8, + 0x00, 0x06, 0xF6, 0x16, 0xC0, 0x04, 0xC8, 0x04, + 0xC9, 0x04, 0x03, 0x02, 0x00, 0x08, 0x00, 0xC8, + 0x6A, 0x01, 0x80, 0xC1, 0x66, 0x02, 0x00, 0x80, + 0x20, 0xC1, 0x10, 0xF8, 0x06, 0x81, 0x15, 0x16, + 0x08, 0xC2, 0x06, 0x13, 0x80, 0x05, 0x03, 0x06, + 0xF2, 0x16, 0x08, 0xC2, 0x0D, 0x13, 0x19, 0x10, + 0xA0, 0x07, 0x10, 0xF8, 0x55, 0x55, 0x20, 0xC1, + 0x10, 0xF8, 0x84, 0x02, 0x55, 0x55, 0x02, 0x16, + 0x06, 0xC2, 0xF0, 0x10, 0x06, 0x81, 0xEE, 0x13, + 0x5B, 0x04, 0xA0, 0x07, 0x10, 0xF8, 0x55, 0x55, + 0x60, 0xC1, 0x10, 0xF8, 0x05, 0x81, 0x03, 0x13, + 0x85, 0x02, 0x55, 0x55, 0xF5, 0x16, 0x08, 0xC2, + 0xE1, 0x13, 0x40, 0xC2, 0x09, 0x06, 0x48, 0x02, + 0xFF, 0x07, 0xC0, 0x04, 0x01, 0x02, 0x08, 0x00, + 0x02, 0x02, 0x00, 0x12, 0x03, 0x02, 0x00, 0x01, + 0x00, 0xC8, 0x6A, 0x01, 0x32, 0xC8, 0x10, 0xF8, + 0x80, 0x05, 0x03, 0x06, 0xF9, 0x16, 0x22, 0x02, + 0x00, 0x02, 0x01, 0x06, 0xF3, 0x16, 0x88, 0x02, + 0x40, 0x00, 0x13, 0x15, 0x89, 0x02, 0x4F, 0x00, + 0x10, 0x11, 0xC0, 0x04, 0x02, 0x02, 0x00, 0x12, + 0x01, 0x02, 0x08, 0x00, 0x03, 0x02, 0x00, 0x01, + 0x80, 0xCC, 0x03, 0x06, 0xFD, 0x16, 0x22, 0x02, + 0x00, 0x02, 0x01, 0x06, 0xF7, 0x16, 0xCB, 0x05, + 0x5B, 0x04, 0xA0, 0x07, 0x04, 0x01, 0x37, 0x00, + 0x5B, 0x04, 0x33, 0x07, 0x33, 0x07, 0x0C, 0x10, + 0x13, 0x07, 0x23, 0x07, 0x02, 0x00, 0xCB, 0xC8, + 0x06, 0x00, 0x23, 0x02, 0x18, 0x00, 0xE0, 0xCC, + 0x6C, 0x01, 0xCD, 0xCC, 0xCE, 0xCC, 0xCF, 0xCC, + 0x83, 0x07, 0x30, 0x06, 0xD3, 0xC1, 0x0A, 0x13, + 0x83, 0x07, 0x36, 0x07, 0xD3, 0xC1, 0x06, 0x13, + 0x83, 0x07, 0xA0, 0x00, 0x93, 0x00, 0x0C, 0xC8, + 0x6C, 0x01, 0x80, 0x03, 0x63, 0x07, 0x02, 0x00, + 0x2A, 0x15, 0x63, 0xC2, 0x04, 0x00, 0x63, 0x42, + 0x06, 0x00, 0xDB, 0x13, 0x63, 0xC3, 0x1A, 0x00, + 0x49, 0xD2, 0x0C, 0x13, 0xC9, 0x06, 0x49, 0x72, + 0x69, 0xD2, 0xC0, 0xE1, 0xC9, 0x06, 0x49, 0x72, + 0xE9, 0x48, 0x04, 0xE0, 0x04, 0x00, 0x49, 0xCB, + 0x02, 0x00, 0x52, 0x04, 0x69, 0xC2, 0xC0, 0xE1, + 0x49, 0x72, 0x29, 0x02, 0x10, 0x00, 0xC3, 0xC2, + 0xE9, 0xA2, 0xA8, 0xE1, 0x1B, 0xC3, 0x89, 0x02, + 0x12, 0x00, 0x0F, 0x13, 0xDC, 0xC6, 0x03, 0x16, + 0xE9, 0x48, 0x04, 0xE0, 0x04, 0x00, 0x49, 0xCB, + 0x02, 0x00, 0x4C, 0xCB, 0x04, 0x00, 0x90, 0x03, + 0xFF, 0x01, 0x93, 0x00, 0x0C, 0xC8, 0x6C, 0x01, + 0x80, 0x03, 0x0C, 0xC8, 0x6C, 0x01, 0xE0, 0xC6, + 0x00, 0xFC, 0xF1, 0x16, 0xE9, 0x48, 0x04, 0xE0, + 0x04, 0x00, 0x49, 0xCB, 0x02, 0x00, 0x4C, 0xCB, + 0x04, 0x00, 0xED, 0x10, 0x00, 0x03, 0x02, 0x00, + 0xDB, 0xC2, 0x63, 0xC2, 0x04, 0x00, 0x4B, 0x42, + 0x9F, 0x13, 0x49, 0xD2, 0x0E, 0x13, 0xC9, 0x06, + 0x49, 0x72, 0x69, 0xD2, 0xC0, 0xE1, 0xC9, 0x06, + 0x49, 0x72, 0xE9, 0x48, 0x04, 0xE0, 0x04, 0x00, + 0x49, 0xCB, 0x02, 0x00, 0x90, 0x03, 0xFF, 0xFF, + 0x80, 0x03, 0x69, 0xC2, 0xC0, 0xE1, 0x49, 0x72, + 0x29, 0x02, 0x10, 0x00, 0xC3, 0xC2, 0xE9, 0xA2, + 0xA8, 0xE1, 0x1B, 0xC3, 0x89, 0x02, 0x12, 0x00, + 0x0C, 0x13, 0xDC, 0xC6, 0x03, 0x16, 0xE9, 0x48, + 0x04, 0xE0, 0x04, 0x00, 0x49, 0xCB, 0x02, 0x00, + 0x4C, 0xCB, 0x04, 0x00, 0x90, 0x03, 0xFF, 0xFF, + 0x80, 0x03, 0x0C, 0xC8, 0x6C, 0x01, 0xE0, 0xC6, + 0x00, 0xFC, 0xF4, 0x16, 0xF0, 0x10, 0x00, 0x03, + 0x02, 0x00, 0xBB, 0xC2, 0xBB, 0xC1, 0x86, 0xD1, + 0x03, 0x13, 0x86, 0xEA, 0x04, 0x00, 0x13, 0x10, + 0xA6, 0xD1, 0xC0, 0xE1, 0xC6, 0x06, 0x86, 0x71, + 0xCA, 0xC1, 0xE6, 0xA1, 0xB8, 0xE1, 0xA6, 0xEA, + 0x14, 0xE0, 0x04, 0x00, 0x1B, 0xC2, 0x86, 0x02, + 0x02, 0x00, 0x03, 0x16, 0xA0, 0x06, 0x0C, 0xB5, + 0x02, 0x10, 0xA0, 0x06, 0xE6, 0xB4, 0xDA, 0x04, + 0x80, 0x03, 0x00, 0x03, 0x02, 0x00, 0xAB, 0xC2, + 0x06, 0x00, 0x8C, 0x07, 0xE8, 0x05, 0x5C, 0xC2, + 0x16, 0x13, 0xA0, 0xC1, 0xEC, 0x05, 0x8A, 0x81, + 0x1A, 0x1A, 0xC6, 0xC1, 0x09, 0xC2, 0x59, 0xC2, + 0x20, 0x13, 0xE9, 0xA1, 0x08, 0x00, 0x87, 0x82, + 0xF9, 0x12, 0xA9, 0xA2, 0x08, 0x00, 0x87, 0x62, + 0xCA, 0xCA, 0x08, 0x00, 0x4A, 0x6A, 0x08, 0x00, + 0xC9, 0xC6, 0x0B, 0xC6, 0x80, 0x03, 0xCA, 0xCA, + 0x08, 0x00, 0x0A, 0xC8, 0xEC, 0x05, 0xDB, 0x04, + 0x0B, 0xCF, 0x0B, 0xC7, 0x80, 0x03, 0x8A, 0x61, + 0x46, 0xCA, 0x08, 0x00, 0xCA, 0xCA, 0x08, 0x00, + 0x0A, 0xC8, 0xEC, 0x05, 0xC9, 0xC6, 0x0B, 0xC7, + 0x80, 0x03, 0x87, 0x62, 0xCA, 0xCA, 0x08, 0x00, + 0xDB, 0x04, 0x0B, 0xC6, 0x0B, 0xCB, 0x02, 0x00, + 0x80, 0x03, 0x00, 0x03, 0x02, 0x00, 0xBB, 0xC1, + 0xDB, 0xC2, 0x8C, 0x07, 0xE8, 0x05, 0x4C, 0xC2, + 0xED, 0x04, 0x02, 0x00, 0x09, 0xC2, 0x59, 0xC2, + 0x18, 0x13, 0xA9, 0x81, 0x02, 0x00, 0xFA, 0x16, + 0xE9, 0x82, 0x04, 0x00, 0xF7, 0x16, 0x49, 0xCB, + 0x04, 0x00, 0x99, 0xC2, 0x0A, 0xC6, 0x0A, 0x13, + 0x08, 0x83, 0x04, 0x13, 0xA9, 0xAA, 0x08, 0x00, + 0x08, 0x00, 0x80, 0x03, 0x2A, 0xA8, 0x08, 0x00, + 0xEC, 0x05, 0x80, 0x03, 0x08, 0xCB, 0x02, 0x00, + 0x80, 0x03, 0x2D, 0x07, 0x02, 0x00, 0x8C, 0x07, + 0x08, 0x00, 0x06, 0xA3, 0x4C, 0xC2, 0x09, 0xC2, + 0x59, 0xC2, 0x13, 0x13, 0xE9, 0x82, 0x04, 0x00, + 0xFA, 0x16, 0xAD, 0x07, 0x02, 0x00, 0x01, 0x00, + 0x49, 0xCB, 0x04, 0x00, 0x19, 0xC6, 0x01, 0x13, + 0x80, 0x03, 0x08, 0x83, 0x04, 0x16, 0xA0, 0x49, + 0x14, 0xE0, 0x04, 0x00, 0x80, 0x03, 0x08, 0xCB, + 0x02, 0x00, 0x80, 0x03, 0x00, 0x03, 0x02, 0x00, + 0x0B, 0x06, 0x1F, 0x11, 0x4D, 0x13, 0x8B, 0x07, + 0x00, 0x4E, 0x60, 0x01, 0x42, 0x01, 0x80, 0x00, + 0x09, 0x13, 0x8B, 0x07, 0x00, 0x3A, 0x20, 0xC1, + 0x4E, 0x01, 0x84, 0x02, 0x41, 0x0F, 0x02, 0x11, + 0x8B, 0x07, 0x00, 0x4E, 0x0B, 0xC8, 0x44, 0x01, + 0xA0, 0x07, 0x62, 0x09, 0xE8, 0x03, 0xE0, 0x01, + 0x40, 0x01, 0x00, 0x02, 0xE0, 0x01, 0x40, 0x01, + 0x00, 0x20, 0x84, 0x07, 0x34, 0xAF, 0x60, 0x04, + 0x42, 0xAF, 0x20, 0xC8, 0x16, 0xE0, 0xE0, 0x00, + 0xE0, 0xC2, 0x6A, 0x09, 0xE0, 0x22, 0x10, 0xE0, + 0x03, 0x13, 0x20, 0xE8, 0x14, 0xE0, 0xE0, 0x00, + 0x20, 0xC8, 0x04, 0xE0, 0x82, 0x01, 0x20, 0xC8, + 0xE2, 0x00, 0x8A, 0x01, 0xE0, 0x04, 0x18, 0x09, + 0xE0, 0x04, 0xF4, 0x05, 0xE0, 0x04, 0xF8, 0x05, + 0xE0, 0x04, 0xF0, 0x05, 0xE0, 0x04, 0x42, 0x07, + 0xA0, 0x07, 0x88, 0x01, 0x20, 0x00, 0xE0, 0xC2, + 0x30, 0x09, 0x09, 0x13, 0xA0, 0x07, 0x88, 0x01, + 0x80, 0x00, 0x20, 0xE8, 0x16, 0xE0, 0x80, 0x01, + 0xE0, 0x01, 0x82, 0x01, 0x00, 0x03, 0x8B, 0x07, + 0x00, 0xA0, 0x0B, 0xE8, 0x86, 0x01, 0x80, 0x03, + 0xE0, 0x04, 0x86, 0x01, 0xE0, 0x01, 0x9C, 0x01, + 0x40, 0x00, 0xE0, 0x01, 0x9C, 0x01, 0x00, 0x40, + 0xCB, 0x04, 0xB0, 0x03, 0x0B, 0x06, 0x04, 0x13, + 0x60, 0x01, 0x9C, 0x01, 0x00, 0x40, 0xF9, 0x16, + 0xE0, 0x04, 0x82, 0x01, 0x20, 0xE8, 0x08, 0xE0, + 0x6A, 0x09, 0x8B, 0x07, 0x00, 0x80, 0x0B, 0xC8, + 0x98, 0x07, 0x0B, 0xC8, 0x78, 0x07, 0x20, 0xC8, + 0x04, 0xE0, 0x82, 0x01, 0x8B, 0x07, 0x6F, 0x87, + 0x0B, 0x48, 0x3A, 0x07, 0xE0, 0xC2, 0x50, 0x07, + 0x8B, 0x02, 0x58, 0x07, 0x10, 0x13, 0x20, 0xE8, + 0x0A, 0xE0, 0x00, 0x01, 0xE0, 0xC2, 0x00, 0x01, + 0xE0, 0x22, 0x06, 0xE0, 0xF8, 0x13, 0x8B, 0x07, + 0x58, 0x07, 0x0B, 0xC8, 0x50, 0x07, 0x8B, 0x07, + 0x0C, 0xB8, 0x0B, 0xC8, 0x52, 0x07, 0x80, 0x03, + 0x00, 0x03, 0x02, 0x00, 0xE0, 0xC2, 0x1A, 0x09, + 0x0C, 0x13, 0x20, 0x06, 0x1C, 0x09, 0x0B, 0xC8, + 0x6C, 0x01, 0x20, 0xC8, 0x00, 0xFC, 0x1A, 0x09, + 0x4B, 0xCB, 0x02, 0x00, 0x90, 0x03, 0xFF, 0xFF, + 0x80, 0x03, 0x41, 0xC0, 0x0F, 0x13, 0x81, 0x80, + 0x0D, 0x13, 0x82, 0xA0, 0xE2, 0xC2, 0x32, 0x0C, + 0x12, 0x09, 0x0B, 0xC8, 0x6C, 0x01, 0xE0, 0x04, + 0x00, 0xFC, 0x20, 0xC3, 0x02, 0xFC, 0x07, 0x11, + 0x02, 0xC8, 0x00, 0xFC, 0xED, 0x04, 0x02, 0x00, + 0xE0, 0x04, 0x6C, 0x01, 0x80, 0x03, 0x42, 0xCB, + 0x02, 0x00, 0x02, 0xC8, 0x6C, 0x01, 0x8B, 0xC0, + 0x80, 0x03, 0x00, 0x03, 0x02, 0x00, 0x83, 0x07, + 0x00, 0x80, 0x60, 0xC2, 0x7E, 0x09, 0x09, 0xC1, + 0x24, 0x02, 0xF8, 0xFF, 0xA9, 0x08, 0x01, 0x02, + 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x0B, 0x02, + 0x00, 0x00, 0x0C, 0x02, 0x00, 0x00, 0x07, 0x02, + 0x00, 0x00, 0x2C, 0xCB, 0x32, 0x0C, 0x32, 0x0C, + 0x06, 0x13, 0x8B, 0x05, 0xCC, 0x05, 0x0B, 0x88, + 0x46, 0x04, 0x27, 0x1B, 0xF6, 0x10, 0x09, 0xC2, + 0x8B, 0xC2, 0x08, 0x06, 0x0A, 0x13, 0x8B, 0x05, + 0xCC, 0x05, 0x0B, 0x88, 0x46, 0x04, 0x1D, 0x1B, + 0x2C, 0xCB, 0x32, 0x0C, 0x32, 0x0C, 0xED, 0x16, + 0xF4, 0x10, 0x82, 0xC0, 0x14, 0x13, 0x02, 0xC8, + 0x6C, 0x01, 0x0A, 0xC8, 0x00, 0xFC, 0x0A, 0xC8, + 0x6C, 0x01, 0xE0, 0x04, 0x00, 0xFC, 0xA0, 0x07, + 0x02, 0xFC, 0x00, 0x80, 0x04, 0xC8, 0x04, 0xFC, + 0x0A, 0xC2, 0x08, 0xA2, 0x02, 0xCA, 0x32, 0x0C, + 0x8A, 0xC0, 0x87, 0x05, 0xD6, 0x10, 0x4A, 0xC0, + 0xEE, 0x10, 0x47, 0xCB, 0x02, 0x00, 0xE0, 0x04, + 0x6C, 0x01, 0x8B, 0x07, 0x43, 0x00, 0xE0, 0x04, + 0x00, 0x0C, 0x00, 0x03, 0x02, 0x00, 0x0B, 0xC8, + 0x6C, 0x01, 0x8B, 0x02, 0x43, 0x00, 0x04, 0x13, + 0x60, 0x01, 0x02, 0xFC, 0x20, 0x00, 0x06, 0x13, + 0x8B, 0xC2, 0xA0, 0x06, 0x42, 0xB4, 0x90, 0x03, + 0x7F, 0x00, 0x80, 0x03, 0xA0, 0x01, 0x02, 0xFC, + 0x20, 0x00, 0x60, 0x01, 0x6A, 0x09, 0x01, 0x00, + 0x0B, 0x16, 0x0A, 0x02, 0x02, 0xFC, 0xA0, 0xA2, + 0x2C, 0x09, 0xA0, 0xCE, 0xEE, 0x05, 0xA0, 0xC6, + 0x04, 0xFC, 0x20, 0xC8, 0x2C, 0x09, 0x04, 0xFC, + 0x8A, 0x07, 0xF8, 0x05, 0x5A, 0xC2, 0x08, 0x13, + 0xCA, 0x05, 0x5A, 0xC2, 0x09, 0xC8, 0x6C, 0x01, + 0x0B, 0xC8, 0x00, 0xFC, 0x8B, 0xC6, 0x02, 0x10, + 0x8B, 0xCE, 0x8B, 0xC6, 0x20, 0x20, 0x1A, 0xE0, + 0x05, 0x16, 0x20, 0xE8, 0x04, 0xE0, 0x3A, 0x07, + 0xE0, 0x04, 0x36, 0x07, 0x90, 0x03, 0x7F, 0x00, + 0x80, 0x03, 0x00, 0x03, 0x02, 0x00, 0x0B, 0xC8, + 0x6C, 0x01, 0xCC, 0x04, 0xE0, 0x04, 0x00, 0xFC, + 0x8B, 0xC2, 0xA0, 0x06, 0x50, 0xB4, 0x90, 0x03, + 0x7F, 0x00, 0x80, 0x03, 0xA0, 0x07, 0x02, 0xFC, + 0x00, 0x80, 0x20, 0xC8, 0x8C, 0xE1, 0x04, 0xFC, + 0x41, 0xC0, 0x0F, 0x16, 0x20, 0xD8, 0x00, 0xE2, + 0x83, 0x01, 0x8B, 0x0B, 0x8B, 0x0B, 0x8B, 0x0B, + 0x8B, 0x0B, 0x8B, 0x0B, 0x8B, 0x0B, 0x8B, 0x0B, + 0x8B, 0x0B, 0x8B, 0x0B, 0x8B, 0x0B, 0x0A, 0xC8, + 0x8A, 0x01, 0x5B, 0x04, 0x0A, 0xC8, 0x6C, 0x01, + 0x20, 0xC3, 0x00, 0xFC, 0xE0, 0x04, 0x00, 0xFC, + 0x8A, 0x02, 0x43, 0x00, 0xDF, 0x13, 0xA0, 0x07, + 0x02, 0xFC, 0x00, 0x80, 0x04, 0xC8, 0x04, 0xFC, + 0x20, 0x98, 0x84, 0x09, 0x1D, 0x09, 0x0A, 0x13, + 0x20, 0xC8, 0x1A, 0x09, 0x00, 0xFC, 0x0A, 0xC8, + 0x1A, 0x09, 0xA0, 0x05, 0x1C, 0x09, 0x8C, 0xC2, + 0xE5, 0x16, 0x5B, 0x04, 0x41, 0xC0, 0x10, 0x13, + 0x8A, 0xA2, 0x82, 0xCA, 0x32, 0x0C, 0x1A, 0x09, + 0x02, 0xC8, 0x6C, 0x01, 0x0A, 0xC8, 0x00, 0xFC, + 0x8A, 0xC0, 0x20, 0x98, 0x83, 0x01, 0x00, 0xE2, + 0x09, 0x13, 0x8C, 0xC2, 0xD3, 0x16, 0x5B, 0x04, + 0x4A, 0xC0, 0x8A, 0xC0, 0x20, 0x98, 0x83, 0x01, + 0x00, 0xE2, 0x1B, 0x16, 0xE0, 0x01, 0x9C, 0x01, + 0x40, 0x00, 0xA0, 0x07, 0x64, 0x09, 0x00, 0x70, + 0x60, 0x01, 0x9C, 0x01, 0x40, 0x00, 0x07, 0x13, + 0x20, 0x06, 0x64, 0x09, 0xF9, 0x16, 0x0A, 0x02, + 0x00, 0x01, 0x60, 0x04, 0x8A, 0xA3, 0x60, 0x01, + 0x02, 0x0C, 0x00, 0x01, 0xE2, 0x13, 0x20, 0xD8, + 0x2F, 0x09, 0x83, 0x01, 0xA0, 0x07, 0x02, 0x0C, + 0x00, 0x80, 0x0A, 0xC8, 0x8A, 0x01, 0x0A, 0xC8, + 0x18, 0x09, 0xD7, 0x10, 0xD8, 0x04, 0x57, 0xC2, + 0x03, 0x16, 0xC8, 0xCD, 0xC8, 0xC5, 0x5B, 0x04, + 0xC7, 0x05, 0x57, 0xC2, 0x48, 0xC6, 0xC8, 0xC5, + 0x5B, 0x04, 0x08, 0xC8, 0x6C, 0x01, 0x08, 0xA2, + 0x20, 0xCA, 0x00, 0xFC, 0x32, 0x0C, 0x18, 0x09, + 0x02, 0x10, 0x08, 0xC8, 0x6C, 0x01, 0xE0, 0x04, + 0x00, 0xFC, 0x57, 0xC2, 0x03, 0x16, 0xC8, 0xCD, + 0xC8, 0xC5, 0x5B, 0x04, 0xC7, 0x05, 0x17, 0xC8, + 0x6C, 0x01, 0x08, 0xC8, 0x00, 0xFC, 0xC8, 0xC5, + 0x5B, 0x04, 0x17, 0xC6, 0x02, 0x16, 0xC8, 0xC9, + 0x02, 0x00, 0xC8, 0xC5, 0x5B, 0x04, 0x17, 0xC2, + 0x08, 0xC8, 0x6C, 0x01, 0x07, 0x13, 0xE0, 0xC5, + 0x00, 0xFC, 0x08, 0xA2, 0x28, 0xC8, 0x32, 0x0C, + 0x00, 0xFC, 0x18, 0x09, 0x5B, 0x04, 0x60, 0x01, + 0x82, 0x01, 0x00, 0x20, 0x0A, 0x16, 0x60, 0xC2, + 0x84, 0x01, 0xA0, 0x01, 0x82, 0x01, 0x00, 0x20, + 0xE0, 0x01, 0x82, 0x01, 0x00, 0x20, 0x09, 0xC8, + 0x84, 0x01, 0xC9, 0x04, 0x5B, 0x04, 0xA0, 0x06, + 0xBE, 0xB7, 0xD3, 0x04, 0xE0, 0x04, 0x02, 0x01, + 0x20, 0xE8, 0x14, 0xE0, 0x00, 0x01, 0x20, 0xC8, + 0x16, 0xE0, 0x04, 0x01, 0x05, 0x2C, 0x20, 0x48, + 0x14, 0xE0, 0x00, 0x01, 0x8C, 0x07, 0x00, 0x0A, + 0x8D, 0x07, 0xD8, 0x07, 0x8E, 0x07, 0x18, 0x00, + 0x7C, 0xCF, 0x4E, 0x06, 0xFD, 0x16, 0xE0, 0x02, + 0xD8, 0x07, 0x8F, 0x07, 0x11, 0xFF, 0x8B, 0x02, + 0x3B, 0x59, 0x21, 0x16, 0x8A, 0x02, 0x3B, 0x59, + 0x1E, 0x13, 0x8F, 0x05, 0x20, 0x20, 0x16, 0xE0, + 0x01, 0x16, 0x19, 0x10, 0x20, 0x20, 0x04, 0xE0, + 0x16, 0x16, 0x00, 0x01, 0xBF, 0x00, 0x13, 0x16, + 0x8B, 0x07, 0xC0, 0x40, 0x00, 0x01, 0x00, 0x60, + 0x10, 0x13, 0x40, 0x01, 0x00, 0x60, 0x0B, 0x16, + 0x8B, 0x07, 0xC4, 0x44, 0xA0, 0xC3, 0x02, 0x01, + 0x0E, 0x48, 0x02, 0x01, 0x4E, 0x01, 0x00, 0x10, + 0x04, 0x16, 0x8F, 0x07, 0x18, 0xFF, 0x60, 0x04, + 0x94, 0xB7, 0x0B, 0xC3, 0x4B, 0xC3, 0x20, 0x20, + 0x0A, 0xE0, 0x02, 0x16, 0x6B, 0x02, 0x20, 0x20, + 0x20, 0x20, 0x0C, 0xE0, 0x02, 0x16, 0x6C, 0x02, + 0x00, 0x20, 0x20, 0x20, 0x0E, 0xE0, 0x02, 0x16, + 0x6C, 0x02, 0x20, 0x00, 0x8F, 0x05, 0x20, 0x20, + 0x10, 0xE0, 0x07, 0x16, 0x6D, 0x02, 0x20, 0x00, + 0x20, 0x21, 0x22, 0xE0, 0xE4, 0x13, 0x04, 0xC1, + 0x02, 0x16, 0x84, 0x07, 0xFE, 0x7F, 0x8F, 0x05, + 0x20, 0x20, 0x12, 0xE0, 0x02, 0x16, 0x6D, 0x02, + 0x00, 0x20, 0x60, 0x21, 0x22, 0xE0, 0xD7, 0x13, + 0x45, 0xC1, 0x02, 0x16, 0x85, 0x07, 0xFE, 0x7F, + 0x8F, 0x05, 0x86, 0xD1, 0x0B, 0x13, 0xA0, 0x25, + 0x26, 0xE0, 0x08, 0x13, 0x8F, 0x05, 0x20, 0x26, + 0x22, 0xE0, 0x04, 0x16, 0x8F, 0x05, 0xA0, 0x26, + 0x22, 0xE0, 0x02, 0x13, 0x60, 0x04, 0x94, 0xB7, + 0x01, 0xD8, 0xEC, 0x08, 0x20, 0xD8, 0xDB, 0x07, + 0x00, 0x09, 0x02, 0xD8, 0xF6, 0x08, 0x20, 0xD8, + 0xDD, 0x07, 0xE2, 0x08, 0xE0, 0x02, 0x58, 0x07, + 0x20, 0xD8, 0xEF, 0x07, 0xF4, 0x07, 0x20, 0xD8, + 0xF1, 0x07, 0xF6, 0x07, 0x20, 0xD8, 0xF3, 0x07, + 0xF8, 0x07, 0x09, 0x02, 0x06, 0x00, 0xCB, 0x04, + 0x0F, 0x02, 0xEE, 0x07, 0x8F, 0x05, 0xCB, 0xDF, + 0x09, 0x06, 0xFC, 0x16, 0xA0, 0x06, 0xBE, 0xB7, + 0x89, 0x07, 0x5C, 0xE3, 0xE0, 0x04, 0x1A, 0x01, + 0x20, 0xC8, 0xE4, 0x07, 0x18, 0x01, 0x19, 0xC8, + 0x0C, 0x01, 0x39, 0xC8, 0x0A, 0x01, 0x39, 0xC8, + 0x12, 0x01, 0x09, 0x16, 0x79, 0xC3, 0x0F, 0x02, + 0x00, 0xE0, 0x4F, 0x63, 0x2D, 0x02, 0x00, 0x90, + 0x0D, 0xC8, 0x14, 0x01, 0x02, 0x10, 0x39, 0xC8, + 0x14, 0x01, 0xF9, 0xC3, 0x3F, 0xC8, 0x0E, 0x01, + 0x1F, 0xC8, 0x10, 0x01, 0xE0, 0x04, 0x14, 0x09, + 0xB9, 0xC2, 0x1A, 0xC8, 0x00, 0x01, 0x96, 0x06, + 0x89, 0x02, 0x84, 0xE3, 0xE0, 0x16, 0x8F, 0x07, + 0x1C, 0xFF, 0x8C, 0x07, 0x00, 0x0A, 0x8D, 0x07, + 0x84, 0xE3, 0x8E, 0x07, 0x10, 0x00, 0x7C, 0x8F, + 0x44, 0x16, 0x4E, 0x06, 0xFC, 0x16, 0xA0, 0xC3, + 0xE2, 0x07, 0xE0, 0xC3, 0xE0, 0x07, 0xCE, 0x83, + 0x01, 0x14, 0xCE, 0xC3, 0x0F, 0xC8, 0x1A, 0x01, + 0x8C, 0x07, 0x94, 0xE3, 0x8D, 0x07, 0x00, 0x0A, + 0x8E, 0x07, 0xA4, 0xE3, 0x8C, 0x63, 0x7C, 0xCF, + 0x4E, 0x06, 0xFD, 0x16, 0xE0, 0x04, 0x30, 0x09, + 0x20, 0x01, 0x42, 0x01, 0x00, 0x04, 0x02, 0x16, + 0x20, 0x07, 0x30, 0x09, 0x60, 0xC2, 0x62, 0x01, + 0xE0, 0x04, 0x62, 0x01, 0x8E, 0x07, 0x00, 0x80, + 0x8C, 0x07, 0x34, 0x09, 0x8D, 0x07, 0x06, 0x00, + 0x3E, 0xDF, 0x8E, 0x05, 0x0D, 0x06, 0xFC, 0x16, + 0xFE, 0xD3, 0xCF, 0x06, 0x8E, 0x05, 0xFE, 0xD3, + 0xCF, 0x06, 0x8C, 0x07, 0x34, 0x09, 0x09, 0xC8, + 0x62, 0x01, 0xC9, 0x04, 0x5C, 0xA3, 0x7C, 0xE2, + 0x5C, 0xA3, 0x7C, 0xE2, 0x5C, 0xA3, 0x7C, 0xE2, + 0x02, 0x13, 0xCD, 0x83, 0x09, 0x13, 0x20, 0x07, + 0x34, 0x09, 0x06, 0x10, 0x8F, 0x07, 0x19, 0xFF, + 0xCD, 0xA3, 0x0F, 0xC8, 0x04, 0x01, 0xFF, 0x10, + 0xA0, 0x01, 0x02, 0x01, 0x00, 0x10, 0xE0, 0xC3, + 0xEE, 0x07, 0xE0, 0x43, 0x06, 0xE0, 0x0F, 0xC8, + 0x00, 0x01, 0x20, 0xC0, 0x04, 0xE0, 0xE0, 0x04, + 0xFE, 0x06, 0xD3, 0x04, 0xE0, 0x04, 0x04, 0x01, + 0x60, 0x04, 0x0C, 0xB8, 0x8C, 0x07, 0x00, 0x0A, + 0x8D, 0x07, 0x18, 0x00, 0x8E, 0x07, 0x3B, 0x59, + 0x0E, 0xCF, 0x4D, 0x06, 0xFD, 0x16, 0x5B, 0x04, + 0x93, 0x01, 0x00, 0x80, 0x20, 0x04, 0xC0, 0xE2, + 0x60, 0xD0, 0x98, 0x07, 0x1C, 0x13, 0x00, 0x03, + 0x02, 0x00, 0xA0, 0xC0, 0x46, 0x07, 0x12, 0xC8, + 0x46, 0x07, 0x02, 0x16, 0x93, 0x01, 0x20, 0x00, + 0x00, 0x03, 0x0F, 0x00, 0x20, 0x04, 0xE8, 0xE2, + 0x93, 0x01, 0x00, 0x20, 0x80, 0x01, 0x00, 0x40, + 0x00, 0x01, 0xFE, 0x00, 0x49, 0x16, 0xC4, 0xC3, + 0x25, 0x16, 0xD3, 0xC3, 0xC5, 0x43, 0x0C, 0x16, + 0xE0, 0xC3, 0x98, 0x07, 0x03, 0x11, 0xE0, 0x02, + 0x98, 0x07, 0x51, 0x04, 0xE0, 0xC3, 0x78, 0x07, + 0x0A, 0x11, 0xE0, 0x02, 0x78, 0x07, 0x51, 0x04, + 0xD3, 0x11, 0x4F, 0x01, 0x00, 0x20, 0xE4, 0x13, + 0x4F, 0x01, 0x20, 0x00, 0xD1, 0x13, 0x05, 0x2C, + 0x41, 0xA0, 0x21, 0x04, 0xC0, 0xE2, 0x8B, 0x07, + 0x0C, 0xB8, 0x00, 0x01, 0x00, 0x40, 0x0F, 0x13, + 0xDD, 0xC3, 0x4F, 0x02, 0x0F, 0x00, 0x2F, 0xE1, + 0x14, 0xE0, 0x5B, 0x04, 0xE4, 0xC3, 0xC0, 0xE1, + 0xCF, 0x73, 0x2F, 0x41, 0x14, 0xE0, 0x6F, 0xC3, + 0xEC, 0xEA, 0x8B, 0x07, 0x0C, 0xB8, 0x4B, 0xC2, + 0xA0, 0xC2, 0xF4, 0x07, 0x8C, 0x07, 0x08, 0x00, + 0xBD, 0xC0, 0xA0, 0xC3, 0xEA, 0x07, 0xE0, 0xC3, + 0xEC, 0x07, 0xA0, 0x06, 0x00, 0xBA, 0xC0, 0x01, + 0x00, 0x40, 0x02, 0xD8, 0x17, 0x01, 0x62, 0x02, + 0x80, 0xFF, 0xA0, 0x06, 0x54, 0xBA, 0x02, 0xC8, + 0x04, 0x01, 0x90, 0x03, 0x3F, 0x60, 0x59, 0x04, + 0xC0, 0xC3, 0xCF, 0x73, 0xEF, 0xC3, 0xC0, 0xE1, + 0xCF, 0x73, 0xAF, 0xC3, 0xDE, 0xEA, 0x9E, 0xC3, + 0x4E, 0x02, 0x0F, 0x00, 0x2E, 0x21, 0x14, 0xE0, + 0x08, 0x13, 0x2F, 0x40, 0x14, 0xE0, 0xCF, 0xA3, + 0x2F, 0x04, 0xF0, 0xE2, 0x40, 0x01, 0x00, 0x40, + 0xA4, 0x13, 0xC4, 0xC3, 0xC7, 0x16, 0x00, 0x01, + 0xFE, 0x00, 0xE6, 0x16, 0x9E, 0x10, 0x40, 0x01, + 0x00, 0x40, 0x05, 0x16, 0x20, 0xE0, 0x14, 0xE0, + 0x65, 0x02, 0x00, 0x58, 0x96, 0x10, 0x20, 0xD8, + 0xDE, 0x07, 0x17, 0x01, 0x8F, 0x07, 0x86, 0xFF, + 0x0F, 0xC8, 0x04, 0x01, 0xC0, 0x01, 0x00, 0x40, + 0x45, 0x02, 0xFF, 0xA7, 0x8A, 0x10, 0x20, 0xC3, + 0xFE, 0x06, 0x20, 0x27, 0x38, 0xE3, 0x07, 0x13, + 0x20, 0x23, 0x22, 0xE0, 0x1A, 0x13, 0x65, 0x02, + 0xFF, 0xDF, 0x20, 0x40, 0x14, 0xE0, 0x20, 0xE0, + 0x16, 0xE0, 0x0C, 0xC8, 0xE6, 0x08, 0x8D, 0x07, + 0xE2, 0x08, 0x58, 0x04, 0x20, 0x48, 0x08, 0xE0, + 0xFE, 0x06, 0x20, 0xC3, 0xE6, 0x08, 0x20, 0x27, + 0x38, 0xE3, 0x19, 0x16, 0x80, 0x03, 0x02, 0xC3, + 0x6C, 0xC2, 0x0A, 0x00, 0x99, 0x06, 0x60, 0x04, + 0x0C, 0xB8, 0xA0, 0xC2, 0xF4, 0x07, 0x8C, 0x07, + 0x01, 0x00, 0x8D, 0x07, 0x06, 0x06, 0xCE, 0x04, + 0xE0, 0xC3, 0x08, 0x06, 0x01, 0x13, 0x97, 0x06, + 0x20, 0xD8, 0x07, 0x06, 0x17, 0x01, 0x8B, 0x07, + 0x82, 0xFF, 0x0B, 0xC8, 0x04, 0x01, 0xA0, 0x06, + 0xB4, 0xBE, 0x60, 0x04, 0x0C, 0xB8, 0xA0, 0xC2, + 0xEE, 0x07, 0x8C, 0x07, 0x06, 0x00, 0x8D, 0x07, + 0xEE, 0x08, 0xA0, 0xC3, 0xE6, 0x07, 0xE0, 0xC3, + 0xE8, 0x07, 0x97, 0x06, 0xA0, 0xC2, 0xF4, 0x07, + 0x8D, 0x07, 0xF4, 0x08, 0xDD, 0x04, 0x8C, 0x07, + 0x02, 0x00, 0x97, 0x06, 0x8D, 0x07, 0x00, 0x80, + 0xA0, 0xC2, 0xEE, 0x08, 0x0A, 0x88, 0x0C, 0x06, + 0x14, 0x1B, 0x82, 0x07, 0xD0, 0xB9, 0xA0, 0xC3, + 0xF0, 0x08, 0xE0, 0xC3, 0xF2, 0x08, 0x8B, 0x07, + 0x0C, 0xE3, 0x8A, 0x02, 0x14, 0x00, 0x04, 0x1A, + 0x8B, 0x07, 0xBA, 0xEA, 0x2A, 0x02, 0xEC, 0xFF, + 0x8A, 0xA2, 0xCA, 0xA2, 0xDB, 0xC2, 0x01, 0x13, + 0x9B, 0x06, 0x20, 0xC8, 0xEE, 0x08, 0xF2, 0x08, + 0x20, 0xC8, 0x20, 0xE0, 0xEE, 0x08, 0x0D, 0xC8, + 0xF0, 0x08, 0x8D, 0x07, 0xEC, 0x08, 0x20, 0xE0, + 0x18, 0xE0, 0x65, 0x02, 0x00, 0x58, 0x58, 0x04, + 0x45, 0x02, 0xFF, 0xA7, 0x80, 0x03, 0x60, 0xC0, + 0xEE, 0x05, 0x21, 0x02, 0xE8, 0x03, 0x20, 0x01, + 0x02, 0x01, 0x06, 0x00, 0x07, 0x16, 0x01, 0x88, + 0xEE, 0x05, 0xF9, 0x16, 0x39, 0x10, 0x60, 0xD0, + 0x03, 0x01, 0xF1, 0x13, 0x01, 0x02, 0x0A, 0x01, + 0x4C, 0xCC, 0x4C, 0xCC, 0x4E, 0xCC, 0x4F, 0xCC, + 0xB1, 0x07, 0x40, 0x00, 0x4D, 0xCC, 0x0A, 0xC8, + 0x00, 0x01, 0x5B, 0x04, 0x60, 0xC0, 0xEE, 0x05, + 0x21, 0x02, 0xE8, 0x03, 0x20, 0x01, 0x02, 0x01, + 0x06, 0x00, 0x07, 0x16, 0x01, 0x88, 0xEE, 0x05, + 0xF9, 0x16, 0x1E, 0x10, 0x60, 0xD0, 0x03, 0x01, + 0xF1, 0x13, 0x01, 0x02, 0x0A, 0x01, 0x4C, 0xCC, + 0x4C, 0xCC, 0x4E, 0xCC, 0x4F, 0xCC, 0xB1, 0x07, + 0x40, 0x00, 0x4D, 0xCC, 0x0A, 0xC8, 0x00, 0x01, + 0xA0, 0x03, 0x60, 0xD0, 0x03, 0x01, 0x01, 0x13, + 0x5B, 0x04, 0x60, 0xC0, 0xEE, 0x05, 0x21, 0x02, + 0xE8, 0x03, 0x20, 0x01, 0x02, 0x01, 0x06, 0x00, + 0xF7, 0x16, 0x01, 0x88, 0xEE, 0x05, 0xF9, 0x16, + 0xCD, 0x04, 0x8A, 0x07, 0x00, 0x40, 0x20, 0xC3, + 0x00, 0x01, 0x0C, 0x01, 0x00, 0x80, 0x02, 0x13, + 0x8A, 0x07, 0x00, 0x20, 0xA0, 0xC3, 0x0E, 0x01, + 0xE0, 0xC3, 0x10, 0x01, 0xB0, 0x03, 0x20, 0xC3, + 0x58, 0x07, 0x20, 0x23, 0x04, 0xE0, 0x02, 0x13, + 0x60, 0x04, 0x8E, 0xB7, 0x60, 0x04, 0x8A, 0xA3, + 0x8D, 0x07, 0x00, 0x20, 0x20, 0x20, 0x0A, 0xE0, + 0x01, 0x16, 0x5B, 0x04, 0x0D, 0x02, 0x32, 0x0C, + 0x5D, 0xC2, 0x01, 0x11, 0xDD, 0x04, 0xCD, 0x05, + 0x0D, 0x88, 0x30, 0x0C, 0xF9, 0x16, 0x60, 0xC2, + 0x0A, 0x06, 0x8D, 0x07, 0x6A, 0x09, 0xA0, 0x06, + 0xF4, 0xBE, 0x09, 0x02, 0x48, 0x00, 0xE0, 0xC3, + 0x30, 0x09, 0x03, 0x16, 0xE0, 0x01, 0x6A, 0x09, + 0x10, 0x00, 0xE0, 0xC2, 0x6A, 0x09, 0x0F, 0x02, + 0x00, 0x01, 0xC9, 0x26, 0x02, 0x13, 0x60, 0x04, + 0x86, 0xBD, 0x09, 0x02, 0x00, 0x12, 0x4B, 0x01, + 0x10, 0x00, 0x02, 0x13, 0x09, 0x02, 0x00, 0x13, + 0x09, 0xD8, 0x2E, 0x09, 0x8F, 0x07, 0x00, 0x40, + 0x89, 0x07, 0x6C, 0x09, 0xCB, 0x04, 0xF9, 0xE2, + 0xF9, 0xE2, 0xF9, 0xE2, 0x07, 0x16, 0x8B, 0x07, + 0x34, 0x09, 0x8C, 0x07, 0x6C, 0x09, 0x3B, 0xCF, + 0x3B, 0xCF, 0x1B, 0xC7, 0x20, 0xC3, 0x6C, 0x09, + 0x19, 0x11, 0x8F, 0x07, 0x00, 0x20, 0x89, 0x07, + 0x7A, 0x09, 0xA0, 0x06, 0x3A, 0xBB, 0xA0, 0x06, + 0x3A, 0xBB, 0x12, 0x10, 0x4C, 0xCE, 0x5B, 0x04, + 0x19, 0xC3, 0x02, 0x16, 0x8C, 0x07, 0x1A, 0x00, + 0x4C, 0xC3, 0x2D, 0x02, 0xF8, 0xFF, 0x0A, 0x02, + 0x09, 0x00, 0x2D, 0x02, 0xFA, 0xFF, 0xF2, 0x13, + 0x0A, 0x06, 0xFB, 0x16, 0x60, 0x04, 0x86, 0xBD, + 0x8F, 0x07, 0x00, 0x10, 0xD9, 0xC2, 0xFA, 0x11, + 0x02, 0x16, 0x8B, 0x07, 0x00, 0x04, 0x4B, 0xC3, + 0x8D, 0x02, 0x20, 0x00, 0x02, 0x14, 0x0D, 0x02, + 0x20, 0x00, 0x8D, 0x02, 0x00, 0x04, 0x02, 0x12, + 0x0D, 0x02, 0x00, 0x04, 0x2D, 0x02, 0xF8, 0xFF, + 0x0D, 0xC8, 0x2C, 0x09, 0x2B, 0x02, 0xFF, 0x03, + 0x8B, 0x01, 0xFF, 0x03, 0x4B, 0xCE, 0x60, 0xC3, + 0x6A, 0x09, 0x60, 0x23, 0x18, 0xE0, 0x0C, 0x16, + 0x49, 0xC3, 0xDD, 0xC2, 0x0F, 0x02, 0x01, 0x01, + 0x8B, 0x01, 0x80, 0xC0, 0xD7, 0x16, 0x8F, 0x05, + 0xED, 0xC2, 0x02, 0x00, 0xD3, 0x16, 0x02, 0x10, + 0x8D, 0x07, 0xBA, 0xEA, 0x3D, 0xC8, 0xA8, 0x09, + 0x1D, 0xC8, 0xAA, 0x09, 0xCB, 0x04, 0xE0, 0x04, + 0xF8, 0x05, 0xE0, 0x04, 0x66, 0x09, 0x20, 0xC8, + 0x30, 0x0C, 0x80, 0x09, 0xA0, 0x07, 0x82, 0x09, + 0xFE, 0xDF, 0x8D, 0x07, 0xFE, 0xDF, 0xE0, 0xC3, + 0xD8, 0x07, 0xE0, 0x23, 0x16, 0xE0, 0x24, 0x16, + 0xE0, 0xC3, 0x30, 0x0C, 0x4F, 0x63, 0xFF, 0x04, + 0xFF, 0x04, 0x4D, 0x06, 0xFD, 0x16, 0x8D, 0x07, + 0xFE, 0xDF, 0x20, 0x04, 0xA2, 0xEA, 0xA0, 0xC3, + 0xA2, 0xEA, 0xEE, 0xC3, 0x12, 0x00, 0xAA, 0x16, + 0x6E, 0xC3, 0x18, 0x00, 0xAD, 0x09, 0x8C, 0x07, + 0x00, 0xE0, 0xAC, 0x09, 0x0D, 0x63, 0x0C, 0x13, + 0x6E, 0xC3, 0x18, 0x00, 0xAD, 0x09, 0x2D, 0x02, + 0x40, 0x00, 0x1D, 0x0A, 0x2D, 0x02, 0x32, 0x0C, + 0xBD, 0x07, 0xFF, 0x7F, 0x0C, 0x06, 0xFC, 0x16, + 0x20, 0xC3, 0x46, 0x04, 0x8C, 0x02, 0x80, 0x00, + 0x13, 0x1A, 0xAC, 0x02, 0x0C, 0xC8, 0x9A, 0x00, + 0xE0, 0x02, 0x80, 0x00, 0x88, 0x07, 0x80, 0x00, + 0x60, 0xC2, 0x46, 0x04, 0xA0, 0x06, 0x28, 0xAD, + 0x02, 0x10, 0x9D, 0x00, 0x05, 0x10, 0x9D, 0x00, + 0x8F, 0x07, 0x00, 0x08, 0x60, 0x04, 0x86, 0xBD, + 0x4B, 0x2D, 0x81, 0xC3, 0xC9, 0x05, 0x8F, 0x07, + 0x00, 0x10, 0x8E, 0x02, 0x02, 0x00, 0xF6, 0x11, + 0x8F, 0x07, 0x00, 0x04, 0xC9, 0x05, 0xD9, 0xC2, + 0xE0, 0x26, 0x26, 0xE0, 0x02, 0x16, 0x2B, 0x02, + 0x06, 0x00, 0x4B, 0xC6, 0x4B, 0xC3, 0xCB, 0x72, + 0x2E, 0x02, 0xFE, 0xFF, 0x8B, 0x83, 0xE6, 0x1B, + 0xCD, 0x06, 0x4D, 0x73, 0xCD, 0x82, 0xE2, 0x1B, + 0xE0, 0x04, 0x1A, 0x09, 0xE0, 0x04, 0x1C, 0x09, + 0x4D, 0xC3, 0x02, 0x13, 0x60, 0x66, 0x12, 0xE0, + 0xC9, 0x05, 0xCF, 0x04, 0x81, 0x2D, 0x01, 0xC8, + 0x6C, 0x01, 0xD4, 0x13, 0x0F, 0xC8, 0x00, 0xFC, + 0xC1, 0xC3, 0x0D, 0x06, 0xF7, 0x15, 0x0D, 0x02, + 0x36, 0x07, 0x0E, 0x02, 0x98, 0x08, 0x0C, 0x02, + 0x03, 0x00, 0x8D, 0xCB, 0x02, 0x00, 0x81, 0x2D, + 0x81, 0xCB, 0x06, 0x00, 0xC3, 0x13, 0xEE, 0x04, + 0x0C, 0x00, 0x2E, 0x02, 0x18, 0x00, 0x0C, 0x06, + 0xF4, 0x16, 0xE0, 0x04, 0x96, 0x08, 0x1F, 0x2E, + 0xB9, 0xC3, 0xD9, 0xC3, 0x89, 0x07, 0x12, 0x00, + 0x8D, 0x07, 0x3A, 0x09, 0xA0, 0x06, 0xF4, 0xBE, + 0x60, 0xC3, 0xD8, 0x07, 0x60, 0x23, 0x16, 0xE0, + 0x09, 0x16, 0x20, 0xE8, 0x10, 0xE0, 0x6A, 0x09, + 0x20, 0xE8, 0x18, 0xE0, 0x98, 0x07, 0x20, 0xE8, + 0x12, 0xE0, 0x78, 0x07, 0x60, 0xC3, 0x6A, 0x09, + 0x60, 0x23, 0x1E, 0xE0, 0x03, 0x16, 0x20, 0x48, + 0xA4, 0xE3, 0x6A, 0x09, 0x60, 0x23, 0x22, 0xE0, + 0x06, 0x13, 0x60, 0x27, 0xA6, 0xE3, 0x03, 0x13, + 0x20, 0xE8, 0x10, 0xE0, 0x6A, 0x09, 0x20, 0x2D, + 0x00, 0x00, 0x8E, 0x07, 0x00, 0x00, 0xA0, 0x06, + 0xD4, 0xBE, 0x4E, 0x05, 0x0E, 0x2C, 0xA0, 0xC0, + 0x04, 0x08, 0xEF, 0xC3, 0x06, 0x00, 0x1B, 0x16, + 0xA0, 0xC3, 0x72, 0x09, 0xE0, 0xC3, 0x74, 0x09, + 0xA0, 0x06, 0xC2, 0xBD, 0xA0, 0xC3, 0x76, 0x09, + 0xE0, 0xC3, 0x78, 0x09, 0xA0, 0x06, 0xE0, 0xBD, + 0x20, 0xE0, 0x0A, 0xE0, 0x60, 0xC3, 0xD8, 0x07, + 0x60, 0x23, 0x16, 0xE0, 0x05, 0x16, 0xE0, 0x04, + 0x2E, 0x06, 0x60, 0x41, 0x04, 0xE0, 0x4D, 0x2E, + 0x8D, 0x07, 0x00, 0x80, 0x52, 0x04, 0xCF, 0x73, + 0x2F, 0x02, 0x00, 0x02, 0x4F, 0xC3, 0x52, 0x04, + 0x20, 0x20, 0x0A, 0xE0, 0x03, 0x13, 0x8D, 0x07, + 0x00, 0x10, 0x5B, 0x04, 0x20, 0x40, 0x0A, 0xE0, + 0x40, 0x02, 0xFF, 0xF0, 0x8E, 0x07, 0x02, 0x00, + 0xA0, 0x06, 0xD4, 0xBE, 0x4E, 0x05, 0x0E, 0x2C, + 0xA0, 0xC0, 0x04, 0x08, 0xA0, 0x06, 0xB4, 0xBE, + 0x60, 0xC3, 0xD8, 0x07, 0x60, 0x23, 0x16, 0xE0, + 0x66, 0x16, 0x20, 0x04, 0xB6, 0xEA, 0x63, 0x10, + 0x6E, 0x02, 0x00, 0x80, 0x8D, 0x07, 0x00, 0xC0, + 0x0D, 0xC8, 0xA6, 0x01, 0x0E, 0xC8, 0x72, 0x09, + 0x0F, 0xC8, 0x74, 0x09, 0x0E, 0xC8, 0xA8, 0x01, + 0x0F, 0xC8, 0xAA, 0x01, 0x12, 0x10, 0x8F, 0x01, + 0x01, 0x00, 0x8A, 0x07, 0x76, 0x09, 0xA0, 0xE3, + 0x4E, 0x09, 0x8E, 0xCE, 0x9A, 0x01, 0xFE, 0xFF, + 0xE0, 0xE3, 0x50, 0x09, 0x8F, 0xE6, 0x8A, 0x07, + 0xAC, 0x01, 0x8E, 0xCE, 0x9A, 0x01, 0xFE, 0xFF, + 0x8F, 0xE6, 0x20, 0x20, 0x0A, 0xE0, 0x3F, 0x13, + 0x8D, 0x07, 0x00, 0x10, 0x5B, 0x04, 0x20, 0x20, + 0x0A, 0xE0, 0x03, 0x13, 0x0D, 0x02, 0x00, 0x10, + 0x5B, 0x04, 0x8E, 0xC3, 0x04, 0x13, 0xE0, 0x01, + 0x50, 0x09, 0x00, 0x01, 0x06, 0x10, 0xA0, 0x01, + 0x50, 0x09, 0x00, 0x01, 0xA0, 0x01, 0x78, 0x09, + 0x00, 0x01, 0xA0, 0xC3, 0x76, 0x09, 0xE0, 0xC3, + 0x78, 0x09, 0xA0, 0xE3, 0x4E, 0x09, 0xE0, 0xE3, + 0x50, 0x09, 0x0E, 0xC8, 0xAC, 0x01, 0x0F, 0xC8, + 0xAE, 0x01, 0x0E, 0xC8, 0x76, 0x09, 0x0F, 0xC8, + 0x78, 0x09, 0x19, 0x10, 0x6E, 0x02, 0x00, 0x80, + 0x0E, 0xC8, 0xA6, 0x01, 0x20, 0x20, 0x0A, 0xE0, + 0x12, 0x13, 0x0D, 0x02, 0x00, 0x10, 0x5B, 0x04, + 0x8D, 0x07, 0x28, 0x07, 0x89, 0x07, 0x0E, 0x00, + 0xA0, 0x06, 0xFA, 0xBE, 0x8D, 0x07, 0x28, 0x07, + 0xFD, 0x04, 0x8D, 0x02, 0x36, 0x07, 0xFC, 0x16, + 0x20, 0x48, 0x14, 0xE0, 0xFE, 0x06, 0x8D, 0x07, + 0x00, 0x80, 0x52, 0x04, 0xA0, 0xC2, 0xEE, 0x07, + 0x8C, 0x07, 0x04, 0x00, 0x8D, 0x07, 0xF0, 0x08, + 0x97, 0x06, 0x7D, 0xC2, 0x5D, 0xC3, 0x60, 0x43, + 0x22, 0xE0, 0xA0, 0x06, 0xFA, 0xBE, 0xEF, 0x10, + 0x0E, 0xC8, 0x06, 0x06, 0x0F, 0xC8, 0x08, 0x06, + 0xEA, 0x10, 0xB0, 0x03, 0xA0, 0x01, 0x60, 0x07, + 0x26, 0x00, 0x40, 0x02, 0x00, 0xC0, 0xE0, 0x04, + 0x06, 0x06, 0x8C, 0x07, 0x10, 0x40, 0xCC, 0x44, + 0xE0, 0x04, 0xFE, 0x06, 0x85, 0x07, 0x40, 0x80, + 0x5B, 0x04, 0x02, 0xC8, 0x04, 0x08, 0x8F, 0x07, + 0xFA, 0x07, 0xCE, 0xCB, 0x02, 0x00, 0x8E, 0x07, + 0x36, 0x07, 0xCE, 0xCB, 0x04, 0x00, 0x8D, 0x07, + 0x30, 0x06, 0x8E, 0x07, 0x10, 0x00, 0x4D, 0x2C, + 0x5B, 0x04, 0xA0, 0xC2, 0xF2, 0x07, 0x02, 0x10, + 0xA0, 0xC2, 0xF8, 0x07, 0x0B, 0xC8, 0xEA, 0x08, + 0x09, 0xC3, 0x0A, 0x13, 0xA0, 0x06, 0x36, 0xBA, + 0xA0, 0xC2, 0x00, 0x01, 0xA0, 0xE2, 0x06, 0xE0, + 0x4C, 0xA3, 0xCC, 0xA3, 0x01, 0x17, 0x8E, 0x05, + 0x4C, 0x62, 0xE0, 0xC2, 0xEA, 0x08, 0x5B, 0x04, + 0x8D, 0x07, 0x00, 0x10, 0x20, 0x20, 0x0A, 0xE0, + 0x01, 0x13, 0x5B, 0x04, 0x0D, 0x02, 0x48, 0x00, + 0xE0, 0xC3, 0x30, 0x09, 0x02, 0x16, 0xCE, 0x01, + 0x10, 0x00, 0x8D, 0x27, 0x03, 0x13, 0x0D, 0x02, + 0x00, 0x01, 0x52, 0x04, 0x00, 0x03, 0x02, 0x00, + 0x60, 0xC3, 0x6A, 0x09, 0x4D, 0x02, 0x08, 0x80, + 0x4E, 0x02, 0xF7, 0x7F, 0x8D, 0xE3, 0xE0, 0xC3, + 0xD8, 0x07, 0xE0, 0x23, 0x16, 0xE0, 0x04, 0x13, + 0x8D, 0x07, 0x06, 0x00, 0x8D, 0x27, 0x02, 0x13, + 0xA0, 0xE3, 0x10, 0xE0, 0x0E, 0xC8, 0x6A, 0x09, + 0x60, 0x01, 0x8E, 0x09, 0x00, 0x80, 0x09, 0x13, + 0x0D, 0x02, 0x00, 0x12, 0x4E, 0x01, 0x10, 0x00, + 0x02, 0x13, 0x0D, 0x02, 0x00, 0x13, 0x0D, 0xD8, + 0x2E, 0x09, 0x60, 0xC3, 0x80, 0x01, 0x4E, 0x02, + 0x01, 0x00, 0x4D, 0x02, 0xFE, 0xFF, 0x4E, 0xE3, + 0x0D, 0xC8, 0x80, 0x01, 0x20, 0xD8, 0x40, 0xE2, + 0x2F, 0x09, 0x20, 0x01, 0x6A, 0x09, 0x06, 0x00, + 0x03, 0x13, 0x20, 0xD8, 0xD0, 0xE1, 0x2F, 0x09, + 0x20, 0x98, 0x83, 0x01, 0x00, 0xE2, 0x03, 0x13, + 0x20, 0xD8, 0x2F, 0x09, 0x83, 0x01, 0x00, 0x03, + 0x0F, 0x00, 0x60, 0x04, 0x88, 0xBE, 0x20, 0x20, + 0x0A, 0xE0, 0x03, 0x13, 0x0D, 0x02, 0x00, 0x10, + 0x5B, 0x04, 0x09, 0x02, 0x08, 0x00, 0x0D, 0x02, + 0x58, 0x09, 0xA0, 0x06, 0xF4, 0xBE, 0xA0, 0x07, + 0x02, 0x02, 0x00, 0x00, 0x0D, 0x02, 0x00, 0x04, + 0xE0, 0xC3, 0x58, 0x09, 0x0F, 0x01, 0x00, 0x7C, + 0x01, 0x13, 0x52, 0x04, 0x8F, 0xC3, 0x4E, 0x02, + 0x0F, 0x00, 0xFB, 0x13, 0x8E, 0x02, 0x0F, 0x00, + 0xF8, 0x13, 0x0D, 0x02, 0x00, 0x40, 0x4F, 0xC2, + 0x49, 0x09, 0x49, 0x02, 0x3F, 0x00, 0x09, 0x01, + 0x01, 0x00, 0xEF, 0x16, 0x89, 0x02, 0x06, 0x00, + 0xEC, 0x1A, 0x89, 0x02, 0x20, 0x00, 0xE9, 0x14, + 0xC9, 0x06, 0x1F, 0x09, 0x4F, 0x02, 0x00, 0x40, + 0x4F, 0xE2, 0x69, 0x02, 0x00, 0x80, 0x09, 0xC8, + 0x58, 0x09, 0x0F, 0x02, 0xFF, 0xFF, 0x4E, 0xC2, + 0x1F, 0x09, 0x09, 0x06, 0xFD, 0x16, 0x4F, 0x05, + 0x0D, 0x02, 0x00, 0x20, 0x60, 0xC2, 0x5A, 0x09, + 0xD4, 0x13, 0x4F, 0x26, 0xD2, 0x16, 0x0D, 0x02, + 0x00, 0x10, 0x60, 0xC2, 0x5C, 0x09, 0xCD, 0x13, + 0x4F, 0x26, 0xCB, 0x16, 0x0D, 0x02, 0x00, 0x30, + 0x20, 0x88, 0x5A, 0x09, 0x5C, 0x09, 0xC5, 0x13, + 0xE0, 0xC3, 0x5A, 0x09, 0x4E, 0xC2, 0x1F, 0x0A, + 0x09, 0x06, 0xFD, 0x16, 0xE0, 0xE3, 0x5E, 0x09, + 0x0F, 0xC8, 0x5A, 0x09, 0xE0, 0xC3, 0x5C, 0x09, + 0x4E, 0xC2, 0x1F, 0x0A, 0x09, 0x06, 0xFD, 0x16, + 0xE0, 0xE3, 0x5E, 0x09, 0x0F, 0xC8, 0x5C, 0x09, + 0x0F, 0x02, 0xFF, 0xFF, 0x4E, 0xC2, 0x1F, 0x0A, + 0x09, 0x06, 0xFD, 0x16, 0x0D, 0x02, 0x00, 0x08, + 0x60, 0xC2, 0x5E, 0x09, 0x4F, 0x26, 0xA5, 0x16, + 0x4F, 0x05, 0x0F, 0xC8, 0x5E, 0x09, 0x0F, 0x02, + 0x02, 0x02, 0x0E, 0x02, 0x03, 0x00, 0x60, 0xC3, + 0x40, 0x01, 0x0C, 0x02, 0xFE, 0xC0, 0xA0, 0x01, + 0x40, 0x01, 0x00, 0x04, 0xCF, 0x05, 0x09, 0x02, + 0x55, 0x55, 0x9C, 0x06, 0x49, 0x05, 0x9C, 0x06, + 0x09, 0x07, 0x9C, 0x06, 0x49, 0x05, 0x9C, 0x06, + 0x0E, 0x06, 0xF4, 0x16, 0xA0, 0x01, 0x40, 0x01, + 0x00, 0x40, 0x0D, 0xC8, 0x40, 0x01, 0x09, 0x02, + 0x08, 0x00, 0x0E, 0x02, 0x58, 0x09, 0x0F, 0x02, + 0x02, 0x02, 0xFE, 0xCF, 0x49, 0x06, 0xFD, 0x16, + 0x60, 0x04, 0x88, 0xBE, 0xC9, 0xC7, 0x5F, 0x82, + 0x01, 0x16, 0x5B, 0x04, 0xA0, 0x01, 0x40, 0x01, + 0x00, 0x40, 0x0D, 0xC8, 0x40, 0x01, 0x0D, 0x02, + 0x00, 0x01, 0x52, 0x04, 0x8D, 0x07, 0x00, 0x10, + 0x20, 0x20, 0x0A, 0xE0, 0x0A, 0x16, 0x8D, 0x07, + 0x00, 0x08, 0x20, 0x20, 0x10, 0xE0, 0x05, 0x13, + 0x8D, 0x07, 0x00, 0x40, 0x4F, 0x01, 0x01, 0x00, + 0x01, 0x16, 0x5B, 0x04, 0x20, 0xE0, 0x10, 0xE0, + 0x20, 0x07, 0x9C, 0x08, 0x20, 0x07, 0xB4, 0x08, + 0x20, 0x07, 0xCC, 0x08, 0xA0, 0x07, 0xA2, 0x08, + 0x84, 0x02, 0xA0, 0x07, 0xBA, 0x08, 0x84, 0x02, + 0xA0, 0x07, 0xD2, 0x08, 0x84, 0x02, 0xA0, 0x07, + 0x04, 0x09, 0x00, 0x40, 0xE0, 0x04, 0x06, 0x09, + 0xE0, 0x04, 0x08, 0x09, 0x0E, 0xC8, 0x4C, 0x08, + 0x0F, 0xC8, 0x4E, 0x08, 0x0E, 0xC8, 0x8E, 0x08, + 0x0F, 0xC8, 0x90, 0x08, 0xE0, 0x04, 0x5A, 0x08, + 0xE0, 0x04, 0x60, 0x08, 0xE0, 0x02, 0x78, 0x07, + 0xE0, 0x04, 0x94, 0x08, 0x20, 0x40, 0x40, 0xE3, + 0x20, 0xE0, 0x0C, 0xE0, 0x60, 0x04, 0xBC, 0xC6, + 0x80, 0x01, 0x00, 0xF0, 0xC0, 0x01, 0x00, 0x40, + 0x10, 0x10, 0x80, 0x01, 0x00, 0xF0, 0x0D, 0x10, + 0xC0, 0x01, 0x00, 0xF0, 0x20, 0x40, 0x06, 0xE0, + 0x08, 0x10, 0xC0, 0x01, 0x00, 0xF0, 0x80, 0x01, + 0x00, 0x20, 0xE0, 0xC3, 0x94, 0x08, 0x01, 0x16, + 0x5B, 0x04, 0x4B, 0xC0, 0x20, 0x04, 0xDA, 0xEA, + 0x40, 0x01, 0x00, 0x20, 0xFB, 0x16, 0x51, 0x04, + 0xA0, 0xC2, 0xD8, 0x07, 0x4A, 0x01, 0x40, 0x00, + 0x01, 0x16, 0x5B, 0x04, 0xE0, 0x02, 0x78, 0x07, + 0x20, 0x20, 0x0C, 0xE0, 0xEF, 0x16, 0x43, 0xC2, + 0x02, 0x13, 0xA0, 0x06, 0x1A, 0xC3, 0x20, 0x2F, + 0x36, 0x07, 0x20, 0x40, 0x0C, 0xE0, 0xA0, 0x06, + 0xAC, 0xC1, 0xA0, 0xC3, 0x94, 0x08, 0xFB, 0x16, + 0xA0, 0x06, 0x3A, 0xC2, 0x8E, 0x07, 0x04, 0x09, + 0x9E, 0x07, 0x00, 0x80, 0x20, 0x20, 0x10, 0xE0, + 0x05, 0x16, 0x8F, 0x07, 0x4C, 0x08, 0xBF, 0xCF, + 0xBF, 0xCF, 0x9F, 0xC7, 0xA0, 0x06, 0x5A, 0xC2, + 0x20, 0xE8, 0x3C, 0xE3, 0x62, 0x07, 0xA0, 0x06, + 0x3A, 0xC2, 0x20, 0x48, 0x3C, 0xE3, 0x62, 0x07, + 0x20, 0x40, 0x40, 0xE3, 0x20, 0xE0, 0x04, 0xE0, + 0x20, 0x48, 0x10, 0xE0, 0x58, 0x07, 0x5B, 0x04, + 0x80, 0x01, 0x00, 0xF0, 0x20, 0xE0, 0x04, 0xE0, + 0x60, 0x01, 0x60, 0x07, 0x02, 0x00, 0x02, 0x13, + 0x9B, 0x06, 0xB8, 0x10, 0x20, 0xE8, 0x1E, 0xE0, + 0x58, 0x07, 0xB4, 0x10, 0x9B, 0x06, 0x80, 0x03, + 0xE0, 0x02, 0x58, 0x07, 0x00, 0x01, 0x00, 0x40, + 0x07, 0x16, 0x8D, 0x07, 0x00, 0x09, 0xA0, 0x06, + 0x68, 0xB8, 0xE0, 0x02, 0x78, 0x07, 0x5B, 0x04, + 0xC4, 0x01, 0x02, 0x00, 0xE0, 0x02, 0x78, 0x07, + 0x5B, 0x04, 0x0E, 0x68, 0x96, 0x08, 0xE9, 0x04, + 0x0C, 0x00, 0x11, 0x10, 0x0E, 0x02, 0x00, 0x23, + 0x4E, 0xDB, 0x01, 0x00, 0xCC, 0x01, 0x00, 0x04, + 0x4C, 0xD7, 0x1C, 0x10, 0x60, 0xC2, 0x5C, 0x07, + 0x20, 0x06, 0x94, 0x08, 0xA9, 0xC2, 0x08, 0x00, + 0xA9, 0xC3, 0x0C, 0x00, 0xEA, 0x16, 0x29, 0x07, + 0x04, 0x00, 0x69, 0x01, 0x0A, 0x00, 0x01, 0x00, + 0x2D, 0x13, 0x49, 0xC3, 0x2D, 0x02, 0x0E, 0x00, + 0x0A, 0xC3, 0x1D, 0xD3, 0x8C, 0x01, 0x00, 0x84, + 0xCC, 0x01, 0x00, 0x40, 0x0A, 0x01, 0x00, 0x5E, + 0xDD, 0x16, 0x4C, 0xC7, 0xA9, 0xC3, 0x10, 0x00, + 0xE9, 0xC3, 0x12, 0x00, 0x41, 0xCA, 0x10, 0x00, + 0x2F, 0x02, 0x04, 0x00, 0x01, 0x17, 0x8E, 0x05, + 0x8C, 0x07, 0x02, 0x00, 0xA0, 0xC2, 0xF6, 0x07, + 0xA0, 0x06, 0x00, 0xBA, 0x69, 0xC0, 0x10, 0x00, + 0x29, 0xC8, 0x14, 0x00, 0x06, 0x09, 0x29, 0xC8, + 0x16, 0x00, 0x08, 0x09, 0x69, 0x01, 0x0E, 0x00, + 0x00, 0x08, 0x04, 0x16, 0x90, 0x03, 0x7F, 0x00, + 0xA0, 0x06, 0x5A, 0xC2, 0x40, 0x01, 0x00, 0x40, + 0x01, 0x16, 0x51, 0x04, 0x60, 0x04, 0xBE, 0xC1, + 0xA9, 0xC3, 0x0C, 0x00, 0x0B, 0x13, 0x0E, 0x68, + 0x96, 0x08, 0xE9, 0x04, 0x0C, 0x00, 0x29, 0xC8, + 0x06, 0x00, 0x6C, 0x01, 0xA0, 0xC3, 0x00, 0xFC, + 0x01, 0x13, 0x1E, 0x2E, 0x29, 0x07, 0x04, 0x00, + 0x5B, 0x04, 0x81, 0x07, 0x20, 0x20, 0x89, 0x07, + 0x4C, 0x08, 0x41, 0xCE, 0x63, 0xCE, 0x10, 0x00, + 0x63, 0xC6, 0x12, 0x00, 0xA0, 0x06, 0x54, 0xBA, + 0x43, 0xC2, 0x02, 0x13, 0xA0, 0x06, 0x1A, 0xC3, + 0x20, 0xE0, 0x10, 0xE0, 0x60, 0x04, 0xEC, 0xC1, + 0x40, 0x01, 0x00, 0x04, 0xEA, 0x16, 0xA0, 0x06, + 0xAC, 0xC1, 0xA0, 0xC2, 0xF0, 0x07, 0x8C, 0x07, + 0x04, 0x00, 0x8D, 0x07, 0x4C, 0x08, 0xA0, 0xC3, + 0x8E, 0x08, 0xE0, 0xC3, 0x90, 0x08, 0xA0, 0x06, + 0x36, 0xBA, 0xE0, 0xC3, 0x4E, 0x08, 0x4F, 0x01, + 0x01, 0x00, 0x13, 0x16, 0xE0, 0xC2, 0x94, 0x08, + 0xEA, 0x16, 0x60, 0x04, 0xEC, 0xC1, 0xE0, 0xC3, + 0x4E, 0x08, 0x4F, 0x01, 0x01, 0x00, 0x09, 0x16, + 0x60, 0x04, 0xEC, 0xC1, 0xA0, 0x06, 0x54, 0xBA, + 0xE0, 0xC3, 0x4E, 0x08, 0x4F, 0x01, 0x01, 0x00, + 0xD7, 0x13, 0xA0, 0xC2, 0xF0, 0x07, 0x20, 0xC3, + 0x7C, 0x09, 0x8D, 0x07, 0x4C, 0x08, 0x9D, 0xC3, + 0xA0, 0x06, 0x36, 0xBA, 0xC0, 0x06, 0x20, 0xD0, + 0x50, 0x08, 0xC0, 0x06, 0x40, 0x01, 0x00, 0x04, + 0x0A, 0x16, 0x40, 0x01, 0x80, 0x00, 0x07, 0x13, + 0x0E, 0xC8, 0x4C, 0x08, 0x0F, 0xC8, 0x4E, 0x08, + 0xA0, 0x06, 0xA2, 0xC1, 0xD8, 0x10, 0x0E, 0xC8, + 0x8E, 0x08, 0x0F, 0xC8, 0x90, 0x08, 0x40, 0x01, + 0x00, 0x04, 0x0C, 0x13, 0x40, 0x01, 0x20, 0x00, + 0x58, 0x16, 0x81, 0x07, 0x10, 0x20, 0x9F, 0x10, + 0xA0, 0x06, 0xAC, 0xC1, 0xA0, 0xC3, 0x8E, 0x08, + 0xE0, 0xC3, 0x90, 0x08, 0x83, 0x07, 0x98, 0x08, + 0x63, 0x07, 0x04, 0x00, 0x2D, 0x11, 0x83, 0x07, + 0xB0, 0x08, 0x63, 0x07, 0x04, 0x00, 0x28, 0x11, + 0x83, 0x07, 0xC8, 0x08, 0x63, 0x07, 0x04, 0x00, + 0x23, 0x11, 0xC3, 0x60, 0x60, 0xC2, 0x46, 0x07, + 0xE7, 0x13, 0x69, 0x01, 0x0E, 0x00, 0x00, 0x08, + 0xE3, 0x13, 0x00, 0x03, 0x02, 0x00, 0x19, 0xC8, + 0x46, 0x07, 0x03, 0x16, 0xA0, 0x01, 0x3A, 0x07, + 0x20, 0x00, 0x00, 0x03, 0x0F, 0x00, 0xC0, 0x01, + 0x00, 0xF0, 0x80, 0x01, 0x00, 0x20, 0x01, 0x02, + 0x06, 0xC4, 0x60, 0x04, 0x9A, 0xC2, 0x81, 0x07, + 0x80, 0x20, 0xE0, 0xC8, 0x8E, 0x08, 0x14, 0x00, + 0xE0, 0xC8, 0x90, 0x08, 0x16, 0x00, 0xC7, 0x10, + 0xE0, 0xC8, 0x50, 0x08, 0x0E, 0x00, 0xCE, 0xC8, + 0x10, 0x00, 0xCF, 0xC8, 0x12, 0x00, 0x40, 0x01, + 0x20, 0x00, 0xBB, 0x16, 0xE3, 0xC1, 0x06, 0x00, + 0xC7, 0xC8, 0x08, 0x00, 0x07, 0xC8, 0x6C, 0x01, + 0x07, 0xC8, 0xE0, 0x08, 0x08, 0x02, 0x02, 0xFC, + 0xB8, 0x07, 0x00, 0x81, 0xE0, 0xC1, 0xE8, 0x00, + 0x07, 0xCE, 0x20, 0xC8, 0x52, 0x08, 0x92, 0x08, + 0xDA, 0x13, 0xCE, 0xC8, 0x14, 0x00, 0xCF, 0xC8, + 0x16, 0x00, 0x80, 0x01, 0x00, 0x04, 0x82, 0x07, + 0x54, 0x08, 0x32, 0xC1, 0x08, 0x11, 0x72, 0xC1, + 0x92, 0xC1, 0x82, 0x07, 0x8A, 0x08, 0x04, 0xC1, + 0x07, 0x16, 0x60, 0x04, 0x8E, 0xC5, 0x72, 0xC1, + 0xB2, 0xC1, 0x84, 0x01, 0x00, 0x80, 0xF9, 0x13, + 0x04, 0x68, 0x92, 0x08, 0xC7, 0xC1, 0x37, 0x16, + 0x20, 0x98, 0x97, 0x08, 0x85, 0x09, 0x16, 0x16, + 0x81, 0x07, 0x40, 0x20, 0xE0, 0xC1, 0x94, 0x08, + 0x57, 0x13, 0xA0, 0x06, 0xAC, 0xC1, 0xF4, 0x10, + 0xE0, 0xC2, 0x3A, 0x07, 0xE0, 0x42, 0x62, 0x07, + 0xE0, 0x26, 0x3A, 0xE3, 0x02, 0x13, 0xA0, 0x06, + 0x92, 0xC1, 0xA0, 0x06, 0x54, 0xBA, 0x22, 0x10, + 0xA0, 0x06, 0x9C, 0xC1, 0x81, 0x2D, 0x01, 0xC2, + 0xFB, 0x13, 0xA0, 0x05, 0x96, 0x08, 0x23, 0xC8, + 0x08, 0x00, 0x6C, 0x01, 0xA0, 0x07, 0x02, 0xFC, + 0x00, 0x80, 0xC3, 0xC1, 0x27, 0x02, 0x06, 0x00, + 0xA0, 0x06, 0x0C, 0xB5, 0xA3, 0x05, 0x0C, 0x00, + 0x08, 0xC8, 0x6C, 0x01, 0x08, 0xC8, 0xE0, 0x08, + 0x08, 0x02, 0x02, 0xFC, 0xB8, 0x07, 0x00, 0x81, + 0xF8, 0xC1, 0x04, 0xC1, 0x37, 0x13, 0xE0, 0xD2, + 0x03, 0x01, 0xD2, 0x13, 0x0B, 0x02, 0x0A, 0x01, + 0xC4, 0xCE, 0xC7, 0xCE, 0xC5, 0xCE, 0xC6, 0xCE, + 0xFB, 0x04, 0x09, 0x02, 0x00, 0x04, 0x48, 0xA2, + 0xC9, 0xC6, 0x20, 0xA8, 0xE0, 0x08, 0x12, 0x01, + 0x20, 0xC8, 0xF2, 0x07, 0x00, 0x01, 0x47, 0xC2, + 0xC4, 0x81, 0x01, 0x14, 0x44, 0xC2, 0xC9, 0x61, + 0x09, 0xA2, 0x89, 0xA1, 0x01, 0x17, 0x85, 0x05, + 0x09, 0x61, 0xA8, 0x16, 0x82, 0x02, 0x8A, 0x08, + 0x05, 0x16, 0x40, 0x01, 0x10, 0x00, 0x12, 0x13, + 0x60, 0x04, 0xA6, 0xC3, 0x60, 0x04, 0xBC, 0xC4, + 0x60, 0x04, 0x40, 0xC3, 0x81, 0x07, 0x80, 0x20, + 0xFB, 0x10, 0x81, 0x07, 0x80, 0x20, 0xF8, 0x10, + 0x81, 0x07, 0x02, 0x20, 0xF5, 0x10, 0x81, 0x07, + 0x04, 0x20, 0xF2, 0x10, 0x23, 0xC8, 0x08, 0x00, + 0x6C, 0x01, 0x07, 0x05, 0xE0, 0xA1, 0xE8, 0x00, + 0x0C, 0x02, 0x04, 0xFC, 0x07, 0xCF, 0xE0, 0xC2, + 0x92, 0x08, 0xE8, 0x16, 0xE0, 0xD2, 0x03, 0x01, + 0x10, 0x16, 0xE0, 0xC2, 0x3A, 0x07, 0xE0, 0x42, + 0x62, 0x07, 0xE0, 0x26, 0x3A, 0xE3, 0x07, 0x13, + 0x90, 0x03, 0xC8, 0x2F, 0xA0, 0x06, 0x92, 0xC1, + 0xE0, 0xD2, 0x03, 0x01, 0x02, 0x16, 0xA0, 0x06, + 0x54, 0xBA, 0x23, 0xC8, 0x06, 0x00, 0x6C, 0x01, + 0xA3, 0xC2, 0x0E, 0x00, 0x4A, 0x01, 0x00, 0x01, + 0x0B, 0x13, 0x0C, 0x02, 0x0E, 0xFC, 0x5C, 0xC2, + 0x49, 0x02, 0x00, 0x80, 0x0D, 0x02, 0x6C, 0x09, + 0x7D, 0xE2, 0x09, 0xCF, 0x3D, 0xCF, 0x3D, 0xCF, + 0x0C, 0x02, 0x00, 0xFC, 0x6C, 0xC3, 0x06, 0x00, + 0x4D, 0x02, 0xFF, 0xE0, 0x4A, 0x02, 0x00, 0x02, + 0x8A, 0xA2, 0x8A, 0xA2, 0x4A, 0xE3, 0x60, 0xE3, + 0x9E, 0x09, 0x0D, 0xCB, 0x06, 0x00, 0xCD, 0x06, + 0x0B, 0x02, 0x0F, 0x00, 0xEC, 0x82, 0x04, 0x00, + 0xAD, 0x11, 0xEC, 0xC3, 0x0E, 0x00, 0x11, 0x15, + 0x10, 0x13, 0x6C, 0xC2, 0x14, 0x00, 0x49, 0x02, + 0x00, 0x1F, 0xA7, 0x13, 0xC9, 0x06, 0x89, 0x02, + 0x12, 0x00, 0xA3, 0x1B, 0x49, 0x01, 0x01, 0x00, + 0xA0, 0x13, 0xC9, 0xA2, 0xEC, 0x82, 0x04, 0x00, + 0x9C, 0x11, 0x4D, 0xA3, 0x9D, 0x18, 0x14, 0x11, + 0x60, 0x01, 0x6A, 0x09, 0x00, 0x80, 0x18, 0x13, + 0x1D, 0x09, 0xCC, 0xA2, 0xEB, 0xC2, 0x08, 0x00, + 0x7B, 0x09, 0x4B, 0x02, 0x1E, 0x00, 0xA0, 0xC3, + 0xF0, 0x06, 0xAB, 0x23, 0x04, 0xE0, 0x8F, 0x16, + 0x60, 0x27, 0x3E, 0xE3, 0x8C, 0x16, 0x4D, 0xA3, + 0x4D, 0xA3, 0x4D, 0xA3, 0xCD, 0x06, 0x4D, 0x02, + 0x07, 0x00, 0x0D, 0x88, 0xEE, 0x06, 0x0A, 0x15, + 0x90, 0x03, 0xFF, 0x6F, 0x53, 0x2F, 0xA0, 0x05, + 0x94, 0x08, 0xC3, 0x04, 0xC0, 0x01, 0x00, 0x04, + 0x60, 0x04, 0xAA, 0xC3, 0x60, 0x01, 0x6A, 0x09, + 0x00, 0x80, 0xF2, 0x13, 0x01, 0x02, 0x08, 0x20, + 0x60, 0x04, 0xA2, 0xC5, 0x8D, 0x07, 0x00, 0x10, + 0x20, 0x20, 0x0A, 0xE0, 0x0A, 0x16, 0x8D, 0x07, + 0x00, 0x08, 0x20, 0x20, 0x0E, 0xE0, 0x05, 0x13, + 0x8D, 0x07, 0x00, 0x40, 0x4F, 0x01, 0x01, 0x00, + 0x01, 0x16, 0x5B, 0x04, 0x20, 0xE0, 0x0E, 0xE0, + 0xA0, 0x07, 0xFA, 0x08, 0x00, 0x80, 0x0E, 0xC8, + 0xFA, 0x07, 0x0F, 0xC8, 0xFC, 0x07, 0x0E, 0xC8, + 0x3C, 0x08, 0x0F, 0xC8, 0x3E, 0x08, 0xE0, 0x04, + 0x08, 0x08, 0xE0, 0x04, 0x0E, 0x08, 0xE0, 0x02, + 0x98, 0x07, 0x20, 0x40, 0x4C, 0xE3, 0x20, 0x07, + 0x2E, 0x06, 0x60, 0x04, 0x12, 0xCA, 0x00, 0x70, + 0x4B, 0xC0, 0xE0, 0x04, 0x2E, 0x06, 0x0B, 0x10, + 0x20, 0xF0, 0x4B, 0xE3, 0x02, 0x10, 0x20, 0xF0, + 0x4A, 0xE3, 0x4B, 0xC0, 0xE0, 0x04, 0x2E, 0x06, + 0xE0, 0x01, 0x62, 0x07, 0x40, 0x00, 0x20, 0xE8, + 0x46, 0xE3, 0x62, 0x07, 0x20, 0x04, 0xDA, 0xEA, + 0x40, 0x01, 0x00, 0x20, 0x04, 0x13, 0xFA, 0x10, + 0x40, 0x01, 0x00, 0x40, 0xF7, 0x16, 0x20, 0x07, + 0x2E, 0x06, 0x20, 0x50, 0x50, 0xE3, 0x51, 0x04, + 0xF1, 0x10, 0xE0, 0x02, 0x58, 0x07, 0x00, 0x01, + 0x00, 0x40, 0x07, 0x16, 0x8D, 0x07, 0xF6, 0x08, + 0xA0, 0x06, 0x68, 0xB8, 0xE0, 0x02, 0x98, 0x07, + 0x5B, 0x04, 0xC4, 0x01, 0x04, 0x00, 0xE0, 0x02, + 0x98, 0x07, 0x5B, 0x04, 0x60, 0x01, 0x60, 0x07, + 0x04, 0x00, 0x06, 0x16, 0x20, 0xE8, 0x1C, 0xE0, + 0x58, 0x07, 0x80, 0x03, 0xE0, 0x02, 0x98, 0x07, + 0x20, 0xD8, 0xDC, 0x07, 0x17, 0x01, 0x8F, 0x07, + 0x8E, 0xFF, 0x0F, 0xC8, 0x04, 0x01, 0x20, 0xE8, + 0x06, 0xE0, 0x58, 0x07, 0x80, 0x01, 0x00, 0x80, + 0x5B, 0x04, 0xE0, 0xC2, 0x4A, 0x08, 0xC3, 0x82, + 0x03, 0x13, 0xDB, 0x2D, 0x03, 0xC8, 0x4A, 0x08, + 0x49, 0x01, 0x00, 0x01, 0x02, 0x16, 0x60, 0x04, + 0x52, 0xC9, 0xE0, 0xC0, 0xF8, 0x05, 0xFD, 0x13, + 0x03, 0xC8, 0x6C, 0x01, 0x20, 0xC8, 0x00, 0xFC, + 0xF8, 0x05, 0x88, 0x07, 0x02, 0xFC, 0x78, 0xC2, + 0xF8, 0xC1, 0x28, 0x02, 0x00, 0x04, 0x49, 0x01, + 0x00, 0x01, 0x4D, 0x16, 0x09, 0x01, 0x00, 0x5E, + 0x29, 0x16, 0x49, 0x01, 0x02, 0x00, 0x0B, 0x16, + 0x60, 0x01, 0x46, 0x08, 0x00, 0x02, 0x0A, 0x16, + 0x27, 0x02, 0x04, 0x00, 0x07, 0x88, 0x7E, 0x09, + 0x05, 0x12, 0x27, 0x02, 0xFC, 0xFF, 0xA0, 0x01, + 0x46, 0x08, 0x00, 0x02, 0xC7, 0xC1, 0x37, 0x15, + 0xD3, 0x2D, 0xE0, 0xC0, 0x4A, 0x08, 0x07, 0xA8, + 0x48, 0x08, 0x07, 0xA8, 0x44, 0x08, 0x0C, 0x15, + 0x20, 0xC8, 0x3C, 0x08, 0xFA, 0x07, 0x20, 0xC8, + 0x3E, 0x08, 0xFC, 0x07, 0x20, 0xC8, 0x40, 0x08, + 0x3C, 0x08, 0x20, 0xC8, 0x42, 0x08, 0x3E, 0x08, + 0x60, 0x04, 0x52, 0xC9, 0xA0, 0x06, 0x54, 0xBA, + 0xD3, 0x2D, 0xE0, 0xC2, 0x4A, 0x08, 0xC3, 0x82, + 0x01, 0x13, 0xDB, 0x2D, 0x20, 0x88, 0x3E, 0x08, + 0x3A, 0x08, 0x0D, 0x16, 0x20, 0x88, 0x3C, 0x08, + 0x38, 0x08, 0x09, 0x16, 0xE0, 0x04, 0x44, 0x08, + 0x82, 0x07, 0x02, 0x08, 0x04, 0x61, 0xE0, 0x04, + 0x48, 0x08, 0x60, 0x04, 0x1E, 0xCA, 0x20, 0xC8, + 0x38, 0x08, 0xFA, 0x07, 0x20, 0xC8, 0x3A, 0x08, + 0xFC, 0x07, 0x60, 0x04, 0x12, 0xCA, 0x07, 0xA8, + 0x48, 0x08, 0x04, 0xC1, 0x1B, 0x16, 0x82, 0x02, + 0x38, 0x08, 0x0A, 0x16, 0x60, 0x01, 0xFC, 0x07, + 0x01, 0x00, 0x02, 0x16, 0xA0, 0x06, 0x6E, 0xCB, + 0xA0, 0x06, 0xFC, 0xCA, 0x80, 0x01, 0x10, 0x00, + 0x32, 0xC1, 0x07, 0x11, 0x72, 0xC1, 0x92, 0xC1, + 0x82, 0x07, 0x38, 0x08, 0x04, 0xC1, 0x06, 0x16, + 0xEA, 0x10, 0x72, 0xC1, 0xB2, 0xC1, 0x84, 0x01, + 0x00, 0x80, 0xE5, 0x13, 0xE0, 0xD2, 0x03, 0x01, + 0x34, 0x13, 0x0B, 0x02, 0x0A, 0x01, 0xC4, 0xCE, + 0xC7, 0xCE, 0xC5, 0xCE, 0xC6, 0xCE, 0xFB, 0x04, + 0xC8, 0xC6, 0x03, 0xA8, 0x12, 0x01, 0x20, 0xC8, + 0xF8, 0x07, 0x00, 0x01, 0xC7, 0xC2, 0xC4, 0x81, + 0x01, 0x14, 0xC4, 0xC2, 0x0B, 0xA8, 0x44, 0x08, + 0x0B, 0x61, 0x0B, 0xA2, 0x8B, 0xA1, 0x01, 0x17, + 0x85, 0x05, 0xCB, 0x61, 0xC6, 0x16, 0x40, 0x01, + 0x40, 0x00, 0x15, 0x16, 0x87, 0x07, 0x20, 0x00, + 0xE0, 0x61, 0x44, 0x08, 0xC4, 0x81, 0x08, 0x1A, + 0x07, 0xA8, 0x48, 0x08, 0x07, 0xA8, 0x44, 0x08, + 0x07, 0x61, 0x87, 0xA1, 0x01, 0x17, 0x85, 0x05, + 0x80, 0x01, 0x40, 0x00, 0x03, 0xC8, 0x6C, 0x01, + 0xE0, 0xC1, 0x04, 0xFC, 0xAC, 0x10, 0x60, 0x04, + 0xBC, 0xC7, 0x20, 0x01, 0x3A, 0x07, 0x00, 0x70, + 0x04, 0x13, 0xA0, 0x06, 0x28, 0xC7, 0x20, 0x07, + 0x2E, 0x06, 0xA0, 0x06, 0x54, 0xBA, 0xC1, 0x10, + 0xE0, 0xD2, 0x03, 0x01, 0x0A, 0x16, 0x20, 0x01, + 0x3A, 0x07, 0x00, 0x70, 0x04, 0x13, 0xA0, 0x06, + 0x28, 0xC7, 0x20, 0x07, 0x2E, 0x06, 0xA0, 0x06, + 0x54, 0xBA, 0x90, 0x03, 0xBF, 0x4F, 0xD3, 0x2D, + 0x60, 0x01, 0xFC, 0x07, 0x01, 0x00, 0x02, 0x16, + 0xA0, 0x06, 0x6E, 0xCB, 0x60, 0xD2, 0x46, 0x08, + 0x89, 0x01, 0x00, 0xF1, 0xC9, 0x01, 0x00, 0x70, + 0x40, 0x01, 0x10, 0x00, 0x1C, 0x13, 0x20, 0x88, + 0x3E, 0x08, 0x3A, 0x08, 0x04, 0x16, 0x20, 0x88, + 0x3C, 0x08, 0x38, 0x08, 0x14, 0x13, 0x89, 0x01, + 0x00, 0x10, 0x8D, 0x07, 0x44, 0x08, 0x9D, 0x07, + 0x00, 0x50, 0xA0, 0xC2, 0xF6, 0x07, 0x8C, 0x07, + 0x02, 0x00, 0xA0, 0xC3, 0x3C, 0x08, 0xE0, 0xC3, + 0x3E, 0x08, 0x2F, 0x02, 0x04, 0x00, 0x01, 0x17, + 0x8E, 0x05, 0xA0, 0x06, 0x00, 0xBA, 0x8D, 0x07, + 0x46, 0x08, 0x49, 0xC7, 0xA0, 0xC2, 0xF6, 0x07, + 0x8C, 0x07, 0x04, 0x00, 0xA0, 0xC3, 0x38, 0x08, + 0xE0, 0xC3, 0x3A, 0x08, 0xCC, 0xA3, 0x01, 0x17, + 0x8E, 0x05, 0xA0, 0x06, 0x00, 0xBA, 0x20, 0xC8, + 0x3C, 0x08, 0xFC, 0x08, 0x20, 0xC8, 0x3E, 0x08, + 0xFE, 0x08, 0x09, 0x01, 0x00, 0x0C, 0x0C, 0x13, + 0x49, 0x01, 0x00, 0x04, 0x05, 0x16, 0xA0, 0x06, + 0x6C, 0xC7, 0xA0, 0x06, 0x38, 0xC7, 0x04, 0x10, + 0x90, 0x03, 0x7F, 0x40, 0xA0, 0x06, 0x6C, 0xC7, + 0xC0, 0x01, 0x90, 0x00, 0xA0, 0x06, 0xFC, 0xCA, + 0x0B, 0xC8, 0x46, 0x08, 0xE0, 0xC2, 0x42, 0x07, + 0x2D, 0x13, 0xE0, 0xC2, 0x2E, 0x06, 0x2A, 0x13, + 0xE0, 0x02, 0x58, 0x07, 0x8F, 0x07, 0xBF, 0xFF, + 0x0F, 0x2C, 0xE0, 0x02, 0x98, 0x07, 0xE0, 0xC0, + 0x5C, 0x07, 0x03, 0xC8, 0x4A, 0x08, 0x03, 0xC8, + 0x6C, 0x01, 0xC3, 0xC2, 0xCB, 0xA2, 0xEB, 0xC2, + 0x32, 0x0C, 0x32, 0x13, 0x0B, 0xC8, 0x00, 0xFC, + 0x0B, 0xC3, 0x4B, 0xC3, 0x0B, 0xC8, 0x6C, 0x01, + 0xE0, 0xC2, 0x00, 0xFC, 0xFA, 0x16, 0x00, 0x03, + 0x02, 0x00, 0x20, 0xC8, 0xF8, 0x05, 0x00, 0xFC, + 0x02, 0x16, 0x0D, 0xC8, 0xFA, 0x05, 0x0C, 0xC8, + 0xF8, 0x05, 0x00, 0x03, 0x0F, 0x00, 0x03, 0xC8, + 0x6C, 0x01, 0x1A, 0x10, 0xA0, 0xC3, 0x2E, 0x06, + 0x03, 0x13, 0xE0, 0xC0, 0xF8, 0x05, 0x0D, 0x16, + 0x4F, 0x2E, 0xC0, 0x01, 0x00, 0x80, 0xA0, 0x01, + 0x62, 0x07, 0x00, 0x80, 0x8E, 0xC3, 0x03, 0x13, + 0xA0, 0x01, 0x62, 0x07, 0x40, 0x00, 0x60, 0x04, + 0x4E, 0xC7, 0x03, 0xC8, 0x6C, 0x01, 0x20, 0xC8, + 0x00, 0xFC, 0xF8, 0x05, 0x03, 0xC8, 0x4A, 0x08, + 0x60, 0x01, 0x6A, 0x09, 0x00, 0x04, 0x02, 0x13, + 0x60, 0x04, 0xE4, 0xC7, 0x8C, 0x07, 0x0E, 0x00, + 0x20, 0xC2, 0x0E, 0xFC, 0x0A, 0x15, 0x09, 0x13, + 0x20, 0xC2, 0x14, 0xFC, 0x48, 0x02, 0x00, 0x1F, + 0xC8, 0x06, 0x88, 0x02, 0x12, 0x00, 0xF0, 0x1B, + 0x08, 0xA3, 0x88, 0x07, 0x02, 0xFC, 0x78, 0xC2, + 0xF8, 0xC1, 0x28, 0x02, 0x00, 0x04, 0x07, 0x83, + 0xE7, 0x1A, 0xCC, 0x61, 0x07, 0xC8, 0x04, 0xFC, + 0xCC, 0xC1, 0xC0, 0x01, 0x40, 0x00, 0x60, 0x04, + 0xF0, 0xC7, 0x4B, 0xC1, 0xA0, 0xC2, 0xF0, 0x07, + 0x20, 0xC3, 0x7A, 0x09, 0x8D, 0x07, 0xFA, 0x07, + 0x9D, 0xC3, 0xE0, 0xC3, 0xFC, 0x07, 0xA0, 0x06, + 0x00, 0xBA, 0x20, 0xC8, 0x3C, 0x08, 0x40, 0x08, + 0x20, 0xC8, 0x3E, 0x08, 0x42, 0x08, 0x0E, 0xC8, + 0x3C, 0x08, 0x0F, 0xC8, 0x3E, 0x08, 0xC4, 0x04, + 0x82, 0x07, 0x02, 0x08, 0xE0, 0x04, 0x44, 0x08, + 0x40, 0x01, 0x80, 0x00, 0x06, 0x16, 0x0E, 0xC8, + 0x38, 0x08, 0x0F, 0xC8, 0x3A, 0x08, 0xE0, 0x04, + 0x48, 0x08, 0xA0, 0x06, 0x54, 0xBA, 0xE0, 0xC2, + 0xFE, 0x07, 0x0D, 0x11, 0x0E, 0xC8, 0xFA, 0x07, + 0x0F, 0xC8, 0xFC, 0x07, 0x20, 0xC8, 0x40, 0x08, + 0x3C, 0x08, 0x20, 0xC8, 0x42, 0x08, 0x3E, 0x08, + 0xA0, 0x06, 0x32, 0xC7, 0xCB, 0x10, 0x80, 0x01, + 0x80, 0x00, 0x55, 0x04, 0x8B, 0xC0, 0xA0, 0xC2, + 0xF0, 0x07, 0x8C, 0x07, 0x04, 0x00, 0x8D, 0x07, + 0xFA, 0x07, 0xA0, 0xC3, 0x3C, 0x08, 0xE0, 0xC3, + 0x3E, 0x08, 0xA0, 0x06, 0x36, 0xBA, 0x60, 0x01, + 0xFC, 0x07, 0x01, 0x00, 0x04, 0x13, 0xA0, 0x07, + 0xFA, 0x08, 0x00, 0x80, 0x52, 0x04, 0x60, 0x01, + 0x60, 0x07, 0x04, 0x00, 0x07, 0x16, 0x20, 0xD0, + 0x04, 0xE0, 0x20, 0xE8, 0x1A, 0xE0, 0x58, 0x07, + 0x60, 0x04, 0x3E, 0xC7, 0xA0, 0x07, 0xFA, 0x08, + 0x00, 0x40, 0x20, 0xC8, 0x3C, 0x08, 0xFC, 0x08, + 0x20, 0xC8, 0x3E, 0x08, 0xFE, 0x08, 0xA0, 0x06, + 0x6C, 0xC7, 0xA0, 0x06, 0x38, 0xC7, 0xD3, 0x10, + 0xAD, 0xC2, 0x02, 0x00, 0x6D, 0xC2, 0x00, 0x00, + 0x05, 0x16, 0xAA, 0x07, 0x02, 0x00, 0x36, 0x07, + 0x9A, 0x2C, 0x80, 0x03, 0xEA, 0x2C, 0x02, 0x00, + 0x41, 0xCB, 0x00, 0x00, 0x80, 0x03, 0x2D, 0xC3, + 0x18, 0x00, 0xAC, 0x07, 0x02, 0x00, 0x36, 0x07, + 0x20, 0x4B, 0x06, 0xEB, 0x0A, 0x00, 0x20, 0xEB, + 0x00, 0xEB, 0x0A, 0x00, 0x9C, 0x2E, 0x80, 0x03, + 0xA0, 0xC2, 0x22, 0xE0, 0x60, 0x04, 0x8A, 0xA3, + 0xED, 0xC0, 0x18, 0x00, 0xA0, 0x06, 0x3A, 0xCC, + 0x80, 0x03, 0x44, 0xC2, 0xC3, 0xC0, 0x02, 0x13, + 0xA0, 0x06, 0x3A, 0xCC, 0x19, 0xC3, 0x09, 0xCB, + 0x18, 0x00, 0xC9, 0x05, 0x19, 0xCB, 0x16, 0x00, + 0x4C, 0xC2, 0x2C, 0x02, 0x1A, 0x00, 0x0D, 0xCF, + 0x0E, 0xCF, 0x0F, 0xC7, 0x99, 0x00, 0x5B, 0x04, + 0x8C, 0x07, 0x0A, 0x09, 0x9C, 0xC2, 0xA0, 0x22, + 0x14, 0xE0, 0x06, 0x13, 0xA0, 0xC2, 0x58, 0x07, + 0xA0, 0x22, 0x20, 0xE0, 0x01, 0x16, 0x80, 0x03, + 0x03, 0xC1, 0xC3, 0x04, 0x8A, 0x07, 0x04, 0x00, + 0x84, 0xA2, 0x3A, 0xCF, 0x3A, 0xCF, 0x3A, 0xCF, + 0x3A, 0xCF, 0x3A, 0xCF, 0xE0, 0x02, 0x58, 0x07, + 0x8D, 0x07, 0x0A, 0x09, 0x0B, 0xC8, 0xC2, 0x07, + 0xA0, 0x06, 0x44, 0xB8, 0xE0, 0xC2, 0xC2, 0x07, + 0x20, 0xE0, 0x20, 0xE0, 0xE0, 0x02, 0xB8, 0x07, + 0x5B, 0x04, 0x2D, 0xC3, 0x18, 0x00, 0x8C, 0xC2, + 0x60, 0xC2, 0x6C, 0x01, 0x0A, 0xC8, 0x6C, 0x01, + 0xE0, 0xC2, 0x00, 0xFC, 0x02, 0x13, 0x8B, 0xC2, + 0xF9, 0x10, 0x09, 0xC8, 0x6C, 0x01, 0x8B, 0x07, + 0xF8, 0x05, 0x5B, 0xC2, 0x0C, 0x13, 0xCB, 0x05, + 0x5B, 0xC2, 0xCA, 0xC6, 0xE0, 0xC2, 0x6C, 0x01, + 0x09, 0xC8, 0x6C, 0x01, 0x0C, 0xC8, 0x00, 0xFC, + 0x0B, 0xC8, 0x6C, 0x01, 0x02, 0x10, 0xCC, 0xCE, + 0xCA, 0xC6, 0xA0, 0xC2, 0xE0, 0x00, 0xA0, 0x22, + 0x1A, 0xE0, 0x06, 0x16, 0x20, 0xE8, 0x04, 0xE0, + 0x3A, 0x07, 0x20, 0x48, 0x1A, 0xE0, 0xE0, 0x00, + 0x80, 0x03, 0xE0, 0xD3, 0xAB, 0xE3, 0xE0, 0x04, + 0x8E, 0x09, 0xE0, 0xC1, 0xA8, 0x06, 0x05, 0x16, + 0x07, 0x02, 0xA2, 0x06, 0xA0, 0x06, 0x38, 0xB5, + 0x0B, 0x16, 0xE0, 0xC1, 0xBA, 0x06, 0x23, 0x16, + 0x07, 0x02, 0xB4, 0x06, 0xA0, 0x06, 0x38, 0xB5, + 0x1E, 0x13, 0x07, 0x02, 0xB8, 0x06, 0x02, 0x10, + 0x07, 0x02, 0xA6, 0x06, 0x60, 0xC1, 0x02, 0xFC, + 0x25, 0xC8, 0x0C, 0x00, 0x02, 0xFC, 0xC5, 0xC9, + 0x0C, 0x00, 0xF5, 0xCD, 0xF5, 0xCD, 0xF5, 0xCD, + 0xF5, 0xCD, 0xF5, 0xCD, 0xF5, 0xC5, 0xB7, 0x01, + 0x28, 0x00, 0x27, 0x02, 0xF4, 0xFF, 0xA7, 0x07, + 0x04, 0x00, 0x52, 0xCE, 0x20, 0xE8, 0x9E, 0x09, + 0x06, 0xFC, 0x97, 0x2E, 0xD2, 0x10, 0x00, 0x03, + 0x02, 0x00, 0xA0, 0x06, 0x50, 0xB5, 0x00, 0x03, + 0x0F, 0x00, 0x20, 0x2C, 0xF0, 0xED, 0xE0, 0x93, + 0xAB, 0xE3, 0x03, 0x16, 0x81, 0x02, 0x16, 0x00, + 0xC4, 0x16, 0x21, 0xC1, 0x10, 0xEB, 0x54, 0x04, + 0xE0, 0x93, 0x10, 0xE0, 0x03, 0x16, 0xA0, 0xD2, + 0xA8, 0xE3, 0x0B, 0x10, 0xCF, 0xD3, 0x09, 0x16, + 0xA0, 0x23, 0x08, 0xE0, 0x06, 0x16, 0x84, 0x07, + 0x20, 0x00, 0x04, 0xE8, 0xD2, 0x06, 0xA0, 0xD2, + 0x0C, 0xE0, 0x60, 0x04, 0xD2, 0xCE, 0x60, 0x04, + 0x70, 0xD1, 0x22, 0xC1, 0x04, 0x00, 0xE2, 0x04, + 0x02, 0x00, 0x54, 0x04, 0x02, 0xC8, 0x6C, 0x01, + 0x82, 0xA0, 0x22, 0xC8, 0x32, 0x0C, 0x00, 0xFC, + 0x02, 0x02, 0x00, 0xFC, 0xE0, 0x93, 0xAA, 0xE3, + 0x13, 0x16, 0xB0, 0x03, 0x20, 0x98, 0xAA, 0xE3, + 0x65, 0x06, 0x0D, 0x16, 0x8B, 0x07, 0x17, 0xFC, + 0xDB, 0xD2, 0x8B, 0x09, 0x8B, 0x02, 0x15, 0x00, + 0x7B, 0x1B, 0xEB, 0xD2, 0xC4, 0xEA, 0x06, 0x13, + 0x77, 0x15, 0x20, 0x07, 0xA0, 0x09, 0x74, 0x10, + 0xA0, 0x06, 0x02, 0xD0, 0xA0, 0x48, 0x04, 0xE0, + 0x0E, 0x00, 0x85, 0x02, 0x07, 0x00, 0x0E, 0x13, + 0x0E, 0x01, 0x03, 0x00, 0x0B, 0x13, 0xA0, 0x23, + 0x22, 0xE0, 0x03, 0x16, 0xA0, 0xD2, 0x0E, 0xE0, + 0x02, 0x10, 0xA0, 0xD2, 0xA8, 0xE3, 0x8E, 0x01, + 0x03, 0x00, 0x5E, 0x10, 0x05, 0xC8, 0xFC, 0x06, + 0xC3, 0xC0, 0x57, 0x16, 0xA0, 0x43, 0x10, 0xE0, + 0x22, 0x88, 0x0E, 0x00, 0x6C, 0x09, 0x0A, 0x16, + 0x22, 0x88, 0x10, 0x00, 0x6E, 0x09, 0x06, 0x16, + 0x22, 0x88, 0x12, 0x00, 0x70, 0x09, 0x02, 0x16, + 0xA0, 0xE3, 0x10, 0xE0, 0x85, 0x02, 0x09, 0x00, + 0x02, 0x13, 0xA0, 0x06, 0xB8, 0xD7, 0x45, 0xA1, + 0x65, 0xC1, 0xAC, 0xE3, 0x55, 0x04, 0x62, 0xC0, + 0x04, 0x00, 0x22, 0xC8, 0x06, 0x00, 0x6C, 0x01, + 0x82, 0x02, 0x48, 0x04, 0x02, 0x1B, 0xA0, 0x43, + 0x0C, 0xE0, 0x22, 0xC1, 0x0E, 0x00, 0x51, 0x04, + 0x42, 0xC0, 0xE1, 0x04, 0x02, 0x00, 0xA2, 0xC0, + 0x0C, 0x00, 0x22, 0xC1, 0x0A, 0x00, 0x20, 0x21, + 0x18, 0xE0, 0x07, 0x13, 0xA1, 0xC8, 0x0A, 0x00, + 0x0A, 0x00, 0xA1, 0xC8, 0x08, 0x00, 0x08, 0x00, + 0xE2, 0x10, 0x22, 0xC8, 0x06, 0x00, 0x6C, 0x01, + 0xA0, 0x06, 0x66, 0xD6, 0x60, 0x04, 0xB0, 0xCE, + 0x02, 0xC8, 0xD4, 0x06, 0x62, 0xC1, 0x02, 0x00, + 0x65, 0xC1, 0xD8, 0xE3, 0x55, 0x04, 0x0F, 0x10, + 0x0E, 0x10, 0x85, 0x07, 0xF4, 0x03, 0xF5, 0x04, + 0x60, 0xCD, 0xCE, 0xED, 0xA0, 0x06, 0xA2, 0xD8, + 0xA0, 0xE3, 0x0C, 0xE0, 0x20, 0xE8, 0x9E, 0x09, + 0x06, 0x04, 0xA0, 0x2E, 0xF4, 0x03, 0x60, 0x04, + 0xE4, 0xCC, 0xA0, 0x06, 0x26, 0xD5, 0x0C, 0x10, + 0xA0, 0x06, 0x66, 0xD6, 0x09, 0x10, 0xA0, 0x06, + 0x2A, 0xD8, 0x06, 0x10, 0xA0, 0x06, 0x66, 0xD6, + 0x03, 0xC8, 0x2A, 0x09, 0xA0, 0xD2, 0xAA, 0xE3, + 0xA0, 0x06, 0x6E, 0xCF, 0xA0, 0x92, 0x26, 0xE0, + 0x0C, 0x16, 0xE0, 0xD3, 0x26, 0xE0, 0xE0, 0x23, + 0x14, 0xE0, 0x0A, 0x13, 0x0A, 0xC1, 0xC4, 0x83, + 0x07, 0x13, 0xC4, 0xC3, 0x24, 0xC1, 0xDC, 0xE3, + 0x54, 0x04, 0xCA, 0x93, 0xDC, 0x13, 0xCA, 0xD3, + 0xB0, 0x03, 0x0F, 0xD8, 0x59, 0x06, 0x04, 0x71, + 0x24, 0xC1, 0xEC, 0xE3, 0x54, 0x04, 0xA0, 0x23, + 0x0C, 0xE0, 0xD1, 0x13, 0x4D, 0xC3, 0xCF, 0x13, + 0x4D, 0x01, 0x00, 0x04, 0x0B, 0x13, 0x86, 0x07, + 0x02, 0x00, 0x84, 0x07, 0x26, 0x00, 0x46, 0x23, + 0x03, 0x13, 0x44, 0x06, 0x86, 0xA1, 0xFB, 0x10, + 0x46, 0x43, 0xB3, 0x10, 0x84, 0x07, 0x18, 0x00, + 0x8D, 0x01, 0x00, 0x04, 0x85, 0x07, 0xF4, 0x03, + 0xF5, 0x04, 0x60, 0xCD, 0xCE, 0xED, 0xA0, 0x06, + 0xA2, 0xD8, 0x20, 0xE8, 0x9C, 0x09, 0xFE, 0x03, + 0x20, 0xE8, 0x9E, 0x09, 0x06, 0x04, 0xA8, 0x10, + 0x85, 0x07, 0x1C, 0x07, 0x86, 0x07, 0x1A, 0x04, + 0x76, 0x6D, 0x76, 0x6D, 0x76, 0x6D, 0xC6, 0x05, + 0x76, 0x6D, 0x76, 0x6D, 0x76, 0x6D, 0x83, 0x07, + 0x00, 0x90, 0xA9, 0x10, 0x0B, 0xC3, 0x86, 0x07, + 0x00, 0x01, 0x85, 0x07, 0x00, 0x80, 0x20, 0xC1, + 0xD2, 0x06, 0x37, 0x13, 0xC4, 0x04, 0x60, 0xC0, + 0xD2, 0x06, 0x45, 0x20, 0x04, 0x13, 0x84, 0x05, + 0x15, 0x09, 0xF9, 0x16, 0x2E, 0x10, 0xCF, 0xD3, + 0x06, 0x16, 0xE0, 0x23, 0x14, 0xE0, 0x03, 0x16, + 0x0E, 0x01, 0x03, 0x00, 0x03, 0x13, 0xE0, 0x04, + 0xD2, 0x06, 0x23, 0x10, 0x64, 0xD0, 0x1C, 0x07, + 0x46, 0xB0, 0x10, 0x18, 0x01, 0xD9, 0x1C, 0x07, + 0x60, 0x23, 0x20, 0xE0, 0x0B, 0x13, 0x81, 0x07, + 0x18, 0x00, 0x61, 0xC0, 0xFC, 0xE3, 0x11, 0x88, + 0xCE, 0xED, 0x04, 0x13, 0x08, 0x02, 0x18, 0x80, + 0xA0, 0x06, 0xDA, 0xD4, 0x64, 0xD0, 0x28, 0x07, + 0x46, 0xB0, 0x08, 0x18, 0x01, 0xD9, 0x28, 0x07, + 0x46, 0xB0, 0x04, 0x17, 0x83, 0x07, 0x40, 0x80, + 0xA0, 0x06, 0x2A, 0xD8, 0x05, 0x48, 0xD2, 0x06, + 0xCA, 0x16, 0x20, 0xC1, 0x32, 0x09, 0x01, 0x16, + 0x5C, 0x04, 0x04, 0x02, 0x07, 0x00, 0x20, 0x06, + 0x32, 0x09, 0x05, 0x02, 0x00, 0x01, 0xC7, 0x10, + 0x0B, 0xC3, 0xC5, 0x04, 0x42, 0xC0, 0xC7, 0x04, + 0x20, 0xC2, 0x6C, 0x01, 0xE1, 0xA1, 0x04, 0x00, + 0x11, 0xC8, 0x6C, 0x01, 0xFB, 0x16, 0x08, 0xC8, + 0x6C, 0x01, 0xC8, 0x04, 0xA0, 0x43, 0x1A, 0xE0, + 0x22, 0xC1, 0x0E, 0x00, 0x0D, 0x15, 0x0C, 0x13, + 0xA0, 0xE3, 0x1A, 0xE0, 0xA0, 0x06, 0x14, 0xD8, + 0x08, 0xC2, 0x48, 0x13, 0x88, 0x02, 0x12, 0x00, + 0x45, 0x1B, 0x20, 0x22, 0x22, 0xE0, 0x42, 0x13, + 0x02, 0xC1, 0x08, 0xA1, 0x08, 0x05, 0x28, 0x02, + 0xF2, 0xFF, 0x07, 0xA2, 0x83, 0x07, 0x01, 0x80, + 0x88, 0x02, 0x04, 0x00, 0x6E, 0x11, 0x64, 0xC2, + 0x16, 0x00, 0x49, 0xD2, 0x02, 0x16, 0x02, 0x81, + 0x31, 0x16, 0x09, 0x01, 0x00, 0xF0, 0x28, 0x16, + 0x49, 0xC1, 0x45, 0x71, 0xC3, 0x04, 0x85, 0x02, + 0x09, 0x00, 0x7C, 0x13, 0x83, 0x07, 0x02, 0x80, + 0xA4, 0xC1, 0x14, 0x00, 0x88, 0x81, 0x76, 0x16, + 0x83, 0x05, 0x85, 0x02, 0x15, 0x00, 0x13, 0x1B, + 0x83, 0x05, 0x49, 0x99, 0x30, 0xEB, 0x0A, 0x13, + 0x09, 0x98, 0x0E, 0xE0, 0x6B, 0x16, 0x25, 0x98, + 0x30, 0xEB, 0x0C, 0xE0, 0x67, 0x16, 0xE0, 0xC1, + 0xEC, 0x06, 0x64, 0x16, 0xC3, 0x04, 0x52, 0xC2, + 0x0F, 0x13, 0x83, 0x07, 0x09, 0x80, 0xE0, 0xC1, + 0x6A, 0x09, 0x47, 0x01, 0x00, 0x10, 0x5A, 0x16, + 0xA0, 0xC0, 0x6C, 0x01, 0xA0, 0x06, 0xBE, 0xD6, + 0x60, 0x04, 0xB0, 0xCE, 0x60, 0x04, 0xBA, 0xCE, + 0x89, 0x07, 0x0E, 0x07, 0xC7, 0x04, 0xE5, 0xD1, + 0x46, 0xEB, 0x05, 0x13, 0xC7, 0x06, 0x27, 0x02, + 0x5C, 0xEB, 0x77, 0xCE, 0xFE, 0x15, 0x44, 0xC0, + 0x21, 0x02, 0x18, 0x00, 0x28, 0x02, 0xFC, 0xFF, + 0x36, 0x13, 0x91, 0xC1, 0x86, 0xD1, 0x1F, 0x13, + 0xC6, 0x06, 0x87, 0x07, 0x0E, 0x07, 0xF7, 0xC0, + 0x46, 0x02, 0xFF, 0xBF, 0x43, 0x02, 0xFF, 0x3F, + 0xA0, 0x91, 0xF5, 0xED, 0x09, 0x16, 0xB0, 0x03, + 0x20, 0x98, 0x0E, 0xE0, 0x5D, 0x06, 0x0F, 0x16, + 0x21, 0xC8, 0x02, 0x00, 0x0C, 0x07, 0x17, 0x10, + 0x47, 0x82, 0x0C, 0x1B, 0xC6, 0x90, 0xEB, 0x16, + 0x47, 0x06, 0xF7, 0x04, 0xB0, 0x03, 0x20, 0x98, + 0x5D, 0x06, 0x57, 0x06, 0x0C, 0x13, 0x83, 0x07, + 0x05, 0x80, 0x1C, 0x10, 0xD1, 0xC0, 0xE0, 0x20, + 0x16, 0xE0, 0x03, 0x16, 0x83, 0x07, 0x08, 0x80, + 0x15, 0x10, 0x60, 0x44, 0x26, 0xE0, 0x86, 0x71, + 0x46, 0xA0, 0x06, 0x62, 0x83, 0x07, 0x05, 0x80, + 0x08, 0xC2, 0xCB, 0x15, 0x0B, 0x16, 0xC3, 0x04, + 0x87, 0x07, 0x0E, 0x07, 0x77, 0xC0, 0x47, 0x82, + 0x05, 0x1B, 0x60, 0x20, 0x06, 0xE0, 0xFA, 0x16, + 0x83, 0x07, 0x07, 0x80, 0x5C, 0x04, 0xA0, 0x92, + 0x0E, 0xE0, 0x11, 0x16, 0x20, 0xC8, 0x20, 0xE0, + 0x08, 0x07, 0xE0, 0x04, 0x84, 0x01, 0x60, 0x05, + 0x02, 0x07, 0x4B, 0x13, 0x20, 0x48, 0x06, 0xE0, + 0x82, 0x01, 0xA0, 0x06, 0xD0, 0xD4, 0x83, 0x07, + 0x00, 0xC0, 0xA0, 0x06, 0x2A, 0xD8, 0x20, 0xC8, + 0x1E, 0xE0, 0x02, 0x07, 0xA0, 0xE3, 0x04, 0xE0, + 0x08, 0x02, 0x24, 0x80, 0xA0, 0x06, 0xDA, 0xD4, + 0x42, 0x10, 0x20, 0xC1, 0x84, 0x01, 0x44, 0x02, + 0x00, 0x88, 0x2A, 0x13, 0x04, 0x48, 0x84, 0x01, + 0x20, 0x06, 0x02, 0x07, 0xF1, 0x16, 0x60, 0x01, + 0x8E, 0x09, 0x00, 0x80, 0x15, 0x13, 0xA0, 0x23, + 0x22, 0xE0, 0x05, 0x16, 0xA0, 0x43, 0x22, 0xE0, + 0xA0, 0xD2, 0x0E, 0xE0, 0xCF, 0x10, 0xE0, 0x23, + 0x14, 0xE0, 0x04, 0x13, 0x20, 0x98, 0xA9, 0xE3, + 0x65, 0x06, 0x0C, 0x16, 0xA0, 0x92, 0x0E, 0xE0, + 0xC5, 0x13, 0xA0, 0xD2, 0xA8, 0xE3, 0xD3, 0x10, + 0x20, 0xC8, 0x20, 0xE0, 0x08, 0x07, 0x83, 0x07, + 0x00, 0xC0, 0x04, 0x10, 0x83, 0x07, 0x02, 0x00, + 0x60, 0x04, 0xCA, 0xCE, 0x60, 0x04, 0xC0, 0xCE, + 0x20, 0xE8, 0x06, 0xE0, 0x82, 0x01, 0xA0, 0x06, + 0xD0, 0xD4, 0x20, 0x07, 0x02, 0x07, 0xA0, 0x43, + 0x04, 0xE0, 0x20, 0xC8, 0xAE, 0xE4, 0x86, 0x01, + 0x20, 0x88, 0x20, 0xE0, 0x08, 0x07, 0x03, 0x16, + 0x20, 0xC8, 0x78, 0xEB, 0x08, 0x07, 0x60, 0x04, + 0xD2, 0xCE, 0x0E, 0x01, 0x03, 0x00, 0x16, 0x13, + 0xCF, 0xD3, 0x08, 0x16, 0xA0, 0x23, 0x20, 0xE0, + 0x03, 0x16, 0xA0, 0xD2, 0xA8, 0xE3, 0x02, 0x10, + 0xA0, 0xD2, 0x0E, 0xE0, 0x8E, 0x01, 0x03, 0x00, + 0x09, 0x10, 0x60, 0xC1, 0x84, 0x01, 0x60, 0x21, + 0x0A, 0xE0, 0x04, 0x16, 0x83, 0x07, 0x00, 0x84, + 0x60, 0x04, 0xCA, 0xCE, 0x20, 0xC8, 0x2E, 0xE0, + 0x84, 0x01, 0x08, 0x02, 0x06, 0x80, 0xA0, 0x06, + 0xDA, 0xD4, 0x60, 0x04, 0xD2, 0xCE, 0x60, 0xE3, + 0x20, 0xE0, 0x60, 0x04, 0xD2, 0xCE, 0xE0, 0x93, + 0x26, 0xE0, 0x10, 0x16, 0xA0, 0x23, 0x08, 0xE0, + 0x0D, 0x16, 0xA0, 0x23, 0x06, 0xE0, 0x02, 0x13, + 0x60, 0xE3, 0x1C, 0xE0, 0x60, 0xE3, 0x18, 0xE0, + 0xA0, 0x43, 0x06, 0xE0, 0x08, 0x02, 0x3C, 0x80, + 0xA0, 0x06, 0xDA, 0xD4, 0x60, 0x04, 0xD2, 0xCE, + 0xA0, 0x92, 0xA8, 0xE3, 0x03, 0x13, 0xA0, 0x92, + 0xA9, 0xE3, 0x1E, 0x16, 0xE0, 0x23, 0x14, 0xE0, + 0x08, 0x13, 0x20, 0x98, 0xA9, 0xE3, 0x65, 0x06, + 0x04, 0x13, 0x83, 0x07, 0x07, 0x00, 0x60, 0x04, + 0xCA, 0xCE, 0xA0, 0xD2, 0x0E, 0xE0, 0x20, 0xC8, + 0x20, 0xE0, 0x08, 0x07, 0xA0, 0x27, 0x04, 0xE0, + 0x0B, 0x16, 0x20, 0xC8, 0x1E, 0xE0, 0x08, 0x07, + 0xE0, 0x93, 0xA8, 0xE3, 0x05, 0x16, 0xA0, 0x23, + 0x12, 0xE0, 0x02, 0x13, 0x20, 0x06, 0x08, 0x07, + 0x60, 0x04, 0xD2, 0xCE, 0xE0, 0x23, 0x14, 0xE0, + 0x3E, 0x13, 0xB0, 0x03, 0x20, 0x98, 0x0E, 0xE0, + 0x6F, 0x06, 0x0F, 0x16, 0xCF, 0xD3, 0x37, 0x16, + 0xA0, 0xD2, 0xA8, 0xE3, 0x60, 0x04, 0xD2, 0xCE, + 0xA0, 0x92, 0x0C, 0xE0, 0x30, 0x16, 0xE0, 0x23, + 0x14, 0xE0, 0xF6, 0x13, 0x83, 0x07, 0x06, 0x00, + 0x07, 0x10, 0x83, 0x07, 0x05, 0x00, 0xE0, 0x93, + 0x0E, 0xE0, 0x02, 0x16, 0x83, 0x07, 0x07, 0x00, + 0x60, 0x04, 0xCA, 0xCE, 0x60, 0xE3, 0x12, 0xE0, + 0xE0, 0x23, 0x14, 0xE0, 0x11, 0x13, 0x20, 0x98, + 0x0C, 0xE0, 0x65, 0x06, 0x03, 0x16, 0x20, 0xD8, + 0xA9, 0xE3, 0x65, 0x06, 0x14, 0x10, 0x60, 0x01, + 0x8E, 0x09, 0x00, 0x80, 0x10, 0x13, 0x20, 0xC1, + 0x84, 0x01, 0x20, 0x21, 0x06, 0xE0, 0xD2, 0x16, + 0x60, 0x01, 0x8E, 0x09, 0x00, 0x80, 0x07, 0x13, + 0x20, 0x48, 0x06, 0xE0, 0x84, 0x01, 0x08, 0x02, + 0x30, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0x60, 0x04, + 0xD2, 0xCE, 0x60, 0x01, 0x8E, 0x09, 0x00, 0x20, + 0xFA, 0x16, 0x08, 0x02, 0x78, 0x80, 0xA0, 0x06, + 0xDA, 0xD4, 0x20, 0xC2, 0xA2, 0x09, 0x03, 0x13, + 0x20, 0x06, 0xA2, 0x09, 0x21, 0x13, 0x20, 0xC2, + 0xA4, 0x09, 0xED, 0x13, 0x20, 0x06, 0xA4, 0x09, + 0xEA, 0x16, 0xA0, 0x07, 0xA4, 0x09, 0x05, 0x00, + 0xCD, 0x01, 0x00, 0x04, 0xE4, 0x10, 0x60, 0x01, + 0x8E, 0x09, 0x80, 0x00, 0x3E, 0x13, 0x60, 0x01, + 0x8E, 0x09, 0x00, 0x10, 0x02, 0x16, 0xA0, 0x06, + 0xE6, 0xD5, 0xA0, 0x01, 0x8E, 0x09, 0x00, 0x10, + 0xE0, 0x01, 0x8E, 0x09, 0x80, 0x00, 0x83, 0x07, + 0x00, 0xA8, 0xA0, 0x06, 0x2A, 0xD8, 0x16, 0x10, + 0x60, 0x01, 0x8E, 0x09, 0x00, 0x04, 0x21, 0x13, + 0xE0, 0x01, 0x8E, 0x09, 0x00, 0x10, 0xA0, 0x07, + 0x08, 0x07, 0x05, 0x00, 0x83, 0x07, 0x08, 0xA8, + 0xA0, 0x23, 0x04, 0xE0, 0x05, 0x16, 0x20, 0xC8, + 0x20, 0xE0, 0x08, 0x07, 0x83, 0x07, 0x08, 0xE8, + 0xA0, 0x06, 0x2A, 0xD8, 0xA0, 0x01, 0x8E, 0x09, + 0x00, 0x20, 0xE0, 0x01, 0x8E, 0x09, 0x00, 0x01, + 0xE0, 0x01, 0x82, 0x01, 0x00, 0x08, 0xA0, 0xD2, + 0x0E, 0xE0, 0x83, 0x07, 0x10, 0x80, 0x60, 0x04, + 0xC0, 0xCE, 0x08, 0x02, 0x78, 0x00, 0xA0, 0x06, + 0xDA, 0xD4, 0x83, 0x07, 0x00, 0x82, 0x60, 0x04, + 0xCA, 0xCE, 0x60, 0x04, 0xD2, 0xCE, 0x20, 0x06, + 0x90, 0x09, 0x07, 0x15, 0xA0, 0xD2, 0x10, 0xE0, + 0xCA, 0x06, 0xA0, 0xD2, 0x26, 0xE0, 0xCF, 0x04, + 0xF4, 0x10, 0x08, 0x02, 0x7E, 0x80, 0xA0, 0x06, + 0xDA, 0xD4, 0x20, 0xC2, 0x90, 0x09, 0x88, 0x02, + 0x96, 0x00, 0x0D, 0x1B, 0xEA, 0x16, 0x20, 0x48, + 0x08, 0xE0, 0x82, 0x01, 0xA0, 0x01, 0x8E, 0x09, + 0x00, 0x10, 0xA0, 0x06, 0xE6, 0xD5, 0x83, 0x07, + 0x00, 0x28, 0x60, 0x04, 0xC0, 0xCE, 0x60, 0x01, + 0x8E, 0x09, 0x00, 0x10, 0xDA, 0x16, 0x84, 0x07, + 0x04, 0x00, 0x85, 0x07, 0xF4, 0x03, 0xF5, 0x04, + 0xB5, 0x07, 0x30, 0x06, 0xA0, 0x06, 0xA2, 0xD8, + 0xA0, 0x07, 0xF8, 0x03, 0x34, 0xD4, 0x60, 0x04, + 0xC0, 0xDB, 0xA0, 0x07, 0x90, 0x09, 0xF4, 0x01, + 0x08, 0x02, 0x7E, 0x80, 0xA0, 0x06, 0xDA, 0xD4, + 0x08, 0x02, 0x36, 0x00, 0xA0, 0x06, 0xDA, 0xD4, + 0x20, 0xE8, 0x0C, 0xE0, 0x82, 0x01, 0xA0, 0x23, + 0x18, 0xE0, 0x06, 0x13, 0xA0, 0xE3, 0x18, 0xE0, + 0xE0, 0x2E, 0x00, 0x00, 0x41, 0xC0, 0xFA, 0x16, + 0xA0, 0x06, 0xE6, 0xD5, 0xB2, 0x10, 0x04, 0x02, + 0x64, 0x00, 0x04, 0x06, 0xFE, 0x16, 0x5B, 0x04, + 0xA0, 0xE3, 0x0A, 0xE0, 0x08, 0xC2, 0x02, 0x11, + 0xA0, 0x43, 0x0A, 0xE0, 0x20, 0x42, 0x04, 0xE0, + 0x28, 0x02, 0xFC, 0xE3, 0x58, 0xC0, 0x02, 0xC0, + 0x11, 0x88, 0xCE, 0xED, 0x03, 0x16, 0xD1, 0x2C, + 0x58, 0xC0, 0xD1, 0x04, 0x80, 0xC0, 0x0E, 0x01, + 0x00, 0x10, 0x0F, 0x13, 0x60, 0xCC, 0xCE, 0xED, + 0xC8, 0x05, 0x78, 0xCC, 0x03, 0x16, 0x41, 0x06, + 0x60, 0xCC, 0xD6, 0x06, 0x58, 0xC4, 0x02, 0x16, + 0x60, 0xC4, 0x00, 0x07, 0x21, 0x02, 0xFA, 0xFF, + 0x91, 0x2C, 0x5B, 0x04, 0x0B, 0xC3, 0xA0, 0x06, + 0xC2, 0xD5, 0xA0, 0x06, 0x9C, 0xD5, 0x08, 0xC2, + 0x05, 0x16, 0x62, 0xC2, 0x02, 0x00, 0x60, 0x26, + 0xA8, 0xE4, 0x0D, 0x16, 0x42, 0xC2, 0xC9, 0x05, + 0x60, 0xCE, 0xF2, 0xED, 0x60, 0xC6, 0x7C, 0xEB, + 0xA0, 0x06, 0x10, 0xD6, 0x18, 0xCA, 0x0A, 0x00, + 0x20, 0x46, 0x26, 0xE0, 0x04, 0x16, 0xA0, 0xC0, + 0x6C, 0x01, 0x12, 0x2E, 0x1D, 0x10, 0x12, 0xC1, + 0x05, 0x13, 0x60, 0xC1, 0x6C, 0x01, 0x14, 0x2E, + 0x05, 0xC8, 0x6C, 0x01, 0xD2, 0x04, 0x48, 0x06, + 0x84, 0x07, 0x02, 0x00, 0x48, 0xC1, 0xA0, 0xC0, + 0x6C, 0x01, 0x02, 0xC0, 0xA0, 0x06, 0xA2, 0xD8, + 0x60, 0xC5, 0x02, 0xFC, 0x07, 0x02, 0xA2, 0x06, + 0x25, 0x02, 0xF4, 0xFF, 0x05, 0xC8, 0x02, 0xFC, + 0x20, 0xC2, 0x6C, 0x01, 0xA0, 0x06, 0xFC, 0xB4, + 0x5C, 0x04, 0x42, 0xC2, 0x29, 0x02, 0x08, 0x00, + 0x39, 0xC2, 0x48, 0x02, 0x00, 0xC0, 0x88, 0x02, + 0x00, 0xC0, 0x08, 0x16, 0x60, 0x8E, 0x2E, 0xE0, + 0x05, 0x16, 0x60, 0x86, 0x2E, 0xE0, 0x02, 0x16, + 0xC8, 0x04, 0x5B, 0x04, 0x08, 0x07, 0x5B, 0x04, + 0x20, 0x88, 0x8E, 0xE1, 0x6C, 0x01, 0x02, 0x16, + 0x60, 0x04, 0xBA, 0xCE, 0x5B, 0x04, 0x88, 0x07, + 0xAE, 0x01, 0x20, 0xE8, 0x0E, 0xE0, 0x80, 0x01, + 0x08, 0x06, 0xFE, 0x16, 0x20, 0x48, 0x0E, 0xE0, + 0x80, 0x01, 0x5B, 0x04, 0xC2, 0x04, 0xA0, 0x23, + 0x0C, 0xE0, 0x10, 0x16, 0x20, 0x2F, 0x30, 0x06, + 0x82, 0x07, 0xDF, 0xFF, 0x02, 0x2C, 0x82, 0x02, + 0xF4, 0x03, 0x06, 0x13, 0xE2, 0x04, 0x02, 0x00, + 0xA2, 0xC0, 0x06, 0x00, 0x12, 0x2E, 0xF4, 0x10, + 0xA0, 0x43, 0x0C, 0xE0, 0x5B, 0x04, 0x42, 0xC2, + 0x88, 0x07, 0x0E, 0x00, 0x09, 0xA2, 0x29, 0x02, + 0x08, 0x00, 0x78, 0xCE, 0x78, 0xCE, 0x78, 0xCE, + 0x60, 0xCE, 0x6C, 0x09, 0x60, 0xCE, 0x6E, 0x09, + 0x60, 0xCE, 0x70, 0x09, 0xA0, 0x23, 0x1A, 0xE0, + 0x0F, 0x16, 0x58, 0xC2, 0x49, 0x02, 0x80, 0x1F, + 0x60, 0x2A, 0x14, 0xE0, 0xA0, 0xE8, 0x04, 0xE0, + 0x0E, 0x00, 0x09, 0xC6, 0x49, 0x02, 0x00, 0x1F, + 0xC9, 0x06, 0x09, 0xA2, 0x89, 0xA8, 0x04, 0x00, + 0x28, 0x02, 0x02, 0x00, 0x58, 0xC2, 0x49, 0x0A, + 0x49, 0x02, 0x00, 0xF0, 0x09, 0xD6, 0xE2, 0x04, + 0x06, 0x00, 0x5B, 0x04, 0x00, 0x07, 0x82, 0xC0, + 0x53, 0x13, 0xA0, 0xC0, 0x6C, 0x01, 0xA0, 0xC1, + 0x06, 0xFC, 0x46, 0x02, 0x0F, 0x00, 0x86, 0x02, + 0x01, 0x00, 0x3D, 0x12, 0x06, 0x88, 0xF2, 0x06, + 0x12, 0x16, 0x01, 0x02, 0x0E, 0xFC, 0x31, 0x88, + 0xF4, 0x06, 0x0D, 0x16, 0x31, 0x88, 0xF6, 0x06, + 0x0A, 0x16, 0x31, 0x88, 0xF8, 0x06, 0x07, 0x16, + 0x86, 0x02, 0x02, 0x00, 0x2C, 0x16, 0x20, 0x88, + 0x0A, 0x07, 0xFA, 0x06, 0x28, 0x13, 0x20, 0xC1, + 0x6A, 0x09, 0x44, 0x01, 0x00, 0x08, 0x06, 0x13, + 0x86, 0x02, 0x02, 0x00, 0x20, 0x16, 0x44, 0x01, + 0x80, 0x00, 0x1D, 0x16, 0x00, 0x07, 0xE0, 0x23, + 0x14, 0xE0, 0x19, 0x16, 0x82, 0x02, 0x43, 0x00, + 0x16, 0x13, 0x00, 0x02, 0x02, 0xFC, 0x40, 0xC0, + 0xB0, 0x01, 0x20, 0x00, 0x60, 0x01, 0x6A, 0x09, + 0x01, 0x00, 0x07, 0x16, 0x60, 0xA0, 0x2C, 0x09, + 0x60, 0xCC, 0xEE, 0x05, 0x50, 0xC4, 0x20, 0xC4, + 0x2C, 0x09, 0x80, 0x07, 0x36, 0x07, 0x81, 0x07, + 0x40, 0x00, 0x40, 0x2C, 0xC0, 0x04, 0x84, 0x07, + 0xF2, 0x06, 0x06, 0xCD, 0x01, 0x02, 0x0E, 0xFC, + 0x31, 0xCD, 0x31, 0xCD, 0x31, 0xCD, 0x20, 0xC5, + 0x0A, 0x07, 0x00, 0xC0, 0x01, 0x13, 0x12, 0x2E, + 0xE0, 0x04, 0x6C, 0x01, 0x5B, 0x04, 0x60, 0x01, + 0x8A, 0x09, 0x00, 0x80, 0x12, 0x13, 0x0B, 0xC8, + 0x22, 0x09, 0xA0, 0x06, 0x3E, 0xD7, 0x08, 0x02, + 0x42, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0x08, 0x02, + 0x30, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0xE0, 0xC2, + 0x22, 0x09, 0x5B, 0x04, 0x20, 0x48, 0xAC, 0xE4, + 0x80, 0x01, 0x20, 0x48, 0x7E, 0xEB, 0x82, 0x01, + 0x20, 0x48, 0x22, 0xE0, 0xAE, 0x01, 0x20, 0x48, + 0x22, 0xE0, 0x78, 0x09, 0x60, 0x43, 0x18, 0xE0, + 0xA0, 0x43, 0x08, 0xE0, 0x60, 0x01, 0x8A, 0x09, + 0x00, 0x80, 0xEB, 0x13, 0x0B, 0xC3, 0x08, 0x02, + 0x42, 0x00, 0xA0, 0x06, 0xDA, 0xD4, 0x5C, 0x04, + 0x0B, 0xC3, 0x20, 0xE8, 0x0E, 0xE0, 0x82, 0x01, + 0x20, 0xE8, 0x22, 0xE0, 0xAE, 0x01, 0x20, 0xE8, + 0x22, 0xE0, 0x78, 0x09, 0xA0, 0xE3, 0x08, 0xE0, + 0x60, 0xE3, 0x18, 0xE0, 0xA0, 0x43, 0x06, 0xE0, + 0x08, 0x02, 0x3C, 0x80, 0xA0, 0x06, 0xDA, 0xD4, + 0x08, 0x02, 0x42, 0x80, 0xA0, 0x06, 0xDA, 0xD4, + 0x5C, 0x04, 0x0B, 0xC3, 0x83, 0x07, 0x00, 0x68, + 0xA0, 0x06, 0x2A, 0xD8, 0x83, 0x07, 0x10, 0x80, + 0xA0, 0x06, 0x2A, 0xD8, 0x5C, 0x04, 0x0B, 0xC3, + 0xA0, 0x06, 0x14, 0xD8, 0x02, 0xA2, 0x68, 0xC2, + 0x14, 0x00, 0x29, 0x02, 0xFC, 0xFF, 0x24, 0x13, + 0x28, 0x02, 0x18, 0x00, 0x87, 0x07, 0x0E, 0x00, + 0x81, 0x07, 0x0E, 0x07, 0xF1, 0x04, 0x47, 0x06, + 0xFD, 0x15, 0x58, 0xC0, 0xB0, 0x03, 0x01, 0x78, + 0x63, 0x06, 0x41, 0x02, 0x3F, 0x00, 0x0E, 0x13, + 0x81, 0x02, 0x1F, 0x00, 0x0B, 0x1B, 0x41, 0xA0, + 0x61, 0xC0, 0x86, 0xE4, 0xF8, 0xC1, 0xC7, 0x06, + 0xC7, 0x71, 0x47, 0x06, 0x78, 0xCC, 0x47, 0x06, + 0xFD, 0x15, 0x04, 0x10, 0x58, 0xC0, 0xC1, 0x06, + 0x41, 0x70, 0x01, 0xA2, 0x49, 0xC2, 0xE5, 0x15, + 0x5C, 0x04, 0xA0, 0x23, 0x1A, 0xE0, 0x02, 0x13, + 0xC8, 0x04, 0x5B, 0x04, 0x22, 0xC2, 0x14, 0x00, + 0x48, 0x02, 0x00, 0x1F, 0xC8, 0x06, 0x5B, 0x04, + 0x83, 0x02, 0x0F, 0x00, 0x17, 0x1B, 0xA0, 0xC1, + 0xD4, 0x06, 0x35, 0x13, 0x26, 0x02, 0x04, 0x00, + 0xA0, 0xCD, 0xCE, 0xED, 0x83, 0xC5, 0x04, 0x13, + 0x4A, 0xC2, 0x39, 0x0A, 0xC9, 0xE0, 0x83, 0xC5, + 0x86, 0x07, 0x36, 0x07, 0x87, 0x07, 0x10, 0x00, + 0x20, 0xC2, 0xD4, 0x06, 0xE0, 0x04, 0xD4, 0x06, + 0x46, 0x2C, 0x5B, 0x04, 0x60, 0xC0, 0xFE, 0x06, + 0x20, 0xC2, 0x6A, 0x09, 0x48, 0x02, 0x00, 0x60, + 0x20, 0x22, 0x06, 0xE0, 0x04, 0x16, 0x20, 0xE2, + 0x0A, 0xE0, 0x20, 0xE2, 0x18, 0xE0, 0x13, 0x0A, + 0x04, 0x18, 0x41, 0x05, 0x03, 0x48, 0xFE, 0x06, + 0x06, 0x10, 0x83, 0x02, 0x02, 0x00, 0x01, 0x16, + 0x13, 0x09, 0x03, 0xE8, 0xFE, 0x06, 0xC8, 0x40, + 0xC1, 0x40, 0x05, 0x13, 0x88, 0x07, 0x36, 0x07, + 0x89, 0x07, 0x00, 0x40, 0x48, 0x2C, 0x5B, 0x04, + 0xC9, 0x04, 0x24, 0xC1, 0x94, 0xEB, 0x84, 0xC1, + 0x86, 0x71, 0x86, 0xA1, 0x26, 0x02, 0x56, 0xEC, + 0xC4, 0x06, 0x04, 0x71, 0x24, 0x02, 0xC2, 0xEB, + 0x14, 0xD2, 0xC8, 0x09, 0x08, 0xA2, 0xB0, 0x03, + 0x34, 0xD8, 0x5F, 0x06, 0x47, 0x02, 0x0F, 0x00, + 0xC7, 0xA1, 0x28, 0xC2, 0x82, 0xEB, 0x58, 0x04, + 0x76, 0xCD, 0x47, 0x06, 0xFD, 0x16, 0x32, 0x10, + 0x36, 0xC2, 0x26, 0x10, 0x17, 0x09, 0x47, 0xA1, + 0x2D, 0x10, 0x17, 0x09, 0x47, 0x61, 0x2A, 0x10, + 0xA0, 0x43, 0x16, 0xE0, 0x5B, 0x04, 0xA0, 0x43, + 0x16, 0xE0, 0x49, 0xC2, 0x03, 0x16, 0x44, 0xC2, + 0x06, 0xC8, 0x22, 0x09, 0x27, 0xC1, 0x8E, 0xED, + 0x84, 0xC1, 0x86, 0x71, 0x26, 0x02, 0xC4, 0xED, + 0xC4, 0x06, 0x04, 0x71, 0x24, 0x02, 0xAA, 0xED, + 0xD3, 0x10, 0x09, 0xC1, 0xA0, 0xC1, 0x22, 0x09, + 0xC9, 0x04, 0x10, 0x10, 0x36, 0xC2, 0x78, 0xD5, + 0x60, 0x41, 0x22, 0xE0, 0xC5, 0x05, 0x0A, 0x10, + 0x78, 0xCD, 0x47, 0x06, 0xFD, 0x15, 0x06, 0x10, + 0xA0, 0x23, 0x16, 0xE0, 0xCD, 0x16, 0x49, 0xC2, + 0xEC, 0x16, 0xD6, 0x10, 0xA0, 0xE3, 0x16, 0xE0, + 0xBB, 0x10, 0x08, 0x02, 0x5A, 0x80, 0xA0, 0x06, + 0xDA, 0xD4, 0x44, 0x10, 0xA0, 0x92, 0x0C, 0xE0, + 0x15, 0x16, 0x44, 0x02, 0x00, 0x5E, 0x14, 0x16, + 0x20, 0x48, 0xAC, 0xE4, 0x80, 0x01, 0xA0, 0x06, + 0x72, 0xD7, 0x20, 0xC8, 0x9E, 0x01, 0x9E, 0x01, + 0xE0, 0x2E, 0x01, 0x00, 0xA0, 0x43, 0x18, 0xE0, + 0xA0, 0xD2, 0x26, 0xE0, 0x83, 0x07, 0x10, 0x00, + 0xA0, 0x06, 0x2A, 0xD8, 0x60, 0x04, 0xD2, 0xCE, + 0x84, 0x07, 0x08, 0x00, 0x60, 0x04, 0x94, 0xCE, + 0x85, 0x07, 0x03, 0x02, 0x05, 0xC8, 0xCE, 0x06, + 0xA0, 0x43, 0x12, 0xE0, 0xE0, 0x04, 0xFA, 0x06, + 0xA0, 0x06, 0xA4, 0xD7, 0x08, 0x02, 0x48, 0x80, + 0xA0, 0x06, 0xDA, 0xD4, 0x17, 0x10, 0x60, 0x01, + 0x8E, 0x09, 0x00, 0x80, 0x02, 0x16, 0x60, 0x04, + 0x9C, 0xD4, 0xA0, 0x27, 0x2C, 0xE0, 0x04, 0x16, + 0x08, 0x02, 0x54, 0x80, 0xA0, 0x06, 0xDA, 0xD4, + 0x83, 0x07, 0x00, 0xA8, 0x20, 0x88, 0x08, 0x07, + 0x20, 0xE0, 0x02, 0x16, 0x83, 0x07, 0x00, 0xE8, + 0xA0, 0x06, 0x2A, 0xD8, 0x08, 0x02, 0x36, 0x00, + 0xA0, 0x06, 0xDA, 0xD4, 0x20, 0xE8, 0x0C, 0xE0, + 0x82, 0x01, 0xA0, 0x23, 0x18, 0xE0, 0x06, 0x13, + 0xA0, 0xE3, 0x18, 0xE0, 0xE0, 0x2E, 0x00, 0x00, + 0x41, 0xC0, 0xFA, 0x16, 0xA0, 0x06, 0xE6, 0xD5, + 0x82, 0xC0, 0x02, 0x13, 0x4F, 0x02, 0x80, 0xFF, + 0xC4, 0x04, 0x0F, 0xD1, 0xC4, 0x06, 0x60, 0x04, + 0x94, 0xCE, 0xA0, 0x06, 0x32, 0xDA, 0x08, 0x02, + 0x36, 0x80, 0xA0, 0x07, 0xD6, 0x06, 0x20, 0xDA, + 0xA0, 0x06, 0xDA, 0xD4, 0x10, 0x10, 0xA0, 0x06, + 0x32, 0xDA, 0x20, 0xD1, 0xCE, 0x06, 0xE6, 0x13, + 0x20, 0x78, 0x12, 0xE0, 0xCE, 0x06, 0xE2, 0x10, + 0x20, 0xC1, 0x16, 0x04, 0x14, 0x0A, 0xC4, 0x06, + 0x0A, 0x91, 0x01, 0x16, 0x5B, 0x04, 0x60, 0x04, + 0xD2, 0xCE, 0xB0, 0x03, 0x20, 0x98, 0xAB, 0xE3, + 0x65, 0x06, 0x02, 0x13, 0x60, 0x04, 0xBA, 0xCE, + 0x60, 0xC1, 0x94, 0x09, 0x02, 0x13, 0x60, 0x04, + 0x22, 0xDE, 0x60, 0xD1, 0x0E, 0xE0, 0x3D, 0x10, + 0x85, 0x07, 0xBE, 0xEA, 0x35, 0xC8, 0x8A, 0x09, + 0x15, 0xC8, 0x8C, 0x09, 0x0B, 0x10, 0xE0, 0x04, + 0xA0, 0x09, 0x20, 0xD8, 0x2E, 0x09, 0xA6, 0x09, + 0x20, 0xC8, 0xA8, 0x09, 0x8A, 0x09, 0x20, 0xC8, + 0xAA, 0x09, 0x8C, 0x09, 0xE0, 0x04, 0x8E, 0x09, + 0xCA, 0x04, 0xCD, 0x04, 0xCE, 0x04, 0xCF, 0x04, + 0xE0, 0x04, 0xA8, 0x06, 0xE0, 0x04, 0xBA, 0x06, + 0x84, 0x07, 0xA0, 0x01, 0x85, 0x07, 0x10, 0x00, + 0xF4, 0x04, 0x45, 0x06, 0xFD, 0x15, 0x84, 0x07, + 0xD8, 0x06, 0x85, 0x07, 0x34, 0x07, 0x44, 0x61, + 0xF4, 0x04, 0x45, 0x06, 0xFD, 0x15, 0x84, 0x07, + 0xC8, 0x00, 0x04, 0xC8, 0x00, 0x07, 0x84, 0x07, + 0xFF, 0x7F, 0x04, 0xC8, 0xF0, 0x06, 0x84, 0x07, + 0x06, 0x00, 0x04, 0xC8, 0xEE, 0x06, 0x85, 0x07, + 0x02, 0x0C, 0x20, 0xC1, 0x8A, 0x09, 0x01, 0x11, + 0xC5, 0x06, 0xB0, 0x03, 0x05, 0xD8, 0x65, 0x06, + 0x60, 0x04, 0xD2, 0xCE, 0xB0, 0x03, 0x20, 0x98, + 0xAA, 0xE3, 0x65, 0x06, 0x79, 0x16, 0x60, 0xD1, + 0x10, 0xE0, 0xF3, 0x10, 0x60, 0xD1, 0xAB, 0xE3, + 0xA0, 0x01, 0x8E, 0x09, 0x00, 0x02, 0xE0, 0x01, + 0x80, 0x01, 0x00, 0x20, 0xC8, 0x04, 0x20, 0xD2, + 0x80, 0x01, 0x08, 0xC8, 0x9C, 0x09, 0x08, 0xD8, + 0x2E, 0x09, 0xE3, 0x10, 0x20, 0xF8, 0x19, 0xEE, + 0x82, 0x01, 0x20, 0xC8, 0x10, 0xE0, 0xC6, 0x06, + 0x20, 0xC8, 0x20, 0xE0, 0xC8, 0x06, 0x20, 0xC8, + 0xC2, 0xEA, 0x90, 0x09, 0xE0, 0x2E, 0x00, 0x00, + 0xA0, 0x06, 0xE6, 0xD5, 0x20, 0xC8, 0x6C, 0x09, + 0xA0, 0x01, 0x20, 0xC8, 0x6E, 0x09, 0xA2, 0x01, + 0x20, 0xC8, 0x70, 0x09, 0xA4, 0x01, 0x20, 0xC8, + 0x6E, 0x09, 0xB0, 0x01, 0x20, 0xC8, 0x70, 0x09, + 0xB2, 0x01, 0x20, 0xC8, 0x70, 0x09, 0xCC, 0x06, + 0x20, 0xF8, 0x18, 0xEE, 0x80, 0x01, 0xB0, 0x03, + 0xA0, 0x01, 0x8E, 0x09, 0x00, 0x02, 0x20, 0x98, + 0xAA, 0xE3, 0x65, 0x06, 0x3A, 0x13, 0xE0, 0x01, + 0x8E, 0x09, 0x00, 0x02, 0x88, 0x07, 0x56, 0xDF, + 0xE0, 0xC2, 0x8A, 0x09, 0x05, 0x11, 0xA0, 0x01, + 0x8E, 0x09, 0x00, 0x02, 0x88, 0x07, 0x9A, 0xDF, + 0x98, 0x06, 0x08, 0x02, 0x12, 0x80, 0xA0, 0x06, + 0xDA, 0xD4, 0x84, 0x07, 0x0A, 0x00, 0x85, 0x07, + 0xF4, 0x03, 0x20, 0x88, 0xC6, 0x06, 0x20, 0xE0, + 0x08, 0x1B, 0x60, 0x01, 0x8E, 0x09, 0x00, 0x80, + 0xA5, 0x13, 0x84, 0x07, 0x1C, 0x00, 0x85, 0x07, + 0xF8, 0x03, 0xA0, 0x06, 0xA2, 0xD8, 0x85, 0x07, + 0x42, 0xDC, 0x05, 0xC8, 0xF8, 0x03, 0x20, 0xC8, + 0xA0, 0x09, 0xA0, 0x09, 0x6C, 0x16, 0x20, 0xE8, + 0x9C, 0x09, 0xFE, 0x03, 0x20, 0xE8, 0x9E, 0x09, + 0x06, 0x04, 0xA0, 0x23, 0x0C, 0xE0, 0x32, 0x13, + 0xA0, 0xE3, 0x0C, 0xE0, 0xA0, 0x2E, 0xF4, 0x03, + 0x2D, 0x10, 0xA0, 0x06, 0x56, 0xDF, 0x60, 0x01, + 0x8E, 0x09, 0x00, 0x40, 0x08, 0x13, 0x08, 0x02, + 0x6C, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0x22, 0x10, + 0xE0, 0x01, 0x8E, 0x09, 0x00, 0x40, 0x08, 0x02, + 0x60, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0x84, 0x07, + 0x2A, 0x00, 0x85, 0x07, 0xF4, 0x03, 0xA0, 0x06, + 0xA2, 0xD8, 0xD5, 0x10, 0xB0, 0x03, 0x20, 0x98, + 0xAA, 0xE3, 0x65, 0x06, 0x0F, 0x16, 0x20, 0x06, + 0x90, 0x09, 0x9A, 0x16, 0x60, 0x01, 0x8A, 0x09, + 0x00, 0x40, 0x39, 0x13, 0xE0, 0x04, 0x8A, 0x09, + 0xE0, 0x04, 0x8C, 0x09, 0xE0, 0x04, 0x8E, 0x09, + 0x60, 0x04, 0x62, 0xDA, 0x60, 0x04, 0xB0, 0xCE, + 0xB0, 0x03, 0x20, 0x98, 0x10, 0xE0, 0x65, 0x06, + 0xF9, 0x16, 0x44, 0x02, 0x00, 0x5E, 0x04, 0x16, + 0x20, 0x06, 0xC6, 0x06, 0x9A, 0x16, 0x0A, 0x10, + 0xB0, 0x03, 0x20, 0x98, 0x10, 0xE0, 0x65, 0x06, + 0xED, 0x16, 0x20, 0x06, 0xC8, 0x06, 0x02, 0x13, + 0x60, 0x04, 0x5A, 0xDB, 0x60, 0x01, 0x8E, 0x09, + 0x00, 0x01, 0x02, 0x16, 0xCE, 0x01, 0x03, 0x00, + 0x0E, 0x01, 0x03, 0x00, 0x03, 0x13, 0x83, 0x07, + 0x00, 0x82, 0x07, 0x10, 0x83, 0x07, 0x01, 0x00, + 0xE0, 0x04, 0x8E, 0x09, 0x20, 0xE8, 0x0C, 0xE0, + 0x82, 0x01, 0x60, 0x04, 0xCA, 0xCE, 0x60, 0x01, + 0x8A, 0x09, 0x00, 0x40, 0xC7, 0x16, 0x83, 0x07, + 0x0D, 0x00, 0xF2, 0x10, 0xB0, 0x03, 0x20, 0x98, + 0xAA, 0xE3, 0x65, 0x06, 0xC7, 0x16, 0x20, 0x88, + 0x98, 0x09, 0x20, 0xE0, 0xF0, 0x16, 0x22, 0xC8, + 0x0E, 0x00, 0xDC, 0x06, 0x22, 0xC8, 0x10, 0x00, + 0xDE, 0x06, 0x22, 0xC8, 0x12, 0x00, 0xE0, 0x06, + 0xE0, 0x01, 0x8E, 0x09, 0x00, 0x80, 0x08, 0x02, + 0x66, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0xB2, 0x10, + 0xA0, 0x07, 0x9A, 0x09, 0x5A, 0x00, 0xA0, 0x07, + 0xA2, 0x09, 0x19, 0x00, 0xA0, 0x07, 0xA4, 0x09, + 0x05, 0x00, 0xE0, 0x01, 0x8E, 0x09, 0x00, 0x20, + 0xE0, 0x01, 0x8E, 0x09, 0x00, 0x04, 0x08, 0x02, + 0x78, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0xB0, 0x03, + 0x20, 0x98, 0xAB, 0xE3, 0x65, 0x06, 0x9A, 0x16, + 0x08, 0x02, 0x72, 0x80, 0xA0, 0x06, 0xDA, 0xD4, + 0x20, 0xE8, 0x0C, 0xE0, 0x82, 0x01, 0xA0, 0x06, + 0xD0, 0xD5, 0x20, 0x06, 0x9A, 0x09, 0xBF, 0x13, + 0x84, 0x07, 0x2C, 0x00, 0x85, 0x07, 0xF4, 0x03, + 0xA0, 0x06, 0xA2, 0xD8, 0x60, 0x04, 0xC0, 0xDB, + 0x20, 0x48, 0x0C, 0xE0, 0x82, 0x01, 0x82, 0x10, + 0x0E, 0x01, 0x03, 0x00, 0x0A, 0x13, 0x08, 0x02, + 0x0C, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0xE0, 0xE3, + 0x14, 0xE0, 0x20, 0xC8, 0xAE, 0xE4, 0x86, 0x01, + 0x26, 0x10, 0x20, 0x48, 0x0C, 0xE0, 0x82, 0x01, + 0xE0, 0x2E, 0x01, 0x00, 0x60, 0xC1, 0x1E, 0x09, + 0x35, 0x0A, 0x05, 0xE8, 0x82, 0x01, 0x20, 0xC1, + 0x6A, 0x09, 0x04, 0x01, 0x06, 0x00, 0x06, 0x13, + 0x20, 0xD8, 0xD0, 0xE1, 0x2F, 0x09, 0x20, 0xD8, + 0xD0, 0xE1, 0x83, 0x01, 0x20, 0x21, 0x22, 0xE0, + 0x03, 0x16, 0x20, 0xE8, 0x22, 0xE0, 0x80, 0x01, + 0x20, 0x21, 0x04, 0xE0, 0x04, 0x16, 0xA0, 0xE3, + 0x14, 0xE0, 0x60, 0x04, 0x0A, 0xD3, 0x08, 0x02, + 0x00, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0x20, 0xE8, + 0x08, 0xE0, 0x82, 0x01, 0xE0, 0xC2, 0x8A, 0x09, + 0x02, 0x11, 0x60, 0x04, 0xB0, 0xCE, 0xA0, 0x01, + 0x8E, 0x09, 0x00, 0x04, 0x6B, 0x10, 0x20, 0xC8, + 0xAE, 0xE4, 0x86, 0x01, 0x08, 0x02, 0x00, 0x80, + 0xA0, 0x06, 0xDA, 0xD4, 0x20, 0xC2, 0x1E, 0x09, + 0x08, 0xA2, 0x08, 0x05, 0x28, 0xC8, 0x22, 0xE0, + 0xCA, 0x06, 0x20, 0xC8, 0x20, 0xE0, 0xC6, 0x06, + 0x20, 0xC8, 0x20, 0xE0, 0xC8, 0x06, 0x60, 0xE3, + 0x16, 0xE0, 0x60, 0x04, 0xD2, 0xCE, 0x44, 0xC1, + 0x44, 0x02, 0x00, 0x5E, 0xF8, 0x16, 0x60, 0x25, + 0xA8, 0xE4, 0x0F, 0x16, 0x20, 0x06, 0xC6, 0x06, + 0xF2, 0x16, 0x20, 0x06, 0xCA, 0x06, 0x03, 0x13, + 0xA0, 0x05, 0xCC, 0x06, 0xE6, 0x10, 0xB0, 0x03, + 0x20, 0xD8, 0x0C, 0xE0, 0x65, 0x06, 0x60, 0x04, + 0xD2, 0xCE, 0x20, 0x06, 0xC8, 0x06, 0xE3, 0x16, + 0x20, 0x88, 0x70, 0x09, 0xCC, 0x06, 0x03, 0x16, + 0x83, 0x07, 0x08, 0x00, 0x02, 0x10, 0x83, 0x07, + 0x0C, 0x00, 0x60, 0x04, 0x8A, 0xDC, 0x60, 0x04, + 0xD2, 0xCE, 0xA0, 0x23, 0x08, 0xE0, 0x03, 0x13, + 0x60, 0x23, 0x12, 0xE0, 0x06, 0x16, 0xB0, 0x03, + 0x20, 0xD8, 0xA9, 0xE3, 0x65, 0x06, 0x60, 0x04, + 0xD2, 0xCE, 0x08, 0x02, 0x00, 0x80, 0xA0, 0x06, + 0xDA, 0xD4, 0x60, 0x04, 0xB0, 0xCE, 0x08, 0x02, + 0x00, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0x20, 0xC8, + 0x1E, 0xE0, 0xC6, 0x06, 0x20, 0xC8, 0x1E, 0xE0, + 0xC8, 0x06, 0x60, 0xE3, 0x10, 0xE0, 0x60, 0x04, + 0xD2, 0xCE, 0xE0, 0x23, 0x14, 0xE0, 0x30, 0x13, + 0x44, 0xC1, 0x44, 0x02, 0x00, 0x1E, 0xF5, 0x16, + 0x60, 0x25, 0xA8, 0xE4, 0x1D, 0x16, 0x20, 0x06, + 0xC8, 0x06, 0xEF, 0x16, 0x60, 0x01, 0x8E, 0x09, + 0x00, 0x80, 0x13, 0x16, 0x60, 0x01, 0x8E, 0x09, + 0x00, 0x01, 0x0C, 0x16, 0xA0, 0x01, 0x8E, 0x09, + 0x00, 0x01, 0xA0, 0x01, 0x8E, 0x09, 0x80, 0x00, + 0xA0, 0x43, 0x04, 0xE0, 0x83, 0x07, 0x18, 0x68, + 0xA0, 0x06, 0x2A, 0xD8, 0x20, 0xC8, 0xAE, 0xE4, + 0x86, 0x01, 0xC2, 0x04, 0x60, 0x04, 0x2C, 0xE4, + 0x08, 0x02, 0x1E, 0x80, 0xA0, 0x06, 0xDA, 0xD4, + 0x07, 0x10, 0x20, 0x06, 0xC6, 0x06, 0xCD, 0x16, + 0x83, 0x07, 0x09, 0x00, 0xA0, 0x06, 0x8A, 0xDC, + 0x60, 0x04, 0xB0, 0xCE, 0xCE, 0x04, 0xE0, 0x04, + 0x2A, 0x09, 0xE0, 0xD3, 0xAA, 0xE3, 0x8F, 0xC2, + 0x20, 0xC8, 0xB0, 0xE4, 0x86, 0x01, 0x20, 0x48, + 0x08, 0xE0, 0x82, 0x01, 0x86, 0x07, 0x05, 0x00, + 0x84, 0x07, 0x72, 0x06, 0x54, 0xC1, 0x01, 0x13, + 0xD4, 0x2C, 0x24, 0x02, 0x0A, 0x00, 0x06, 0x06, + 0xF9, 0x16, 0x08, 0x02, 0x2A, 0x80, 0xA0, 0x06, + 0xDA, 0xD4, 0x20, 0x2C, 0x1A, 0xE0, 0x60, 0x04, + 0x50, 0xCD, 0xA0, 0x06, 0x3E, 0xD7, 0xCD, 0x04, + 0xA0, 0x23, 0x1C, 0xE0, 0x0D, 0x13, 0x0E, 0x01, + 0x03, 0x00, 0x0A, 0x13, 0xA0, 0xE3, 0x1C, 0xE0, + 0xB0, 0x03, 0x20, 0xD8, 0x10, 0xE0, 0x65, 0x06, + 0xA0, 0xD2, 0x26, 0xE0, 0xCF, 0x04, 0x08, 0x10, + 0x20, 0x2D, 0x01, 0x00, 0xE0, 0xC0, 0x2A, 0x09, + 0xA0, 0x06, 0x2A, 0xD8, 0xA0, 0xD2, 0xAB, 0xE3, + 0x60, 0x04, 0xD2, 0xCE, 0xA0, 0x01, 0x80, 0x01, + 0x00, 0x01, 0xE0, 0x01, 0x80, 0x01, 0x00, 0xAC, + 0xA0, 0x01, 0x82, 0x01, 0x00, 0x03, 0xE0, 0x01, + 0x82, 0x01, 0x00, 0x08, 0x88, 0x07, 0xAE, 0x01, + 0x08, 0x06, 0xFE, 0x16, 0x60, 0x01, 0x8E, 0x09, + 0x00, 0x02, 0x03, 0x16, 0xA0, 0x01, 0x80, 0x01, + 0x00, 0x20, 0xC8, 0x04, 0x20, 0xD2, 0x80, 0x01, + 0x08, 0xC8, 0x9C, 0x09, 0x08, 0xD8, 0x2E, 0x09, + 0xA0, 0x07, 0x9E, 0x09, 0x00, 0x10, 0x5B, 0x04, + 0x20, 0xD8, 0xA6, 0x09, 0x2E, 0x09, 0xE0, 0x01, + 0x80, 0x01, 0x00, 0x04, 0xE0, 0x01, 0x82, 0x01, + 0x00, 0x08, 0xA0, 0x01, 0x82, 0x01, 0x00, 0x03, + 0x20, 0xC2, 0x30, 0x09, 0x03, 0x13, 0xE0, 0x01, + 0x82, 0x01, 0x00, 0x03, 0xA0, 0x01, 0x80, 0x01, + 0x00, 0xA1, 0x20, 0xF8, 0x2E, 0x09, 0x80, 0x01, + 0x88, 0x07, 0xAE, 0x01, 0x08, 0x06, 0xFE, 0x16, + 0xA0, 0x01, 0x80, 0x01, 0x00, 0x0C, 0xE0, 0x04, + 0x9E, 0x01, 0xE0, 0x04, 0x9C, 0x09, 0xE0, 0x04, + 0x9E, 0x09, 0x5B, 0x04, 0x20, 0x01, 0xA8, 0x09, + 0x00, 0x80, 0x11, 0x13, 0xE0, 0x93, 0x26, 0xE0, + 0x0E, 0x16, 0x60, 0x01, 0x8E, 0x09, 0x00, 0x80, + 0x0A, 0x13, 0x08, 0x02, 0x84, 0x80, 0x00, 0x00, + 0x00, 0xE0, 0xDC, 0x0F, 0xA0, 0x06, 0xDA, 0xD4, + 0x20, 0x48, 0x08, 0xE0, 0x82, 0x01, 0x02, 0x10, + 0x60, 0x04, 0x70, 0xDA, 0x60, 0x04, 0xBA, 0xCE, + 0xA0, 0x06, 0x9C, 0xD5, 0x08, 0xC2, 0x19, 0x13, + 0x83, 0x07, 0x80, 0x80, 0xE0, 0x23, 0x14, 0xE0, + 0x02, 0x13, 0x83, 0x07, 0x0A, 0x00, 0x60, 0x04, + 0xC6, 0xCE, 0x20, 0xC1, 0x06, 0x06, 0x0D, 0x13, + 0xA0, 0x06, 0x9C, 0xD5, 0x08, 0xC2, 0x09, 0x13, + 0x83, 0x07, 0x0B, 0x00, 0xE0, 0x23, 0x14, 0xE0, + 0x02, 0x16, 0x83, 0x07, 0x01, 0x80, 0x60, 0x04, + 0xC6, 0xCE, 0x83, 0x07, 0x0A, 0x80, 0x60, 0x04, + 0xB4, 0xCE, 0x60, 0x01, 0x8E, 0x09, 0x00, 0x80, + 0x06, 0x16, 0xA0, 0x06, 0xA8, 0xE5, 0x47, 0x10, + 0xD0, 0x03, 0x60, 0x04, 0xB0, 0xD3, 0xE0, 0x93, + 0x0E, 0xE0, 0x5E, 0x13, 0xE0, 0x93, 0x10, 0xE0, + 0x17, 0x13, 0xE0, 0x23, 0x14, 0xE0, 0x04, 0x13, + 0x83, 0x07, 0x07, 0x00, 0x60, 0x04, 0xC6, 0xCE, + 0x83, 0x07, 0x00, 0xA0, 0xA0, 0x06, 0x2A, 0xD8, + 0x83, 0x07, 0x00, 0x48, 0xA0, 0x06, 0x2A, 0xD8, + 0xA0, 0xD2, 0x10, 0xE0, 0x20, 0xC8, 0x1C, 0xE0, + 0xCA, 0x06, 0x20, 0xC8, 0x20, 0xE0, 0xCC, 0x06, + 0xA0, 0x06, 0x3E, 0xD7, 0x08, 0x02, 0x4E, 0x80, + 0xA0, 0x06, 0xDA, 0xD4, 0xA0, 0x23, 0x1C, 0xE0, + 0x20, 0x13, 0x20, 0x88, 0x6C, 0x09, 0x0E, 0x07, + 0x1C, 0x16, 0x20, 0x88, 0x6E, 0x09, 0x10, 0x07, + 0x18, 0x16, 0x20, 0x88, 0x70, 0x09, 0x12, 0x07, + 0x14, 0x16, 0x20, 0x88, 0x0A, 0x07, 0x22, 0xE0, + 0x10, 0x13, 0x20, 0x06, 0xCA, 0x06, 0x38, 0x16, + 0xA0, 0xE3, 0x20, 0xE0, 0x06, 0x10, 0xE0, 0x23, + 0x14, 0xE0, 0xCA, 0x16, 0xA0, 0xE3, 0x22, 0xE0, + 0xC2, 0x04, 0xA0, 0xD2, 0xAA, 0xE3, 0x60, 0x04, + 0xBA, 0xCE, 0x20, 0xC8, 0x1C, 0xE0, 0xCA, 0x06, + 0xA0, 0x88, 0xDC, 0x06, 0x0E, 0x00, 0x10, 0x16, + 0xA0, 0x88, 0xDE, 0x06, 0x10, 0x00, 0x0C, 0x16, + 0xA0, 0x88, 0xE0, 0x06, 0x12, 0x00, 0x08, 0x16, + 0x20, 0x06, 0xCC, 0x06, 0x19, 0x16, 0x20, 0xE8, + 0x0E, 0xE0, 0x82, 0x01, 0xA0, 0xE3, 0x1E, 0xE0, + 0x20, 0xC8, 0x20, 0xE0, 0xCC, 0x06, 0x10, 0x10, + 0xA0, 0x23, 0x10, 0xE0, 0x08, 0x16, 0x64, 0xC1, + 0x06, 0x00, 0x60, 0x21, 0x0C, 0xE0, 0x08, 0x13, + 0xA0, 0xD2, 0xA8, 0xE3, 0x05, 0x10, 0x20, 0x88, + 0x0A, 0x07, 0x08, 0x07, 0x96, 0x12, 0x00, 0x10, + 0x60, 0x04, 0xBA, 0xCE, 0x60, 0x01, 0x8E, 0x09, + 0x00, 0x80, 0x06, 0x16, 0x83, 0x07, 0x00, 0x82, + 0xA0, 0x06, 0x2A, 0xD8, 0x60, 0x04, 0xCA, 0xCE, + 0xE0, 0x93, 0x0E, 0xE0, 0x50, 0x13, 0xE0, 0x93, + 0xA9, 0xE3, 0x4D, 0x13, 0xE0, 0x93, 0xA8, 0xE3, + 0x1C, 0x13, 0xA0, 0x06, 0xA4, 0xD7, 0xA0, 0x23, + 0x10, 0xE0, 0x45, 0x13, 0xA0, 0x23, 0x08, 0xE0, + 0x06, 0x16, 0x60, 0xE3, 0x1E, 0xE0, 0x20, 0xC8, + 0x22, 0xE0, 0x06, 0x07, 0x34, 0x10, 0xE0, 0x23, + 0x14, 0xE0, 0x31, 0x16, 0x60, 0xC1, 0x6A, 0x09, + 0x60, 0x21, 0x12, 0xE0, 0x2C, 0x16, 0xA0, 0x06, + 0x0E, 0xE2, 0x31, 0x10, 0xA0, 0xD2, 0xA8, 0xE3, + 0x2E, 0x10, 0xA0, 0xE3, 0x12, 0xE0, 0xA0, 0x06, + 0x0E, 0xE2, 0x64, 0xC1, 0x06, 0x00, 0x60, 0x21, + 0x0C, 0xE0, 0x25, 0x13, 0x20, 0x88, 0x0E, 0x07, + 0xDC, 0x06, 0x14, 0x16, 0x20, 0x88, 0x10, 0x07, + 0xDE, 0x06, 0x10, 0x16, 0x20, 0x88, 0x12, 0x07, + 0xE0, 0x06, 0x0C, 0x16, 0x20, 0x98, 0xCE, 0x06, + 0xCF, 0x06, 0x15, 0x13, 0x20, 0x06, 0xCE, 0x06, + 0x12, 0x16, 0x60, 0xE3, 0x1A, 0xE0, 0xA0, 0xD2, + 0x0C, 0xE0, 0x0D, 0x10, 0x60, 0xE3, 0x1E, 0xE0, + 0x20, 0xC8, 0x32, 0xE0, 0x06, 0x07, 0xA0, 0x06, + 0x3E, 0xD7, 0x08, 0x02, 0x48, 0x80, 0xA0, 0x06, + 0xDA, 0xD4, 0xA0, 0xD2, 0xA9, 0xE3, 0x60, 0x04, + 0xBA, 0xCE, 0x22, 0x88, 0x0E, 0x00, 0x6C, 0x09, + 0xC9, 0x1A, 0x0B, 0x1B, 0x22, 0x88, 0x10, 0x00, + 0x6E, 0x09, 0xC4, 0x1A, 0x06, 0x1B, 0x22, 0x88, + 0x12, 0x00, 0x70, 0x09, 0xBF, 0x1A, 0x01, 0x1B, + 0x5B, 0x04, 0x60, 0xC1, 0x6C, 0x01, 0x85, 0x02, + 0x43, 0x00, 0xE1, 0x13, 0xE0, 0x93, 0xA8, 0xE3, + 0xDE, 0x16, 0xA0, 0xC8, 0x00, 0xEE, 0x02, 0x00, + 0x84, 0x07, 0x0E, 0x00, 0x42, 0xC1, 0xA0, 0xC0, + 0x6C, 0x01, 0x02, 0xC0, 0x25, 0x02, 0x48, 0x00, + 0x81, 0x07, 0x60, 0xE2, 0x83, 0x07, 0x14, 0xAE, + 0x60, 0x04, 0x9E, 0xE5, 0x02, 0x02, 0x00, 0xFC, + 0xCA, 0x10, 0x60, 0x01, 0x8E, 0x09, 0x00, 0x80, + 0x06, 0x16, 0x83, 0x07, 0x00, 0x82, 0xA0, 0x06, + 0x2A, 0xD8, 0x60, 0x04, 0xCA, 0xCE, 0x20, 0x98, + 0x0E, 0xE0, 0x65, 0x06, 0x03, 0x16, 0x20, 0xD8, + 0xA8, 0xE3, 0x65, 0x06, 0xE0, 0x93, 0xA9, 0xE3, + 0x0D, 0x13, 0xA0, 0x23, 0x08, 0xE0, 0x19, 0x16, + 0xA0, 0x23, 0x10, 0xE0, 0x16, 0x13, 0x60, 0xE3, + 0x1E, 0xE0, 0x20, 0xC8, 0x20, 0xE0, 0x06, 0x07, + 0xA0, 0x06, 0x3E, 0xD7, 0xA0, 0x43, 0x18, 0xE0, + 0xE0, 0x2E, 0x01, 0x00, 0xA0, 0xD2, 0x26, 0xE0, + 0x83, 0x07, 0x10, 0x00, 0xA0, 0x06, 0x2A, 0xD8, + 0xE0, 0x23, 0x14, 0xE0, 0x02, 0x16, 0xA0, 0x06, + 0x18, 0xD7, 0xA0, 0x43, 0x2C, 0xE0, 0x20, 0xC8, + 0x20, 0xE0, 0x24, 0x09, 0x60, 0x04, 0xBA, 0xCE, + 0xA0, 0x06, 0xA8, 0xE5, 0x01, 0x10, 0x03, 0x10, + 0x20, 0x07, 0xA0, 0x09, 0x03, 0x10, 0xA0, 0x07, + 0xA2, 0x09, 0x19, 0x00, 0x60, 0x04, 0xBA, 0xCE, + 0xA0, 0x43, 0x0E, 0xE0, 0xA0, 0xC1, 0x24, 0x09, + 0x02, 0x13, 0x20, 0x06, 0x24, 0x09, 0xE0, 0x23, + 0x14, 0xE0, 0x03, 0x13, 0xA0, 0x23, 0x08, 0xE0, + 0x29, 0x16, 0x20, 0xC2, 0x8A, 0x09, 0xE4, 0x11, + 0x08, 0x02, 0x42, 0x80, 0xA0, 0x06, 0xDA, 0xD4, + 0xA0, 0x23, 0x08, 0xE0, 0x1F, 0x16, 0xA0, 0x23, + 0x10, 0xE0, 0x0A, 0x16, 0x22, 0xC1, 0x02, 0x00, + 0x20, 0x25, 0xA8, 0xE4, 0x23, 0x16, 0x83, 0x07, + 0x20, 0x80, 0xA0, 0x06, 0x2A, 0xD8, 0x12, 0x10, + 0xA0, 0x06, 0x3E, 0xD7, 0xE0, 0x23, 0x14, 0xE0, + 0x02, 0x16, 0xA0, 0x06, 0x18, 0xD7, 0x60, 0xE3, + 0x1E, 0xE0, 0x20, 0xC8, 0x20, 0xE0, 0x06, 0x07, + 0xA0, 0x23, 0x08, 0xE0, 0x03, 0x16, 0xA0, 0x23, + 0x06, 0xE0, 0x51, 0x13, 0x20, 0x98, 0x0E, 0xE0, + 0x65, 0x06, 0x03, 0x16, 0x20, 0xD8, 0xA8, 0xE3, + 0x65, 0x06, 0x22, 0xC1, 0x02, 0x00, 0x20, 0x25, + 0xA8, 0xE4, 0x0E, 0x13, 0x83, 0x07, 0x20, 0x00, + 0xA0, 0x06, 0x2A, 0xD8, 0x22, 0xC8, 0x0E, 0x00, + 0xE6, 0x06, 0x22, 0xC8, 0x10, 0x00, 0xE8, 0x06, + 0x22, 0xC8, 0x12, 0x00, 0xEA, 0x06, 0x37, 0x10, + 0x22, 0x88, 0x0E, 0x00, 0xDC, 0x06, 0x08, 0x16, + 0x22, 0x88, 0x10, 0x00, 0xDE, 0x06, 0x04, 0x16, + 0x22, 0x88, 0x12, 0x00, 0xE0, 0x06, 0x0B, 0x13, + 0x22, 0xC8, 0x0E, 0x00, 0xDC, 0x06, 0x22, 0xC8, + 0x10, 0x00, 0xDE, 0x06, 0x22, 0xC8, 0x12, 0x00, + 0xE0, 0x06, 0x60, 0xE3, 0x14, 0xE0, 0xA0, 0x23, + 0x0E, 0xE0, 0x08, 0x16, 0xA0, 0xC1, 0x24, 0x09, + 0x1A, 0x16, 0x86, 0x07, 0x00, 0x10, 0x06, 0xE8, + 0xD2, 0x06, 0x15, 0x10, 0xA0, 0xE3, 0x0E, 0xE0, + 0xA0, 0x23, 0x08, 0xE0, 0x09, 0x16, 0xA0, 0xE3, + 0x06, 0xE0, 0xE0, 0x04, 0xE6, 0x06, 0xE0, 0x04, + 0xE8, 0x06, 0xE0, 0x04, 0xEA, 0x06, 0x07, 0x10, + 0x08, 0x02, 0x36, 0x80, 0xA0, 0x07, 0xD6, 0x06, + 0x36, 0xD3, 0xA0, 0x06, 0xDA, 0xD4, 0x60, 0x04, + 0xBA, 0xCE, 0x20, 0x98, 0x65, 0x06, 0x10, 0xE0, + 0x03, 0x16, 0x20, 0xD8, 0x0E, 0xE0, 0x65, 0x06, + 0x60, 0x04, 0xBA, 0xCE, 0xE0, 0x23, 0x14, 0xE0, + 0x02, 0x13, 0x60, 0x04, 0xBA, 0xCE, 0x2E, 0x10, + 0xB0, 0x03, 0x20, 0x98, 0xA9, 0xE3, 0x6F, 0x06, + 0x19, 0x16, 0x24, 0xC2, 0x08, 0x00, 0x16, 0x11, + 0xE0, 0xE3, 0x14, 0xE0, 0x83, 0x07, 0x00, 0x00, + 0xA0, 0x06, 0x2A, 0xD8, 0xA0, 0x23, 0x14, 0xE0, + 0x04, 0x13, 0x08, 0x02, 0x06, 0x80, 0xA0, 0x06, + 0xDA, 0xD4, 0x08, 0x02, 0x1E, 0x00, 0xA0, 0x06, + 0xDA, 0xD4, 0xA0, 0x23, 0x08, 0xE0, 0x02, 0x13, + 0xA0, 0x06, 0x18, 0xD7, 0x82, 0xC0, 0x02, 0x16, + 0x60, 0x04, 0xD2, 0xCE, 0x20, 0xE8, 0x1C, 0xEE, + 0xF0, 0x06, 0x20, 0x99, 0x0E, 0xE0, 0x16, 0x00, + 0x05, 0x16, 0xE0, 0x04, 0xEC, 0x06, 0x20, 0x48, + 0x14, 0xE0, 0xF0, 0x06, 0x83, 0x07, 0x01, 0x00, + 0x60, 0x04, 0xB4, 0xCE, 0x64, 0xC2, 0x14, 0x00, + 0x24, 0x02, 0x18, 0x00, 0xC4, 0xC1, 0xC2, 0x61, + 0x27, 0x02, 0xFC, 0xFF, 0x74, 0xC1, 0x85, 0xC1, + 0x45, 0x71, 0x85, 0x02, 0x27, 0x00, 0x46, 0x16, + 0x54, 0xC1, 0x45, 0x02, 0xCF, 0xFF, 0x42, 0x16, + 0xC8, 0x04, 0x64, 0xC1, 0x08, 0x00, 0x06, 0x15, + 0x05, 0x13, 0x24, 0xC2, 0x0E, 0x00, 0x48, 0x02, + 0x00, 0x1F, 0xC8, 0x06, 0x28, 0x02, 0x11, 0x00, + 0x04, 0xA2, 0x18, 0x98, 0x21, 0xEE, 0x32, 0x16, + 0x42, 0xC1, 0x25, 0x02, 0x04, 0x00, 0x47, 0x65, + 0x35, 0xC2, 0x74, 0xCD, 0x48, 0x06, 0xFD, 0x15, + 0xA0, 0xC0, 0x6C, 0x01, 0x02, 0xC1, 0x04, 0xC8, + 0x6C, 0x01, 0xA0, 0xC1, 0x00, 0xFC, 0x05, 0x13, + 0x20, 0xC8, 0x80, 0xEB, 0x02, 0xFC, 0x06, 0xC1, + 0xF6, 0x10, 0x20, 0xC8, 0x00, 0xEE, 0x02, 0xFC, + 0x02, 0xC8, 0x6C, 0x01, 0x81, 0x07, 0x08, 0xE5, + 0x04, 0xC0, 0x83, 0x07, 0x10, 0x02, 0x84, 0x07, + 0x0E, 0x00, 0x3B, 0x10, 0x84, 0x07, 0x0C, 0x00, + 0xE2, 0xC0, 0x08, 0x00, 0x05, 0x02, 0x00, 0xFC, + 0xA0, 0xC0, 0x6C, 0x01, 0x02, 0xC0, 0x95, 0xC1, + 0x30, 0x13, 0xD5, 0x04, 0x16, 0x2E, 0x02, 0xC8, + 0x6C, 0x01, 0x2B, 0x10, 0xA0, 0xC8, 0x22, 0xEE, + 0x0E, 0x00, 0xA0, 0xC8, 0x24, 0xEE, 0x10, 0x00, + 0xA0, 0xC8, 0x26, 0xEE, 0x12, 0x00, 0x83, 0x07, + 0x06, 0x80, 0x60, 0x04, 0xB4, 0xCE, 0x60, 0x04, + 0xD2, 0xCE, 0x84, 0x07, 0x10, 0x00, 0x85, 0x07, + 0x34, 0x00, 0x09, 0x10, 0x84, 0x07, 0x12, 0x00, + 0x85, 0x07, 0x32, 0x00, 0x04, 0x10, 0x84, 0x07, + 0x14, 0x00, 0x85, 0x07, 0x38, 0x00, 0xA0, 0x06, + 0xC2, 0xD5, 0x85, 0xC8, 0x04, 0x00, 0xA0, 0x06, + 0x10, 0xD6, 0xA0, 0xC8, 0x00, 0xEE, 0x02, 0x00, + 0xA0, 0xC0, 0x6C, 0x01, 0x02, 0xC0, 0x48, 0x06, + 0x48, 0xC1, 0xA0, 0x06, 0xA2, 0xD8, 0x07, 0x02, + 0xA2, 0x06, 0x60, 0xC5, 0x02, 0xFC, 0x25, 0x02, + 0xF4, 0xFF, 0x05, 0xC8, 0x02, 0xFC, 0x20, 0xC2, + 0x6C, 0x01, 0xA0, 0x06, 0xFC, 0xB4, 0x60, 0x04, + 0xB0, 0xCE, 0xA0, 0x06, 0xA2, 0xD8, 0x07, 0x02, + 0xB4, 0x06, 0xEF, 0x10, 0x22, 0x88, 0x12, 0x00, + 0x70, 0x09, 0x08, 0x16, 0x22, 0x88, 0x10, 0x00, + 0x6E, 0x09, 0x04, 0x16, 0x22, 0x88, 0x0E, 0x00, + 0x6C, 0x09, 0x0E, 0x13, 0x22, 0x88, 0x12, 0x00, + 0xE0, 0x06, 0x08, 0x16, 0x22, 0x88, 0x10, 0x00, + 0xDE, 0x06, 0x04, 0x16, 0x22, 0x88, 0x0E, 0x00, + 0xDC, 0x06, 0x01, 0x13, 0xCB, 0x05, 0xCB, 0x05, + 0x5B, 0x04, 0x0B, 0xC3, 0x00, 0x03, 0x02, 0x00, + 0x82, 0x07, 0xC0, 0x00, 0x20, 0xC8, 0x0C, 0x00, + 0xC0, 0x00, 0x20, 0xC8, 0x0E, 0x00, 0xC2, 0x00, + 0x20, 0xC8, 0x10, 0x00, 0xC4, 0x00, 0x20, 0xC8, + 0x12, 0x00, 0xC6, 0x00, 0x20, 0xC8, 0x14, 0x00, + 0xC8, 0x00, 0x20, 0xC8, 0x16, 0x00, 0xCA, 0x00, + 0x20, 0xC8, 0x04, 0x00, 0xCC, 0x00, 0x20, 0xC8, + 0x06, 0x00, 0xCE, 0x00, 0x02, 0xC8, 0x0C, 0x00, + 0xA0, 0x07, 0x0E, 0x00, 0x7E, 0xE6, 0x02, 0xC8, + 0x10, 0x00, 0xA0, 0x07, 0x12, 0x00, 0x88, 0xE6, + 0x02, 0xC8, 0x14, 0x00, 0xA0, 0x07, 0x16, 0x00, + 0xB8, 0xE6, 0x02, 0xC8, 0x04, 0x00, 0xA0, 0x07, + 0x06, 0x00, 0xCE, 0xE6, 0x60, 0x01, 0x1C, 0x01, + 0x04, 0x00, 0x09, 0x16, 0xE0, 0x01, 0x40, 0x01, + 0x00, 0x08, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x40, + 0xE0, 0x01, 0x40, 0x01, 0x00, 0x04, 0xA0, 0x06, + 0x8E, 0xE9, 0x05, 0x02, 0x00, 0x80, 0x05, 0xD8, + 0x80, 0x04, 0xC7, 0x04, 0x00, 0x03, 0x0F, 0x00, + 0x88, 0x07, 0x00, 0x10, 0x09, 0x02, 0x00, 0x20, + 0x8A, 0x07, 0xE6, 0xE6, 0x03, 0x02, 0x3E, 0xE6, + 0x5A, 0x04, 0x00, 0x03, 0x00, 0x00, 0x20, 0xD2, + 0x87, 0x01, 0x06, 0x10, 0x00, 0x03, 0x00, 0x00, + 0x20, 0xC2, 0x8A, 0x01, 0x08, 0x02, 0x00, 0x1A, + 0x60, 0xC2, 0xAE, 0x00, 0x48, 0xDA, 0x80, 0x04, + 0x89, 0x05, 0x89, 0x02, 0x06, 0x00, 0x07, 0x15, + 0x88, 0x07, 0x00, 0x80, 0x48, 0xDA, 0x80, 0x04, + 0x09, 0xC8, 0xAE, 0x00, 0x80, 0x03, 0xE0, 0x02, + 0xA0, 0x00, 0x5C, 0x04, 0x00, 0x03, 0x00, 0x00, + 0x60, 0x01, 0x9C, 0x01, 0x20, 0x00, 0xE2, 0x13, + 0x20, 0xC2, 0x8C, 0x01, 0x08, 0x02, 0x00, 0x1C, + 0xE3, 0x10, 0x00, 0x03, 0x00, 0x00, 0x60, 0x01, + 0x40, 0x01, 0x00, 0x40, 0xEC, 0x16, 0xA0, 0x01, + 0x40, 0x01, 0x00, 0x40, 0x08, 0x02, 0x00, 0x02, + 0xD7, 0x10, 0xB3, 0xC0, 0x92, 0x06, 0xFD, 0x10, + 0xB3, 0xC0, 0x48, 0xC0, 0x72, 0xCC, 0x72, 0xCC, + 0x32, 0xC1, 0x44, 0xCC, 0x72, 0xDC, 0x04, 0x06, + 0xFD, 0x16, 0x5B, 0x04, 0x48, 0xC0, 0x02, 0x02, + 0xD0, 0xE9, 0x84, 0x07, 0x06, 0x00, 0xF6, 0x10, + 0x02, 0x02, 0x1E, 0xE6, 0x49, 0xC0, 0x84, 0x07, + 0x06, 0x00, 0xF0, 0x10, 0xB3, 0xC0, 0x32, 0xC1, + 0x01, 0x02, 0x01, 0x00, 0x44, 0xD0, 0xC1, 0x06, + 0x44, 0x02, 0xFF, 0x00, 0xE7, 0x10, 0x33, 0xC1, + 0x73, 0xC0, 0x44, 0xD1, 0x44, 0x02, 0xFF, 0x00, + 0x45, 0xDC, 0x04, 0x06, 0xFD, 0x16, 0x5A, 0x04, + 0xA0, 0x06, 0x0E, 0xE9, 0x33, 0xC8, 0x9E, 0x01, + 0x5A, 0x04, 0xA0, 0x06, 0x0C, 0xE7, 0x89, 0xC1, + 0xA6, 0x09, 0x66, 0x02, 0x40, 0x00, 0x06, 0xC8, + 0x8A, 0x01, 0x88, 0xC1, 0xA6, 0x09, 0x66, 0x02, + 0x40, 0x00, 0x06, 0xC8, 0x8C, 0x01, 0xC2, 0x04, + 0xC7, 0xC1, 0x03, 0x16, 0x02, 0x06, 0xFC, 0x16, + 0x4D, 0x10, 0x5A, 0x04, 0xA0, 0x06, 0x58, 0xE8, + 0x89, 0xC1, 0xA6, 0x09, 0x66, 0x02, 0x40, 0x00, + 0x06, 0xC8, 0x8A, 0x01, 0x88, 0xC1, 0xA6, 0x09, + 0x66, 0x02, 0x40, 0x00, 0x06, 0xC8, 0x8C, 0x01, + 0x33, 0xC8, 0x9E, 0x01, 0xE8, 0x10, 0x33, 0x8A, + 0x02, 0x00, 0x38, 0x16, 0x73, 0x8A, 0x02, 0x00, + 0x35, 0x16, 0x5A, 0x04, 0x20, 0x8A, 0xCA, 0xE9, + 0x02, 0x00, 0x30, 0x16, 0x60, 0x8A, 0xCE, 0xE9, + 0x02, 0x00, 0x2C, 0x16, 0x82, 0x07, 0x74, 0xEA, + 0x01, 0x10, 0xB3, 0xC0, 0x04, 0x02, 0x80, 0x04, + 0x52, 0xD1, 0x03, 0x13, 0x32, 0x9D, 0x22, 0x16, + 0xFB, 0x10, 0x85, 0x07, 0x00, 0x80, 0x05, 0xD8, + 0x80, 0x04, 0xC7, 0x04, 0x5A, 0x04, 0x20, 0xC8, + 0xC0, 0x00, 0x0C, 0x00, 0x20, 0xC8, 0xC2, 0x00, + 0x0E, 0x00, 0x20, 0xC8, 0xC4, 0x00, 0x10, 0x00, + 0x20, 0xC8, 0xC6, 0x00, 0x12, 0x00, 0x20, 0xC8, + 0xC8, 0x00, 0x14, 0x00, 0x20, 0xC8, 0xCA, 0x00, + 0x16, 0x00, 0x20, 0xC8, 0xCC, 0x00, 0x04, 0x00, + 0x20, 0xC8, 0xCE, 0x00, 0x06, 0x00, 0x00, 0x03, + 0x0F, 0x00, 0xCC, 0x05, 0x5C, 0x04, 0xE0, 0x04, + 0x82, 0x01, 0x02, 0x02, 0x18, 0xE6, 0x32, 0xC8, + 0x82, 0x01, 0x32, 0xC8, 0x80, 0x01, 0xA0, 0x06, + 0x24, 0xE8, 0x12, 0xC8, 0x82, 0x01, 0xCA, 0xC2, + 0x84, 0x07, 0xD0, 0x07, 0xE0, 0x04, 0x84, 0x01, + 0x04, 0x06, 0xFC, 0x16, 0x20, 0xC1, 0x84, 0x01, + 0xE9, 0x16, 0x04, 0x02, 0x32, 0x00, 0x85, 0x07, + 0x00, 0x80, 0x05, 0xD8, 0x80, 0x04, 0xC7, 0x04, + 0x60, 0xC1, 0x86, 0x01, 0x04, 0x06, 0xFC, 0x16, + 0x20, 0xC1, 0x84, 0x01, 0x5B, 0x04, 0xB3, 0xC0, + 0xB3, 0xC4, 0x5B, 0x04, 0x48, 0xC0, 0xB3, 0xC0, + 0x73, 0xA0, 0x42, 0xC4, 0x5B, 0x04, 0x33, 0x88, + 0x84, 0x01, 0xE6, 0x16, 0x5A, 0x04, 0x89, 0xC1, + 0xA6, 0x09, 0x66, 0x02, 0x40, 0x00, 0x06, 0xC8, + 0x8A, 0x01, 0x5B, 0x04, 0xC5, 0x04, 0xA0, 0x07, + 0x9C, 0x01, 0x40, 0x00, 0x60, 0x01, 0x9C, 0x01, + 0x40, 0x00, 0x03, 0x13, 0x05, 0x06, 0xF7, 0x16, + 0x5C, 0x04, 0x5B, 0x04, 0xA0, 0x06, 0xAC, 0xE8, + 0x60, 0xC0, 0x40, 0x01, 0x05, 0xC8, 0x40, 0x01, + 0x02, 0xC5, 0x01, 0xC8, 0x40, 0x01, 0x5A, 0x04, + 0xA0, 0x06, 0xAC, 0xE8, 0x08, 0xA1, 0xF4, 0x10, + 0xB3, 0xC0, 0x33, 0xC1, 0x60, 0xC1, 0x40, 0x01, + 0x85, 0x01, 0x00, 0x04, 0xC5, 0x01, 0x00, 0x10, + 0x5B, 0x04, 0x08, 0xC1, 0x09, 0xC2, 0x44, 0xC2, + 0x5B, 0x04, 0x05, 0x02, 0xC8, 0x00, 0x05, 0x06, + 0xFE, 0x16, 0x5B, 0x04, 0x33, 0xC1, 0x03, 0xC0, + 0xC4, 0xC0, 0x5B, 0x04, 0xC0, 0xC0, 0x5B, 0x04, + 0xE0, 0x94, 0x9E, 0x01, 0xC2, 0x16, 0xC3, 0x05, + 0x5B, 0x04, 0x73, 0xC0, 0xA0, 0x06, 0x26, 0xE9, + 0x2D, 0x02, 0x08, 0x00, 0x85, 0x07, 0x08, 0x00, + 0x71, 0x9F, 0xB7, 0x16, 0x05, 0x06, 0xFC, 0x16, + 0x5A, 0x04, 0x02, 0x02, 0x24, 0xE6, 0x60, 0x04, + 0x10, 0xE7, 0xE9, 0x8C, 0x04, 0x00, 0xAD, 0x16, + 0x5B, 0x04, 0x20, 0xC1, 0x80, 0x01, 0x85, 0x07, + 0xD0, 0x07, 0xE0, 0x01, 0x80, 0x01, 0x00, 0x04, + 0x45, 0x06, 0xFE, 0x16, 0x04, 0xC8, 0x80, 0x01, + 0x5B, 0x04, 0x33, 0xC1, 0x48, 0xC3, 0x04, 0xC1, + 0x04, 0x13, 0x2D, 0x02, 0x00, 0x04, 0x04, 0x06, + 0xFC, 0x16, 0x5B, 0x04, 0x8D, 0xC3, 0xA0, 0x06, + 0x26, 0xE9, 0x8D, 0xC1, 0xA6, 0x09, 0x66, 0x02, + 0x40, 0x00, 0x86, 0xC7, 0x5A, 0x04, 0x8D, 0xC1, + 0xA6, 0x09, 0x66, 0x02, 0x40, 0x00, 0x06, 0xC8, + 0x8A, 0x01, 0x5B, 0x04, 0x8D, 0xC1, 0xA6, 0x09, + 0x66, 0x02, 0x40, 0x00, 0x06, 0xC8, 0x8C, 0x01, + 0x5B, 0x04, 0x4D, 0xC0, 0x04, 0x02, 0x28, 0x00, + 0x85, 0x07, 0x00, 0x55, 0x60, 0x04, 0x34, 0xE7, + 0x4D, 0xC0, 0xB3, 0xC0, 0x32, 0xC1, 0x60, 0x04, + 0xF8, 0xE6, 0x33, 0xC1, 0x60, 0x01, 0x1C, 0x01, + 0x04, 0x00, 0x01, 0x16, 0x5B, 0x04, 0xC4, 0xC0, + 0x5B, 0x04, 0x89, 0x07, 0x66, 0xE5, 0x39, 0xC2, + 0x07, 0x13, 0x39, 0xC6, 0x39, 0x86, 0x25, 0x16, + 0x39, 0xC6, 0x39, 0x86, 0x22, 0x16, 0xF7, 0x10, + 0x02, 0x02, 0xAC, 0xE9, 0xC4, 0x04, 0xC5, 0x04, + 0x39, 0xC2, 0x02, 0x13, 0x60, 0x04, 0xE8, 0xE9, + 0x02, 0x02, 0xBA, 0xE9, 0xC4, 0x04, 0x39, 0xC2, + 0x03, 0x13, 0x79, 0xC1, 0x60, 0x04, 0xE8, 0xE9, + 0x02, 0x02, 0xCA, 0xE9, 0xC5, 0x04, 0x39, 0xC2, + 0x03, 0x13, 0x39, 0xC1, 0x60, 0x04, 0xE8, 0xE9, + 0x79, 0xC0, 0xB9, 0xC0, 0x81, 0x60, 0xC2, 0x05, + 0x12, 0x09, 0xF1, 0x04, 0x02, 0x06, 0xFD, 0x16, + 0x5B, 0x04, 0x5C, 0x04, 0x01, 0x02, 0xAA, 0xAA, + 0x01, 0xC6, 0x44, 0xE0, 0x45, 0x40, 0x58, 0x80, + 0xF8, 0x16, 0x01, 0x02, 0x14, 0x00, 0x01, 0x06, + 0xFE, 0x16, 0x01, 0x02, 0x55, 0x55, 0x01, 0xC6, + 0x44, 0xE0, 0x45, 0x40, 0x58, 0x80, 0xED, 0x16, + 0x52, 0x04, 0xE0, 0x02, 0xA0, 0x00, 0x88, 0x07, + 0xC0, 0x00, 0x09, 0x02, 0x62, 0xEA, 0x84, 0x07, + 0x2A, 0xE6, 0x05, 0x02, 0x01, 0x00, 0x8B, 0xC2, + 0xCC, 0x04, 0xA0, 0x06, 0x6C, 0xEA, 0x60, 0x2C, + 0x01, 0x00, 0x99, 0x06, 0xA0, 0x2C, 0x02, 0x00, + 0x99, 0x06, 0x20, 0x2D, 0x04, 0x00, 0x99, 0x06, + 0x20, 0x2E, 0x08, 0x00, 0x99, 0x06, 0xA0, 0x2F, + 0x10, 0x00, 0x8C, 0x05, 0x09, 0x16, 0x80, 0xCC, + 0x81, 0xC4, 0x83, 0x07, 0xB0, 0xEA, 0x88, 0xC0, + 0x02, 0x04, 0x8C, 0x05, 0x01, 0x16, 0x33, 0x10, + 0xE0, 0x02, 0xA0, 0x00, 0x5A, 0x04, 0x8C, 0x05, + 0xFB, 0x16, 0x80, 0xCC, 0x81, 0xC4, 0x15, 0x0A, + 0xB4, 0xC0, 0x12, 0xC0, 0x88, 0xCC, 0x52, 0xC0, + 0xB4, 0xC4, 0x42, 0x06, 0x5B, 0x04, 0x2D, 0x07, + 0x18, 0x00, 0x41, 0x8B, 0x0A, 0x00, 0xEC, 0x16, + 0xC1, 0x82, 0xEA, 0x16, 0xC2, 0x02, 0x42, 0x02, + 0x00, 0x02, 0xE6, 0x16, 0x80, 0x03, 0x81, 0x07, + 0x01, 0x00, 0xF1, 0x10, 0x01, 0x02, 0x02, 0x00, + 0xEE, 0x10, 0x01, 0x02, 0x04, 0x00, 0xEB, 0x10, + 0x01, 0x02, 0x08, 0x00, 0xE8, 0x10, 0x01, 0x02, + 0x10, 0x00, 0xE5, 0x10, 0xA1, 0x02, 0x41, 0x8B, + 0x10, 0x00, 0x02, 0x13, 0x60, 0x04, 0x5C, 0xEA, + 0x2D, 0x07, 0x18, 0x00, 0x80, 0x03, 0x09, 0x02, + 0x00, 0x08, 0x03, 0x02, 0x04, 0x00, 0xC7, 0x04, + 0xA0, 0x06, 0xDC, 0xEB, 0x60, 0x01, 0x1C, 0x01, + 0x04, 0x00, 0x1C, 0x16, 0xA0, 0x01, 0x40, 0x01, + 0x00, 0x08, 0xE0, 0x01, 0x40, 0x01, 0x00, 0x10, + 0x04, 0x02, 0x01, 0x00, 0x44, 0xCE, 0xC4, 0x06, + 0x44, 0xC6, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x10, + 0x49, 0x06, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x40, + 0xE0, 0x01, 0x40, 0x01, 0x00, 0x04, 0xE0, 0x01, + 0x40, 0x01, 0x00, 0x08, 0xA0, 0x06, 0x7A, 0xEC, + 0xA0, 0x06, 0x7A, 0xEC, 0xC7, 0x05, 0x04, 0x02, + 0xE4, 0xE4, 0xE0, 0x04, 0xD0, 0x03, 0x74, 0xC1, + 0xB4, 0xC1, 0x86, 0x05, 0x1C, 0x13, 0xE0, 0x02, + 0xC0, 0x00, 0x00, 0x02, 0x00, 0x00, 0x40, 0xC0, + 0x80, 0xC0, 0xC0, 0xC0, 0x00, 0xC1, 0x40, 0xC1, + 0x80, 0xC1, 0xC0, 0xC1, 0x00, 0xC2, 0x40, 0xC2, + 0x80, 0xC2, 0xC0, 0xC2, 0x00, 0xC3, 0x40, 0xC3, + 0x80, 0xC3, 0xC0, 0xC3, 0xA0, 0x04, 0xAA, 0x00, + 0xD0, 0x03, 0xD0, 0x03, 0x3F, 0x10, 0x85, 0x05, + 0x85, 0x81, 0xE1, 0x13, 0xE4, 0x10, 0xC7, 0x05, + 0x05, 0x02, 0xFF, 0x7F, 0x45, 0xA1, 0xD0, 0x03, + 0xD0, 0x03, 0x34, 0x10, 0xC0, 0xCC, 0xC1, 0xC4, + 0x03, 0x02, 0x28, 0x00, 0xA0, 0x06, 0xDC, 0xEB, + 0xE0, 0x01, 0x42, 0x01, 0x00, 0x10, 0xC7, 0x05, + 0xD0, 0x03, 0xD0, 0x03, 0x27, 0x10, 0xC7, 0x05, + 0xA0, 0xC1, 0x4A, 0x01, 0xA0, 0x07, 0x4A, 0x01, + 0x00, 0x0E, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x02, + 0x20, 0x07, 0x44, 0x01, 0x60, 0xC1, 0x44, 0x01, + 0x85, 0x02, 0x00, 0xFF, 0x17, 0x16, 0xE0, 0x01, + 0x40, 0x01, 0x00, 0x22, 0x05, 0x02, 0xC0, 0x00, + 0x05, 0x06, 0xD0, 0x03, 0xFD, 0x16, 0x60, 0xC1, + 0x46, 0x01, 0x85, 0x02, 0x00, 0xFF, 0x0A, 0x13, + 0x05, 0x02, 0x93, 0x33, 0x05, 0x06, 0x00, 0x10, + 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, + 0xD0, 0x03, 0xF8, 0x16, 0x51, 0x10, 0x06, 0xC8, + 0x4A, 0x01, 0xC0, 0xCC, 0xC1, 0xC4, 0x4B, 0x10, + 0x13, 0xC0, 0xC8, 0xCC, 0x53, 0xC0, 0x02, 0x02, + 0xEC, 0xEB, 0xC2, 0xC4, 0x43, 0x06, 0x5B, 0x04, + 0x60, 0xC0, 0xAE, 0x00, 0xC4, 0x02, 0x44, 0x02, + 0x0F, 0x00, 0x44, 0x88, 0xCA, 0xE4, 0x3C, 0x16, + 0x81, 0x02, 0x08, 0x00, 0x27, 0x13, 0x21, 0xC1, + 0xDC, 0xE4, 0x14, 0xC1, 0x21, 0x21, 0xBA, 0xE4, + 0x33, 0x16, 0x21, 0xC1, 0xC2, 0xE4, 0x81, 0x02, + 0x00, 0x00, 0x0B, 0x13, 0x0D, 0x02, 0xA0, 0x00, + 0x84, 0x83, 0x09, 0x13, 0xC4, 0x05, 0x84, 0x83, + 0x06, 0x13, 0xC4, 0x05, 0x84, 0x83, 0x03, 0x13, + 0x23, 0x10, 0x0E, 0x81, 0x21, 0x16, 0x21, 0xC1, + 0xDC, 0xE4, 0x21, 0x45, 0xBA, 0xE4, 0xE0, 0x01, + 0x42, 0x01, 0x00, 0x10, 0xA0, 0x01, 0x42, 0x01, + 0x00, 0x10, 0xA1, 0xC3, 0xD4, 0xE4, 0x0F, 0x02, + 0x2F, 0x00, 0x80, 0x03, 0xA0, 0x01, 0x40, 0x01, + 0x00, 0x02, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x80, + 0x6D, 0xC0, 0x0A, 0x00, 0x09, 0x13, 0x81, 0x02, + 0x5C, 0x12, 0x06, 0x1B, 0x0E, 0x02, 0xD2, 0xEB, + 0x0F, 0x02, 0x0F, 0x00, 0x80, 0x03, 0xCA, 0x05, + 0xE0, 0x02, 0xA0, 0x00, 0x5A, 0x04, 0x59, 0xCE, + 0x20, 0x88, 0xE4, 0xE4, 0xE4, 0xE4, 0xF8, 0x10, + 0xC1, 0x04, 0x48, 0x62, 0x89, 0x05, 0xA0, 0xC0, + 0x6C, 0x01, 0x08, 0xC8, 0x6C, 0x01, 0x03, 0x02, + 0x00, 0xFC, 0x04, 0x02, 0x00, 0x02, 0x73, 0xA0, + 0x04, 0x06, 0xFD, 0x16, 0x88, 0x05, 0x09, 0x06, + 0xF4, 0x16, 0x02, 0xC8, 0x6C, 0x01, 0x81, 0x86, + 0x02, 0x16, 0xD0, 0x03, 0xCB, 0x05, 0x5B, 0x04, + 0x43, 0x28, 0x31, 0x29, 0x38, 0x39, 0x2D, 0x33, + 0x38, 0x38, 0x42, 0x20, 0x20, 0x59, 0x49, 0x54, + 0x4B, 0xC2, 0xA8, 0x02, 0x98, 0x00, 0x83, 0x07, + 0x02, 0x00, 0x28, 0x02, 0x08, 0x00, 0x23, 0xC6, + 0x36, 0xE5, 0x48, 0x06, 0xC4, 0xC0, 0x73, 0x0A, + 0x65, 0x17, 0xA0, 0x06, 0xAA, 0xED, 0xC8, 0xC1, + 0xC7, 0x05, 0x03, 0x02, 0xA5, 0x00, 0xB0, 0x03, + 0xF8, 0xCD, 0xF8, 0xCD, 0xA6, 0x02, 0x06, 0x62, + 0x88, 0x02, 0x0A, 0x00, 0x57, 0x16, 0x03, 0x29, + 0x55, 0x16, 0x05, 0x29, 0xC4, 0x80, 0x52, 0x16, + 0x15, 0x09, 0x50, 0x17, 0x15, 0x09, 0x4E, 0x18, + 0x85, 0x02, 0x29, 0x00, 0x4B, 0x16, 0xC6, 0x05, + 0x96, 0x00, 0x03, 0x07, 0xC4, 0x04, 0x45, 0x06, + 0x95, 0x00, 0x44, 0x05, 0x43, 0x16, 0x44, 0x81, + 0x41, 0x16, 0x00, 0x03, 0x05, 0x00, 0xC4, 0x02, + 0x00, 0x03, 0x0A, 0x00, 0x44, 0x02, 0x0F, 0x00, + 0x84, 0x02, 0x05, 0x00, 0x37, 0x16, 0xC4, 0x02, + 0x00, 0x03, 0x0F, 0x00, 0x44, 0x02, 0x0F, 0x00, + 0x84, 0x02, 0x0A, 0x00, 0x2F, 0x16, 0x04, 0x02, + 0xFE, 0xFF, 0x2C, 0x13, 0x2B, 0x15, 0x2A, 0x1A, + 0x84, 0x05, 0x28, 0x12, 0x27, 0x15, 0x26, 0x1A, + 0x25, 0x18, 0x84, 0x05, 0x23, 0x16, 0x22, 0x1B, + 0x21, 0x17, 0x84, 0x05, 0x1F, 0x13, 0x1E, 0x1A, + 0x1D, 0x11, 0x04, 0x06, 0x1B, 0x16, 0xA5, 0x02, + 0xC5, 0xC1, 0x25, 0x02, 0x06, 0x00, 0x03, 0x02, + 0xA5, 0xA5, 0x83, 0xC1, 0x95, 0x00, 0x03, 0x38, + 0x94, 0x00, 0x83, 0x02, 0x2E, 0x6B, 0x0E, 0x16, + 0x84, 0x02, 0x59, 0x1C, 0x0B, 0x16, 0x24, 0x02, + 0x69, 0x00, 0x95, 0x00, 0x03, 0x3C, 0x94, 0x00, + 0x83, 0x81, 0x04, 0x16, 0x84, 0x02, 0x69, 0x00, + 0x01, 0x16, 0xC9, 0x05, 0x59, 0x04, 0xC3, 0xD0, + 0xFD, 0x13, 0x01, 0x1C, 0xFB, 0x10, 0xE0, 0x90, + 0x3D, 0xE5, 0xF8, 0x16, 0xC3, 0x06, 0xC3, 0xD0, + 0xF5, 0x1C, 0xF4, 0x16, 0xE0, 0x90, 0x3A, 0xE5, + 0xF1, 0x16, 0x5B, 0x04, 0x0B, 0xC3, 0x09, 0x02, + 0x3E, 0xE5, 0xA0, 0x06, 0x92, 0xE9, 0xCC, 0x05, + 0x5C, 0x04, 0x88, 0x07, 0x00, 0xA0, 0x89, 0x07, + 0xFE, 0xFF, 0xA8, 0x09, 0xA9, 0x09, 0x8A, 0x07, + 0x02, 0xE0, 0xA0, 0x06, 0x84, 0xEC, 0x00, 0x00, + 0x88, 0x07, 0x00, 0x90, 0x89, 0x07, 0xFE, 0x9F, + 0xA8, 0x09, 0xA9, 0x09, 0x8A, 0x07, 0x78, 0xE0, + 0xA0, 0x06, 0x84, 0xEC, 0x00, 0x00, 0xA0, 0x06, + 0xC4, 0xEC, 0x00, 0x00, 0xE6, 0x10, 0xE5, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, + 0x00, 0x08, 0x11, 0xE3, 0x6C, 0xCC, 0x00, 0x80, + 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x02, 0x00, 0x01, 0x80, 0x00, + 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0xFF, + 0xFF, 0x00, 0xF0, 0xFF, 0x00, 0xF0, 0x0F, 0x00, + 0xFF, 0xFF, 0xFF, 0x7F, 0x03, 0x00, 0x00, 0x00, + 0xC3, 0x00, 0xE7, 0xE7, 0xF3, 0xE7, 0xF1, 0xF1, + 0x43, 0x28, 0x20, 0x29, 0x4F, 0x43, 0x59, 0x50, + 0x49, 0x52, 0x48, 0x47, 0x20, 0x54, 0x42, 0x49, + 0x20, 0x4D, 0x39, 0x31, 0x33, 0x38, 0x34, 0x2C, + 0x35, 0x2C, 0x36, 0x2C, 0x43, 0x28, 0x20, 0x29, + 0x4F, 0x43, 0x59, 0x50, 0x49, 0x52, 0x48, 0x47, + 0x20, 0x54, 0x49, 0x54, 0x31, 0x20, 0x38, 0x39, + 0x2D, 0x33, 0x39, 0x38, 0x39, 0x2C, 0x2D, 0x30, + 0x38, 0x39, 0x00, 0x00, 0x61, 0x9B, 0xC4, 0xEC, + 0x0E, 0xEA, 0xDE, 0xE5, 0xC8, 0xED, 0x00, 0x00, + 0xC4, 0x00, 0xB8, 0xAF, 0x4A, 0x06, 0x50, 0x06, + 0x4C, 0x06, 0xDC, 0xCC, 0x4E, 0x06, 0x0F, 0x00, + 0x32, 0x06, 0x01, 0x00, 0x50, 0x07, 0x58, 0x07, + 0x52, 0x07, 0x70, 0xB5, 0x54, 0x07, 0x0F, 0x00, + 0x38, 0x07, 0x01, 0x00, 0xBA, 0x00, 0xA0, 0x00, + 0xBC, 0x00, 0xD6, 0xED, 0xBE, 0x00, 0x0F, 0x00, + 0x5E, 0x07, 0x3A, 0x07, 0x62, 0x07, 0x40, 0x80, + 0x64, 0x07, 0x54, 0xBA, 0x66, 0x07, 0x36, 0xBA, + 0x68, 0x07, 0x40, 0xB8, 0x98, 0x07, 0x00, 0x80, + 0x78, 0x07, 0x00, 0x80, 0xE2, 0x08, 0x04, 0x00, + 0xE4, 0x08, 0x01, 0x00, 0xEC, 0x08, 0x08, 0x00, + 0xF6, 0x08, 0x0A, 0x00, 0xF8, 0x08, 0x06, 0x00, + 0x00, 0x09, 0x0C, 0x00, 0x02, 0x09, 0x04, 0x00, + 0xAE, 0x01, 0x00, 0x00, 0x1E, 0x09, 0x00, 0x00, + 0x66, 0x09, 0x00, 0x00, 0x0C, 0x06, 0x13, 0x00, + 0x0A, 0x06, 0x20, 0x00, 0x00, 0x00, 0xE0, 0x00, + 0x86, 0xA3, 0xE0, 0x00, 0xE6, 0xA2, 0xE0, 0x00, + 0x86, 0xA3, 0xE0, 0x00, 0x02, 0xA5, 0xE0, 0x00, + 0x5E, 0xA6, 0xE0, 0x00, 0x66, 0xA9, 0xE0, 0x00, + 0x12, 0xA4, 0xC0, 0x00, 0x22, 0xA4, 0xE0, 0x00, + 0x86, 0xA3, 0xE0, 0x00, 0x86, 0xA3, 0xC0, 0x00, + 0x74, 0xA4, 0xE0, 0x00, 0x86, 0xA3, 0xE0, 0x00, + 0x86, 0xA3, 0xE0, 0x00, 0x86, 0xA3, 0xE0, 0x00, + 0x86, 0xA3, 0xE0, 0x00, 0x86, 0xA3, 0xC0, 0x00, + 0xDE, 0xAF, 0xC0, 0x00, 0x48, 0xB0, 0xC0, 0x00, + 0x84, 0xB0, 0xC0, 0x00, 0xF4, 0xB0, 0xC0, 0x00, + 0x76, 0xB1, 0xE0, 0x00, 0xE4, 0xB2, 0xE0, 0x00, + 0x8A, 0xB2, 0xE0, 0x00, 0xF4, 0xB3, 0xE0, 0x00, + 0x7C, 0xB3, 0xE0, 0x00, 0xC6, 0xAA, 0xC0, 0x00, + 0x36, 0xAB, 0xC0, 0x00, 0x90, 0xAB, 0xC0, 0x00, + 0xC2, 0xAB, 0xC0, 0x00, 0xEA, 0xAA, 0xC0, 0x00, + 0x80, 0xA3, 0xC0, 0x00, 0x80, 0xA3, 0x00, 0x3F, + 0x00, 0x7F, 0x00, 0x5E, 0x30, 0x00, 0x28, 0x00, + 0x43, 0x00, 0xB6, 0xA6, 0xB6, 0xA6, 0x1C, 0xA5, + 0x14, 0xA5, 0x46, 0xA5, 0x46, 0xA5, 0x62, 0xA5, + 0xB6, 0xA6, 0x00, 0x40, 0x00, 0x00, 0x00, 0x20, + 0x00, 0x00, 0x00, 0x08, 0x00, 0x20, 0x00, 0x08, + 0x00, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x10, + 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x10, 0x00, + 0x14, 0x00, 0x0E, 0x10, 0x0C, 0x0C, 0x0A, 0x0A, + 0x0A, 0x0A, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x98, 0x07, 0x7E, 0xCA, 0x58, 0x07, + 0xF8, 0xB8, 0x58, 0x07, 0xFE, 0xB7, 0x58, 0x07, + 0x68, 0xB9, 0x58, 0x07, 0xD0, 0xB8, 0x98, 0x07, + 0x5A, 0xC7, 0x98, 0x07, 0x52, 0xC7, 0x78, 0x07, + 0xC2, 0xC1, 0x58, 0x07, 0x30, 0xB9, 0x98, 0x07, + 0x38, 0xCA, 0x78, 0x07, 0x96, 0xC2, 0x58, 0x07, + 0x6A, 0xC7, 0x58, 0x07, 0xE0, 0xB8, 0x58, 0x07, + 0x1E, 0xB9, 0x58, 0x07, 0xE2, 0xB9, 0x98, 0x07, + 0xAE, 0xCB, 0x98, 0x07, 0x8E, 0xC7, 0x78, 0x07, + 0x56, 0xC2, 0xB8, 0x07, 0x14, 0xCC, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xA2, 0xBA, 0x16, 0xC1, + 0xCA, 0xC1, 0xD6, 0xC6, 0x8A, 0xBD, 0xC2, 0xBD, + 0xE0, 0xBD, 0x6A, 0xBE, 0x8E, 0xBE, 0xAA, 0xBE, + 0x22, 0xBF, 0x22, 0xBF, 0x56, 0xBE, 0xC8, 0xBF, + 0x10, 0xBE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C, + 0x00, 0x0C, 0x01, 0x0F, 0xFF, 0xFE, 0x00, 0x58, + 0x00, 0x0E, 0xFF, 0xFE, 0x0E, 0x00, 0x00, 0x70, + 0x40, 0x80, 0x00, 0x5E, 0xA0, 0xC0, 0xDF, 0xFF, + 0x00, 0x18, 0x00, 0xE0, 0x00, 0x78, 0x00, 0x50, + 0x00, 0x60, 0x00, 0x70, 0x00, 0x0C, 0x06, 0x00, + 0x00, 0x00, 0x84, 0xE3, 0xE6, 0x07, 0xF4, 0x07, + 0x08, 0x00, 0x00, 0x00, 0x8A, 0xE3, 0xEA, 0x07, + 0xF4, 0x07, 0x06, 0x00, 0x40, 0x00, 0x00, 0x0A, + 0xE6, 0x07, 0xEE, 0x07, 0x08, 0x00, 0x40, 0x00, + 0x06, 0x0A, 0xEA, 0x07, 0xEE, 0x07, 0x00, 0x00, + 0xE2, 0xC1, 0x8B, 0xD4, 0xFF, 0xFF, 0xD7, 0xD1, + 0xD9, 0xC5, 0xD4, 0xC3, 0x3B, 0x59, 0x34, 0x09, + 0xFC, 0x05, 0x6C, 0x09, 0xD8, 0x06, 0x06, 0x04, + 0xBA, 0xEA, 0x30, 0x09, 0x48, 0x04, 0x80, 0x08, + 0x06, 0x00, 0x0A, 0x06, 0x0E, 0x0C, 0xBA, 0xCE, + 0x2E, 0xE0, 0x56, 0xE0, 0x50, 0xE1, 0x66, 0xE2, + 0xEC, 0xE2, 0x4C, 0xE3, 0xFE, 0xE3, 0xBA, 0xCE, + 0x80, 0xE4, 0x10, 0xE4, 0x14, 0xE0, 0x1C, 0xE4, + 0x1C, 0xE4, 0x46, 0xE5, 0x50, 0xE5, 0x5A, 0xE5, + 0xBA, 0xCE, 0xA6, 0xDC, 0xBA, 0xCE, 0x44, 0xDA, + 0xE6, 0xDF, 0x70, 0xDA, 0xDE, 0xDE, 0xB0, 0xCE, + 0x16, 0xDB, 0x3A, 0xDD, 0xB8, 0xDD, 0x34, 0xDE, + 0x58, 0xDE, 0x16, 0xDB, 0xDA, 0xDC, 0x08, 0xCF, + 0xB0, 0xCE, 0xA8, 0xD9, 0x8A, 0xD9, 0x44, 0xD9, + 0xB0, 0xCE, 0xEA, 0xDE, 0xB0, 0xCE, 0x72, 0x06, + 0xF6, 0xD2, 0x08, 0x07, 0x72, 0x06, 0x54, 0xD2, + 0xF4, 0x01, 0x72, 0x06, 0x34, 0xD2, 0x08, 0x07, + 0x7C, 0x06, 0x5A, 0xDC, 0x04, 0x00, 0x7C, 0x06, + 0x78, 0xD2, 0x00, 0x00, 0x7C, 0x06, 0xCC, 0xDE, + 0xFA, 0x00, 0x86, 0x06, 0xAC, 0xD1, 0x05, 0x00, + 0x90, 0x06, 0x1C, 0xDF, 0x28, 0x00, 0x90, 0x06, + 0x50, 0xD3, 0x04, 0x01, 0x90, 0x06, 0x00, 0x00, + 0x02, 0x00, 0x90, 0x06, 0x80, 0xD2, 0xBC, 0x02, + 0x9A, 0x06, 0x06, 0xD3, 0xDC, 0x05, 0x9A, 0x06, + 0xAA, 0xD2, 0x64, 0x00, 0x9A, 0x06, 0x0A, 0xD3, + 0x14, 0x00, 0x9A, 0x06, 0xE2, 0xE0, 0x40, 0x06, + 0x9A, 0x06, 0x12, 0xD3, 0x64, 0x00, 0x7C, 0x06, + 0x16, 0xDC, 0x04, 0x00, 0x7C, 0x06, 0xE6, 0xDA, + 0x16, 0x00, 0x7C, 0x06, 0xFA, 0xDB, 0x05, 0x00, + 0x7C, 0x06, 0x00, 0xDD, 0x14, 0x00, 0x9A, 0x06, + 0x7C, 0xD3, 0x14, 0x00, 0x9A, 0x06, 0x38, 0xD4, + 0x02, 0x00, 0x7C, 0x06, 0x0C, 0xE0, 0x19, 0x00, + 0x00, 0x00, 0x0A, 0x07, 0x0E, 0x07, 0x04, 0x07, + 0xD8, 0x06, 0x00, 0x07, 0xF0, 0x06, 0xEE, 0x06, + 0xEC, 0x06, 0x0C, 0x07, 0xE6, 0x06, 0x18, 0x07, + 0x92, 0x09, 0x94, 0x09, 0x96, 0x09, 0x98, 0x09, + 0x00, 0x50, 0xCC, 0x00, 0x03, 0x00, 0x00, 0x84, + 0x00, 0xA8, 0x00, 0xA0, 0x00, 0x20, 0x00, 0x80, + 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 0x80, + 0x00, 0x40, 0x00, 0x10, 0x82, 0xEC, 0x48, 0xEB, + 0x62, 0xEB, 0x7C, 0xEB, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x09, 0x00, 0x09, 0x00, 0xEA, 0xEB, + 0x52, 0xEB, 0x68, 0xEB, 0x82, 0xEB, 0x40, 0x01, + 0x42, 0x01, 0x42, 0x01, 0x42, 0x01, 0x00, 0x00, + 0x7F, 0x00, 0xA0, 0x00, 0xFF, 0x00, 0x10, 0x02, + 0x1F, 0x02, 0x30, 0x02, 0x3F, 0x02, 0x50, 0x02, + 0x5F, 0x02, 0x70, 0x02, 0x7F, 0x02, 0x90, 0x02, + 0x9F, 0x02, 0xB0, 0x02, 0xBF, 0x02, 0xD0, 0x02, + 0xDF, 0x02, 0xE1, 0x02, 0xFF, 0x02, 0x01, 0x03, + 0x7F, 0x03, 0x81, 0x03, 0x8F, 0x03, 0x91, 0x03, + 0x9F, 0x03, 0xA1, 0x03, 0xAF, 0x03, 0xB1, 0x03, + 0xBF, 0x03, 0xC1, 0x03, 0xCF, 0x03, 0xE1, 0x03, + 0xFF, 0x03, 0xC0, 0x07, 0xFF, 0x07, 0x00, 0x0C, + 0xFF, 0x0F, 0x00, 0x30, 0xFF, 0x37, 0xFF, 0xFF, + 0xFF, 0xFF, 0xBC, 0xFE, 0x07, 0x00, 0x5E, 0x02, + 0x00, 0x01, 0xFF, 0xBA, 0x80, 0xBA, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0C, 0x01, 0x0A, 0x01, + 0x0E, 0x01, 0x10, 0x01, 0x14, 0x01, 0x00, 0x00, + 0x12, 0x01, 0x00, 0xF8, 0x16, 0x01, 0x00, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x0A, 0x01, 0x1C, 0x01, + 0x82, 0x01, 0x66, 0x96, 0x66, 0x96, 0x55, 0x55, + 0x00, 0x00, 0x82, 0x01, 0x2A, 0x8A, 0x2A, 0x8A, + 0x18, 0xC9, 0x18, 0xC9, 0x86, 0x01, 0xAA, 0xA2, + 0x1E, 0xA0, 0x55, 0x55, 0x1E, 0x54, 0x8A, 0x01, + 0x00, 0x50, 0x00, 0x00, 0x00, 0xA8, 0x00, 0x00, + 0x8C, 0x01, 0x00, 0x50, 0x00, 0x00, 0x00, 0xA8, + 0x00, 0x00, 0x8E, 0x01, 0x00, 0x50, 0x00, 0x00, + 0x00, 0xA8, 0x00, 0x00, 0x90, 0x01, 0x00, 0x50, + 0x00, 0x00, 0x00, 0xA8, 0x00, 0x00, 0x92, 0x01, + 0x00, 0x50, 0x00, 0x00, 0x00, 0xA8, 0x00, 0x00, + 0x94, 0x01, 0x00, 0x50, 0x00, 0x00, 0x00, 0xA8, + 0x00, 0x00, 0x96, 0x01, 0x00, 0x50, 0x00, 0x00, + 0x00, 0xA8, 0x00, 0x00, 0x98, 0x01, 0x00, 0x50, + 0x00, 0x00, 0x00, 0xA8, 0x00, 0x00, 0x9A, 0x01, + 0x00, 0x50, 0x00, 0x00, 0x00, 0xA8, 0x00, 0x00, + 0x9C, 0x01, 0x55, 0x55, 0xC0, 0x7F, 0xAA, 0xAA, + 0xC0, 0x7F, 0x00, 0x00, 0xA2, 0x01, 0xA4, 0x01, + 0xA8, 0x01, 0xAA, 0x01, 0xAE, 0x01, 0xB0, 0x01, + 0xB2, 0x01, 0x80, 0x01, 0x00, 0x00, 0x88, 0x01, + 0x00, 0xFF, 0x9E, 0x01, 0xFF, 0x00, 0xA0, 0x01, + 0x00, 0x80, 0xAC, 0x01, 0x00, 0x80, 0x00, 0x00, + 0xA6, 0x01, 0x00, 0x80, 0x00, 0x00, 0x80, 0x01, + 0xBC, 0x01, 0x00, 0x88, 0x00, 0x06, 0x00, 0xC8, + 0x00, 0x00, 0x00, 0x80, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x02, 0x00, 0x44, 0x00, 0x92, 0xEA, + 0x48, 0x00, 0x98, 0xEA, 0x50, 0x00, 0x9E, 0xEA, + 0x60, 0x00, 0xA4, 0xEA, 0x78, 0x00, 0xAA, 0xEA, + 0x0A, 0xE8, 0x18, 0xE7, 0x3C, 0xEA, 0x2A, 0xE7, + 0x14, 0x55, 0xA0, 0x01, 0xEC, 0xE6, 0xD0, 0xE9, + 0x46, 0xE7, 0xA0, 0xE7, 0x00, 0xE7, 0x58, 0xE8, + 0x00, 0x00, 0x1E, 0x00, 0x46, 0xE7, 0x92, 0xE7, + 0x00, 0x41, 0x01, 0x41, 0xB6, 0xE7, 0x73, 0xEA, + 0x18, 0xE7, 0x48, 0xEA, 0xEC, 0xE6, 0x04, 0xEA, + 0x56, 0xE7, 0x62, 0xE7, 0xB6, 0xE7, 0x6E, 0xEA, + 0x62, 0xE8, 0x00, 0x00, 0x36, 0xE8, 0xEC, 0xE6, + 0xFA, 0xE9, 0x56, 0xE7, 0x62, 0xE7, 0x36, 0xE8, + 0x62, 0xE8, 0x00, 0x00, 0xEC, 0xE6, 0xF0, 0xE9, + 0x0C, 0xE7, 0x4A, 0xE7, 0x62, 0xE7, 0x36, 0xE8, + 0xEC, 0xE6, 0xFA, 0xE9, 0x56, 0xE7, 0x62, 0xE7, + 0x36, 0xE8, 0x62, 0xE8, 0x00, 0x20, 0x2A, 0xE7, + 0x14, 0x55, 0xA0, 0x01, 0x18, 0xE7, 0x50, 0xEA, + 0xEC, 0xE6, 0xD0, 0xE9, 0x58, 0xE8, 0x50, 0x55, + 0x0C, 0x00, 0x46, 0xE7, 0x92, 0xE7, 0x00, 0x01, + 0x00, 0x00, 0xB6, 0xE7, 0x75, 0xEA, 0x00, 0xE7, + 0x58, 0xE8, 0x55, 0x55, 0x0C, 0x00, 0x56, 0xE7, + 0xA0, 0xE7, 0x00, 0xE7, 0x58, 0xE8, 0xFF, 0xFF, + 0x08, 0x00, 0x58, 0xE8, 0x02, 0x10, 0x06, 0x00, + 0x46, 0xE7, 0x92, 0xE7, 0x00, 0x01, 0x01, 0x01, + 0xB6, 0xE7, 0x80, 0xEA, 0x00, 0xE7, 0x58, 0xE8, + 0x00, 0xC0, 0x08, 0x00, 0x58, 0xE8, 0xFF, 0xFF, + 0x0A, 0x00, 0x58, 0xE8, 0xFF, 0xFF, 0x0C, 0x00, + 0x58, 0xE8, 0x0D, 0x10, 0x06, 0x00, 0x46, 0xE7, + 0x92, 0xE7, 0x00, 0x01, 0x01, 0x01, 0xB6, 0xE7, + 0x74, 0xEA, 0x62, 0xE8, 0x08, 0x20, 0x00, 0xE7, + 0x52, 0xE8, 0x82, 0x01, 0x02, 0xC9, 0x46, 0xE7, + 0xB6, 0xE7, 0x80, 0xEA, 0x62, 0xE8, 0x34, 0x20, + 0x00, 0xE7, 0x58, 0xE8, 0x00, 0x10, 0x06, 0x00, + 0x46, 0xE7, 0xC6, 0xE8, 0xB6, 0xE7, 0x78, 0xEA, + 0x52, 0xE8, 0x9C, 0x01, 0x40, 0x00, 0x18, 0xE7, + 0x50, 0xEA, 0x2A, 0xE7, 0xFF, 0x00, 0x80, 0x07, + 0x26, 0xE9, 0x03, 0x00, 0x66, 0xE9, 0x74, 0xE9, + 0x12, 0xEA, 0x38, 0xE9, 0x00, 0x00, 0x74, 0xE9, + 0x1C, 0xEA, 0x38, 0xE9, 0x04, 0x00, 0x74, 0xE9, + 0x24, 0xEA, 0x38, 0xE9, 0x07, 0x00, 0x74, 0xE9, + 0x2C, 0xEA, 0x26, 0xE9, 0x01, 0x00, 0x74, 0xE9, + 0x34, 0xEA, 0x38, 0xE9, 0x02, 0x00, 0x74, 0xE9, + 0x34, 0xEA, 0x38, 0xE9, 0x06, 0x00, 0x74, 0xE9, + 0x34, 0xEA, 0x38, 0xE9, 0x05, 0x00, 0x74, 0xE9, + 0x34, 0xEA, 0x26, 0xE9, 0x01, 0x00, 0x4A, 0xE9, + 0x26, 0xE9, 0x03, 0x00, 0x58, 0xE9, 0x62, 0xE7, + 0xE6, 0xE8, 0xD8, 0xE9, 0x01, 0x00, 0xE6, 0xE8, + 0x25, 0xEA, 0x02, 0x00, 0xE6, 0xE8, 0x2F, 0xEA, + 0x06, 0x00, 0xE6, 0xE8, 0x3A, 0xEA, 0x05, 0x00, + 0xB6, 0xE7, 0x74, 0xEA, 0x36, 0xE8, 0xEC, 0xE6, + 0xD0, 0xE9, 0x56, 0xE7, 0xC6, 0xE8, 0x0C, 0xE7, + 0x92, 0xE7, 0x00, 0x01, 0x00, 0x80, 0xB6, 0xE7, + 0x78, 0xEA, 0x00, 0xE7, 0xFE, 0xE8, 0x52, 0xE8, + 0x80, 0x01, 0x41, 0x8E, 0x4A, 0xE7, 0x92, 0xE7, + 0x00, 0x01, 0x01, 0x1B, 0x06, 0xE9, 0xE4, 0xFF, + 0xB6, 0xE7, 0x7C, 0xEA, 0xBE, 0xE8, 0x18, 0xE7, + 0x56, 0xEA, 0x0C, 0xE7, 0x6A, 0xE8, 0x3C, 0xE7, + 0x00, 0xE0, 0xC6, 0xE8, 0xB6, 0xE7, 0x86, 0xEA, + 0x3C, 0xE7, 0x00, 0xE8, 0x62, 0xE7, 0xB6, 0xE7, + 0x85, 0xEA, 0x3C, 0xE7, 0x00, 0x08, 0xC6, 0xE8, + 0xB6, 0xE7, 0x86, 0xEA, 0x3C, 0xE7, 0x00, 0xF8, + 0x62, 0xE7, 0xB6, 0xE7, 0x85, 0xEA, 0x52, 0xE8, + 0x80, 0x01, 0x00, 0x02, 0x3C, 0xE7, 0x00, 0xE0, + 0x62, 0xE7, 0xB6, 0xE7, 0x85, 0xEA, 0x52, 0xE8, + 0x84, 0x01, 0x00, 0x00, 0x62, 0xE8, 0x34, 0x00, + 0x3C, 0xE7, 0x00, 0x00, 0xC6, 0xE8, 0x62, 0xE8, + 0x34, 0x60, 0x0E, 0xE9, 0x52, 0xE8, 0x84, 0x01, + 0x00, 0x00, 0xB6, 0xE7, 0x86, 0xEA, 0x52, 0xE8, + 0x82, 0x01, 0x00, 0xC8, 0x3C, 0xE7, 0x00, 0xE0, + 0xC6, 0xE8, 0x3C, 0xE7, 0x00, 0x10, 0xC6, 0xE8, + 0x62, 0xE8, 0x34, 0x60, 0x52, 0xE8, 0x80, 0x01, + 0x00, 0x06, 0x3C, 0xE7, 0x10, 0x00, 0x78, 0xE8, + 0x36, 0xE8, 0x52, 0xE8, 0x84, 0x01, 0x00, 0x00, + 0x62, 0xE8, 0x34, 0x00, 0xEC, 0xE6, 0xD0, 0xE9, + 0x18, 0xE7, 0x5C, 0xEA, 0xD0, 0xE8, 0x92, 0xE9, + 0x00, 0xE7, 0x0C, 0xE7, 0x70, 0xE7, 0x40, 0xF0, + 0x06, 0x00, 0x00, 0xC7, 0xA0, 0xE7, 0xDC, 0xE8, + 0x00, 0xE0, 0x00, 0xE7, 0x0C, 0xE7, 0x70, 0xE7, + 0x40, 0xD0, 0x06, 0x00, 0x00, 0xE0, 0xA0, 0xE7, + 0xDC, 0xE8, 0x00, 0xC0, 0x00, 0xE7, 0x0C, 0xE7, + 0x70, 0xE7, 0x40, 0x90, 0x06, 0x00, 0x00, 0xA0, + 0xA0, 0xE7, 0xDC, 0xE8, 0x00, 0x80, 0x00, 0xE7, + 0x0C, 0xE7, 0x70, 0xE7, 0x40, 0x50, 0x06, 0x00, + 0x00, 0x60, 0xA0, 0xE7, 0xDC, 0xE8, 0x00, 0x40, + 0x00, 0xE7, 0x0C, 0xE7, 0x70, 0xE7, 0x40, 0x10, + 0x06, 0x00, 0x00, 0x20, 0xA0, 0xE7, 0xDC, 0xE8, + 0x00, 0x00, 0xD0, 0xE8, 0x92, 0xE9, 0x00, 0xE7, + 0x0C, 0xE7, 0x70, 0xE7, 0x40, 0xD0, 0x06, 0x00, + 0x00, 0xA6, 0xA0, 0xE7, 0xDC, 0xE8, 0x00, 0xC0, + 0x00, 0xE7, 0x0C, 0xE7, 0x70, 0xE7, 0x40, 0x90, + 0x06, 0x00, 0x00, 0xC0, 0xA0, 0xE7, 0xDC, 0xE8, + 0x00, 0x80, 0x00, 0xE7, 0x0C, 0xE7, 0x70, 0xE7, + 0x40, 0x50, 0x06, 0x00, 0x00, 0x40, 0xA0, 0xE7, + 0xDC, 0xE8, 0x00, 0x40, 0x00, 0xE7, 0x0C, 0xE7, + 0x70, 0xE7, 0x40, 0x70, 0x06, 0x00, 0x00, 0x60, + 0xA0, 0xE7, 0xDC, 0xE8, 0x00, 0x60, 0x7E, 0xE9, + 0x90, 0xE9, 0x18, 0xE7, 0x62, 0xEA, 0xEC, 0xE6, + 0xD0, 0xE9, 0xA4, 0xE8, 0x55, 0x55, 0x16, 0x00, + 0x46, 0xE7, 0x92, 0xE7, 0x00, 0x00, 0x00, 0x00, + 0xB6, 0xE7, 0x8B, 0xEA, 0x0A, 0xE8, 0x18, 0xE7, + 0x62, 0xEA, 0x58, 0xE8, 0x55, 0x55, 0x16, 0x00, + 0x00, 0xE7, 0x46, 0xE7, 0xA0, 0xE7, 0x2A, 0xE7, + 0xFF, 0x00, 0x00, 0x08, 0x2A, 0xE7, 0xFF, 0x00, + 0x00, 0x0C, 0x2A, 0xE7, 0xFF, 0x00, 0x00, 0x10, + 0x2A, 0xE7, 0xFF, 0x00, 0x00, 0x14, 0x2A, 0xE7, + 0xFF, 0x00, 0x00, 0x18, 0x2A, 0xE7, 0xFF, 0x00, + 0x00, 0x1C, 0x2A, 0xE7, 0xFF, 0x00, 0x00, 0x20, + 0x2A, 0xE7, 0xFF, 0x00, 0x00, 0x24, 0x2A, 0xE7, + 0xFF, 0x00, 0x00, 0x28, 0x2A, 0xE7, 0xFF, 0x00, + 0x00, 0x2C, 0xD2, 0xE7, 0x00, 0xE7, 0x0C, 0xE7, + 0x70, 0xE7, 0x40, 0x30, 0x06, 0x00, 0x00, 0x01, + 0xA0, 0xE7, 0xDC, 0xE8, 0x00, 0x20, 0x00, 0xE7, + 0x0C, 0xE7, 0x70, 0xE7, 0x40, 0x70, 0x06, 0x00, + 0x00, 0x43, 0xA0, 0xE7, 0xDC, 0xE8, 0x00, 0x60, + 0x00, 0xE7, 0x0C, 0xE7, 0x70, 0xE7, 0x40, 0xB0, + 0x06, 0x00, 0x00, 0x85, 0xA0, 0xE7, 0xDC, 0xE8, + 0x00, 0xA0, 0xD8, 0xE8, 0x00, 0x01, 0x03, 0x01, + 0x01, 0x01, 0x00, 0x00, 0x00, 0x81, 0x1A, 0x00, + 0x40, 0x10, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, + 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x72, 0x82, + 0x4A, 0xA9, 0xA5, 0x5A, 0xDA, 0xE7, 0x03, 0x09, + 0x11, 0x9D, 0x00, 0x00, 0x00, 0x81, 0x04, 0x00, + 0xD8, 0x90, 0x00, 0x10, 0x00, 0x00, 0x00, 0x81, + 0x04, 0x00, 0xD8, 0x90, 0xD8, 0xB4, 0x00, 0x00, + 0x00, 0x81, 0x08, 0x00, 0xD8, 0x90, 0x46, 0x16, + 0x00, 0x40, 0xD8, 0xB4, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x13, 0x00, 0x40, 0x10, 0x16, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x10, 0x00, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x0F, 0x00, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x81, 0x0F, 0x00, 0x06, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x12, 0x00, 0x0A, 0x80, + 0x40, 0x9E, 0x00, 0xC8, 0x00, 0x00, 0x5E, 0x80, + 0x0F, 0x00, 0x06, 0x80, 0x40, 0xFE, 0x00, 0xCC, + 0x00, 0x00, 0x04, 0x80, 0x40, 0x8E, 0x00, 0xC9, + 0x04, 0x80, 0x00, 0x06, 0x00, 0xCC, 0x04, 0x80, + 0x40, 0x0A, 0x00, 0xC8, 0x0A, 0x80, 0x40, 0x8A, + 0x00, 0xC8, 0x00, 0x00, 0x5E, 0x80, 0x0F, 0x00, + 0x0A, 0x08, 0x80, 0x1C, 0x0A, 0x00, 0x1C, 0x1A, + 0x00, 0x80, 0x1C, 0x0C, 0x00, 0x80, 0x1C, 0x1A, + 0x00, 0x80, 0x1A, 0x0E, 0x80, 0x1C, 0x04, 0x00, + 0x00, 0x80, 0x80, 0x02, 0x02, 0x00, 0x00, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x58, 0x07, 0x0C, 0xB8, + 0x16, 0xE0, 0xE2, 0x08, 0xEC, 0x08, 0xF6, 0x08, + 0x16, 0xE0, 0x00, 0x09, 0x0A, 0x09, 0x00, 0x00, + 0x00, 0x00, 0xE2, 0x08, 0x00, 0x00, 0xEC, 0x08, + 0xF6, 0x08, 0x00, 0x09, 0x00, 0x00, 0xB8, 0x07, + 0xCA, 0xCB, 0x80, 0x02, 0xB8, 0x07, 0xE8, 0xCB, + 0x84, 0xFF, 0xB8, 0x07, 0x0A, 0xCC, 0xB8, 0x07, + 0x84, 0xCC, 0x6E, 0xCD, 0x62, 0xCD, 0x88, 0xCD, + 0x90, 0xCE, 0x84, 0xCD, 0x92, 0xCE, 0x92, 0xCE, + 0x92, 0xCE, 0x8C, 0xCD, 0x96, 0xCD, 0x38, 0xCE, + 0x82, 0xCE, 0x92, 0xCE, 0x92, 0xCE, 0x92, 0xCE, + 0x92, 0xCE, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x08, 0x00, 0x08, 0x01, 0x05, 0x08, + 0x08, 0x08, 0x03, 0x08, 0x03, 0x03, 0x03, 0x03, + 0x00, 0x00, 0x04, 0x02, 0x04, 0x04, 0x00, 0x04, + 0x0A, 0x08, 0x00, 0x00, 0x10, 0x0C, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x18, 0x00, 0x1A, 0x00, 0x00, + 0x04, 0x41, 0x06, 0x0B, 0x08, 0xC2, 0x00, 0xE6, + 0x00, 0xE7, 0x04, 0x06, 0x04, 0x07, 0x04, 0x03, + 0x06, 0x04, 0x04, 0x05, 0x04, 0x88, 0x04, 0xCF, + 0x04, 0xCD, 0x03, 0x00, 0x05, 0x00, 0x1C, 0x00, + 0x00, 0x0C, 0x00, 0x80, 0xD2, 0xD8, 0xDA, 0xD8, + 0x1E, 0xD9, 0xDE, 0xD8, 0xEA, 0xD8, 0xF0, 0xD8, + 0x14, 0xD9, 0xE4, 0xD8, 0x32, 0xD9, 0x00, 0x06, + 0x00, 0x00, 0x03, 0x07, 0x0A, 0x0E, 0x0F, 0x14, + 0x26, 0x2A, 0x52, 0x42, 0x50, 0x48, 0x5D, 0x4D, + 0x62, 0x62, 0x6D, 0x57, 0x46, 0x39, 0x1A, 0x1D, + 0x7C, 0x76, 0x1F, 0x23, 0x15, 0x1D, 0x74, 0x6F, + 0x84, 0x7C, 0x8B, 0x82, 0x92, 0x89, 0x00, 0x00, + 0x32, 0x2F, 0x3F, 0x34, 0x32, 0x01, 0x01, 0x57, + 0x32, 0x11, 0x81, 0x51, 0x02, 0x56, 0x03, 0x55, + 0x54, 0x11, 0x56, 0x81, 0x55, 0x02, 0x54, 0x02, + 0x56, 0x81, 0x01, 0x76, 0x02, 0x34, 0x02, 0x55, + 0x81, 0x54, 0x02, 0x58, 0x02, 0x55, 0x81, 0x54, + 0x02, 0x58, 0x11, 0x12, 0x02, 0x52, 0x58, 0x83, + 0x52, 0x05, 0x83, 0x04, 0x02, 0x58, 0x08, 0x55, + 0x58, 0x83, 0x55, 0x02, 0x81, 0x02, 0x05, 0x58, + 0x03, 0x52, 0x5C, 0x15, 0x53, 0x5B, 0x52, 0x87, + 0x11, 0x03, 0x41, 0x51, 0x78, 0x51, 0x34, 0x11, + 0x81, 0x11, 0x20, 0x31, 0x54, 0x57, 0x01, 0x53, + 0x5A, 0x12, 0x81, 0x51, 0x20, 0x31, 0x5B, 0x57, + 0x01, 0x5A, 0x01, 0x11, 0x51, 0x11, 0x31, 0x81, + 0x57, 0x20, 0x15, 0x01, 0x13, 0x01, 0x11, 0x01, + 0x11, 0x11, 0x81, 0x51, 0x05, 0x58, 0x02, 0x52, + 0x5B, 0x54, 0x5D, 0x81, 0x52, 0x05, 0x54, 0x02, + 0x58, 0x81, 0x50, 0x02, 0x13, 0x03, 0x58, 0x81, + 0x50, 0x02, 0x11, 0x03, 0x81, 0x54, 0x72, 0x5D, + 0x50, 0x03, 0x13, 0x03, 0x13, 0x01, 0x40, 0x54, + 0x0E, 0x00, 0x20, 0x06, 0x56, 0x06, 0x0C, 0xDA, + 0x24, 0x00, 0x02, 0x10, 0x16, 0x00, 0x02, 0x00, + 0x01, 0x04, 0x08, 0x07, 0x0C, 0xDA, 0x20, 0x00, + 0x03, 0x10, 0x12, 0x00, 0x03, 0x00, 0x4E, 0xD9, + 0x14, 0x8E, 0x20, 0x00, 0x04, 0x10, 0x12, 0x00, + 0x04, 0x00, 0xD2, 0xCE, 0x20, 0x00, 0x05, 0xE0, + 0x12, 0x00, 0x05, 0x00, 0xD2, 0xCE, 0x20, 0x00, + 0x06, 0xE0, 0x12, 0x00, 0x06, 0x00, 0xE8, 0xDD, + 0x12, 0x00, 0x01, 0xE0, 0x6C, 0x09, 0xCC, 0x06, + 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x30, 0x06, + 0x42, 0xDC, 0xF0, 0x05, 0x00, 0xE0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xE2, 0x05, 0x08, 0x00, + 0x26, 0xFF, 0xDC, 0x05, 0x00, 0x00, 0x30, 0x06, + 0xF8, 0xDB, 0x1E, 0x00, 0x01, 0xE0, 0x10, 0x00, + 0x11, 0x30, 0x0C, 0x04, 0x01, 0x00, 0x0E, 0x04, + 0x02, 0x00, 0x21, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x06, 0x32, 0xDD, 0x12, 0x00, 0x01, 0xE0, + 0x04, 0x00, 0x13, 0x30, 0x74, 0xDE, 0x3E, 0x00, + 0x00, 0xE0, 0x00, 0xC0, 0x00, 0x00, 0x02, 0x00, + 0x30, 0x00, 0x20, 0x50, 0x23, 0x0C, 0xFC, 0x05, + 0x52, 0x06, 0x56, 0x06, 0x00, 0x00, 0x00, 0x81, + 0x16, 0x00, 0x00, 0xE0, 0x00, 0xC0, 0x00, 0x00, + 0x10, 0x00, 0x08, 0x00, 0x2A, 0x40, 0x2A, 0x04, + 0x56, 0x06, 0x26, 0x00, 0x19, 0xED, 0x2B, 0x06, + 0x72, 0x09, 0x22, 0x00, 0x24, 0x00, 0x2F, 0xED, + 0x23, 0x0C, 0xFC, 0x05, 0x28, 0x08, 0x34, 0x09, + 0x29, 0x08, 0x58, 0x07, 0x78, 0x07, 0x98, 0x07, + 0x23, 0x00, 0x2A, 0x00, 0x3D, 0xED, 0x06, 0x04, + 0xF0, 0x06, 0x07, 0x04, 0xEE, 0x06, 0x24, 0x00, + 0xD2, 0xCE, 0x34, 0x00, 0x00, 0xE0, 0x00, 0xC0, + 0x00, 0x00, 0x10, 0x00, 0x26, 0x00, 0x25, 0x40, + 0xD2, 0xCE, 0x20, 0x00, 0x00, 0xE0, 0x00, 0xC0, + 0x00, 0x00, 0x10, 0x00, 0x12, 0x00, 0x26, 0x40, + 0xD2, 0xCE, 0x1A, 0x00, 0x00, 0xE0, 0x0C, 0x00, + 0x27, 0x60, 0x0A, 0x08, 0xE6, 0x06, 0xD2, 0xCE, + 0x24, 0x00, 0x00, 0xE0, 0x16, 0x00, 0x28, 0x60, + 0x30, 0x04, 0x06, 0x07, 0x52, 0xCF, 0x00, 0x81, + 0x30, 0x00, 0x00, 0xE0, 0x22, 0x00, 0x29, 0x60, + 0x2D, 0x08, 0x1C, 0x07, 0x2E, 0x08, 0x22, 0x07, + 0x00, 0x00, 0x08, 0x02, 0x06, 0x01, 0x14, 0x06, + 0x18, 0x08, 0x20, 0x0C, 0x26, 0x0E, 0x30, 0x0F, + 0x34, 0x11, 0x3E, 0x12, 0x42, 0x14, 0x46, 0x16, + 0x1C, 0x0A, 0x4A, 0x18, 0x13, 0x03, 0x11, 0x83, + 0x01, 0x11, 0x11, 0x81, 0x12, 0x81, 0x13, 0x01, + 0x52, 0x83, 0x81, 0x85, 0x85, 0x11, 0x12, 0x81, + 0x12, 0x81, 0x19, 0x81, 0x60, 0x85, 0x00, 0xC0, + 0x00, 0x00, 0x08, 0x00, 0x6C, 0x09, 0x00, 0x00, + 0x30, 0x06, 0x08, 0xE5, 0x54, 0x06, 0x50, 0x06, + 0x38, 0x02, 0x21, 0x04, 0x1E, 0x09, 0x0B, 0x06, + 0xD8, 0x06, 0x02, 0x08, 0xDC, 0x06, 0x00, 0xC0, + 0xFF, 0xFF, 0xFF, 0xFF, 0x41, 0x00, 0x41, 0x00, + 0x14, 0xAE, 0x00, 0x00, 0x00, 0x81, 0x09, 0x04, + 0x0C, 0x07, 0x41, 0x00, 0x41, 0x00, 0x14, 0x02, + 0x00, 0x00, 0x00, 0x81, 0x0B, 0x06, 0xD8, 0x06, + 0x2C, 0x06, 0x76, 0x09, 0x22, 0x14, 0x3A, 0x09, + 0x41, 0x00, 0x41, 0x00, 0x54, 0x02, 0x00, 0x00, + 0x00, 0x81, 0xD8, 0x06, 0x00, 0x84, 0x00, 0x48, + 0xFC, 0xFF, 0x09, 0x00, 0x00, 0xC0, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xB8, 0xFF, 0x20, 0x00, + 0x43, 0x28, 0x31, 0x29, 0x38, 0x39, 0x2D, 0x33, + 0x39, 0x38, 0x39, 0x2C, 0x2D, 0x30, 0x38, 0x39, + 0x54, 0x20, 0x78, 0x65, 0x73, 0x61, 0x49, 0x20, + 0x73, 0x6E, 0x72, 0x74, 0x6D, 0x75, 0x6E, 0x65, + 0x73, 0x74, 0x28, 0x0A, 0x29, 0x43, 0x39, 0x31, + 0x33, 0x38, 0x34, 0x2C, 0x35, 0x2C, 0x36, 0x2C, + 0x49, 0x20, 0x4D, 0x42, 0x43, 0x20, 0x72, 0x6F, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xF8, 0xFF, 0x01, 0x00, 0x34, 0x90, + 0x00, 0x00, 0xFA, 0xFF, 0x01, 0x00, 0xB8, 0xFF, + 0x00, 0x00, 0xFC, 0xFF, 0x02, 0x00, 0x80, 0x00, + 0x3E, 0xA0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00 +}; +#endif /* CONFIG_SKTR */ diff --git a/drivers/net/tlan.c b/drivers/net/tlan.c index 7838f45d9160..2edde5d78d80 100644 --- a/drivers/net/tlan.c +++ b/drivers/net/tlan.c @@ -1754,7 +1754,7 @@ int TLan_Reset( struct device *dev ) * areg The AREG to set the address in (0 - 3). * mac A pointer to an array of chars. Each * element stores one byte of the address. - * IE, it isn't in ascii. + * That is, it isn't in ASCII. * * This function transfers a MAC address to one of the * TLAN AREGs (address registers). The TLAN chip locks @@ -2654,7 +2654,7 @@ void TLan_EeReceiveByte( u16 io_base, u8 *data, int stop ) * * Returns: * No error = 0, else, the stage at which the error - * occured. + * occurred. * Parms: * io_base The IO port base address for the * TLAN device with the EEPROM to diff --git a/drivers/sbus/audio/cs4215.h b/drivers/sbus/audio/cs4215.h index 966339a02c7f..ec8de8fad4c4 100644 --- a/drivers/sbus/audio/cs4215.h +++ b/drivers/sbus/audio/cs4215.h @@ -61,7 +61,7 @@ static struct { }; #define CS4215_HPF (1<<7) /* High Pass Filter, 1: Enabled */ -#define CS4215_12_MASK 0xfcbf /* Mask off reseved bits in slot 1 & 2 */ +#define CS4215_12_MASK 0xfcbf /* Mask off reserved bits in slot 1 & 2 */ /* Time Slot 3, Serial Port Control register */ #define CS4215_XEN (1<<0) /* 0: Enable serial output */ @@ -109,7 +109,7 @@ static struct { /* Time Slot 7, Input Setting */ #define CS4215_LG(v) v /* Left Gain Setting 0xf: 22.5 dB */ #define CS4215_IS (1<<4) /* Input Select: 1=Microphone, 0=Line */ -#define CS4215_OVR (1<<5) /* 1: Overrange condition occured */ +#define CS4215_OVR (1<<5) /* 1: Overrange condition occurred */ #define CS4215_PIO0 (1<<6) /* Parallel I/O 0 */ #define CS4215_PIO1 (1<<7) diff --git a/drivers/sbus/char/bpp.c b/drivers/sbus/char/bpp.c index 2fd13874836f..102063108a39 100644 --- a/drivers/sbus/char/bpp.c +++ b/drivers/sbus/char/bpp.c @@ -45,7 +45,7 @@ static const unsigned BPP_MAJOR = LP_MAJOR; static const char* dev_name = "bpp"; -/* When switching from compatability to a mode where I can read, try +/* When switching from compatibility to a mode where I can read, try the following mode first. */ /* const unsigned char DEFAULT_ECP = 0x10; */ diff --git a/drivers/video/Config.in b/drivers/video/Config.in index b4766876b7d5..ce3456e991f1 100644 --- a/drivers/video/Config.in +++ b/drivers/video/Config.in @@ -7,6 +7,9 @@ if [ "$CONFIG_FB" = "y" ]; then mainmenu_option next_comment comment 'Frame buffer devices' + if [ "$CONFIG_ARCH_ACORN" = "y" ]; then + define_bool CONFIG_FB_ACORN y + fi if [ "$CONFIG_APOLLO" = "y" ]; then define_bool CONFIG_FB_APOLLO y fi @@ -17,6 +20,8 @@ if [ "$CONFIG_FB" = "y" ]; then bool 'Amiga ECS chipset support' CONFIG_FB_AMIGA_ECS bool 'Amiga AGA chipset support' CONFIG_FB_AMIGA_AGA fi + fi + if [ "$CONFIG_ZORRO" = "y" ]; then tristate 'Amiga CyberVision support' CONFIG_FB_CYBER if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then bool 'Amiga CyberVision3D support (experimental)' CONFIG_FB_VIRGE @@ -43,9 +48,22 @@ if [ "$CONFIG_FB" = "y" ]; then if [ "$CONFIG_MAC" = "y" ]; then define_bool CONFIG_FB_MAC y fi + if [ "$CONFIG_HP300" = "y" ]; then + define_bool CONFIG_FB_HP300 y + fi if [ "$CONFIG_TGA_CONSOLE" = "y" ]; then define_bool CONFIG_FB_TGA y fi + if [ "$ARCH" = "i386" -o "$ARCH" = "alpha" -o "$ARCH" = "ppc" ]; then + bool 'VGA chipset support (text only)' CONFIG_FB_VGA + fi + if [ "$ARCH" = "i386" ]; then + bool 'VESA VGA graphics console' CONFIG_FB_VESA + define_bool CONFIG_VIDEO_SELECT y + fi + if [ "$ARCH" = "i386" ]; then + tristate 'MDA dual-headed support' CONFIG_FB_MDA + fi tristate 'Virtual Frame Buffer support (ONLY FOR TESTING!)' CONFIG_FB_VIRTUAL bool 'Advanced low level driver options' CONFIG_FBCON_ADVANCED @@ -63,6 +81,7 @@ if [ "$CONFIG_FB" = "y" ]; then bool 'Atari interleaved bitplanes (4 planes) support' CONFIG_FBCON_IPLAN2P4 bool 'Atari interleaved bitplanes (8 planes) support' CONFIG_FBCON_IPLAN2P8 bool 'Mac variable bpp packed pixels support' CONFIG_FBCON_MAC + bool 'VGA characters/attributes support' CONFIG_FBCON_VGA else if [ "$CONFIG_FB_AMIGA" = "y" -o "$CONFIG_FB_AMIGA" = "m" -o \ "$CONFIG_FB_ATARI" = "y" -o "$CONFIG_FB_ATARI" = "m" -o \ @@ -92,12 +111,14 @@ if [ "$CONFIG_FB" = "y" ]; then "$CONFIG_FB_OF" = "y" -o "$CONFIG_FB_OF" = "m" -o \ "$CONFIG_FB_MAC" = "y" -o "$CONFIG_FB_MAC" = "m" -o \ "$CONFIG_FB_TGA" = "y" -o "$CONFIG_FB_TGA" = "m" -o \ + "$CONFIG_FB_VESA" = "y" -o "$CONFIG_FB_VESA" = "m" -o \ "$CONFIG_FB_VIRTUAL" = "y" -o "$CONFIG_FB_VIRTUAL" = "m" ]; then define_bool CONFIG_FBCON_CFB8 y fi if [ "$CONFIG_FB_ATARI" = "y" -o "$CONFIG_FB_ATARI" = "m" -o \ "$CONFIG_FB_ATY" = "y" -o "$CONFIG_FB_ATY" = "m" -o \ "$CONFIG_FB_MAC" = "y" -o "$CONFIG_FB_MAC" = "m" -o \ + "$CONFIG_FB_VESA" = "y" -o "$CONFIG_FB_VESA" = "m" -o \ "$CONFIG_FB_VIRTUAL" = "y" -o "$CONFIG_FB_VIRTUAL" = "m" ]; then define_bool CONFIG_FBCON_CFB16 y fi @@ -106,9 +127,20 @@ if [ "$CONFIG_FB" = "y" ]; then fi if [ "$CONFIG_FB_ATARI" = "y" -o "$CONFIG_FB_ATARI" = "m" -o \ "$CONFIG_FB_ATY" = "y" -o "$CONFIG_FB_ATY" = "m" -o \ + "$CONFIG_FB_VESA" = "y" -o "$CONFIG_FB_VESA" = "m" -o \ "$CONFIG_FB_VIRTUAL" = "y" -o "$CONFIG_FB_VIRTUAL" = "m" ]; then define_bool CONFIG_FBCON_CFB32 y fi + if [ "$CONFIG_FB_ACORN" != "n" ]; then + define_bool CONFIG_FBCON_MFB y + define_bool CONFIG_FBCON_CFB2 y + define_bool CONFIG_FBCON_CFB4 y + define_bool CONFIG_FBCON_CFB8 y + fi + if [ "$CONFIG_FB_VGA" = "y" -o "$CONFIG_FB_VGA" = "m" -o \ + "$CONFIG_FB_MDA" = "y" -o "$CONFIG_FB_MDA" = "m" ]; then + define_bool CONFIG_FBCON_VGA y + fi fi endmenu diff --git a/drivers/video/Makefile b/drivers/video/Makefile index 2349e4720301..012d282d45ee 100644 --- a/drivers/video/Makefile +++ b/drivers/video/Makefile @@ -64,6 +64,10 @@ ifeq ($(CONFIG_FB_MAC),y) L_OBJS += macfb.o endif +ifeq ($(CONFIG_FB_HP300),y) +L_OBJS += hpfb.o +endif + ifeq ($(CONFIG_FB_OF),y) L_OBJS += offb.o endif @@ -88,6 +92,22 @@ ifeq ($(CONFIG_FB_TGA),y) L_OBJS += tgafb.o endif +ifeq ($(CONFIG_FB_VGA),y) +L_OBJS += vgafb.o +endif + +ifeq ($(CONFIG_FB_VESA),y) +L_OBJS += vesafb.o +endif + +ifeq ($(CONFIG_FB_MDA),y) +L_OBJS += mdafb.o +else + ifeq ($(CONFIG_FB_MDA),m) + M_OBJS += mdafb.o + endif +endif + ifeq ($(CONFIG_FB_VIRGE),y) L_OBJS += virgefb.o else @@ -158,6 +178,10 @@ ifdef CONFIG_FBCON_MFB LX_OBJS += fbcon-mfb.o endif +ifdef CONFIG_FBCON_VGA +LX_OBJS += fbcon-vga.o +endif + # GSP Console ifdef CONFIG_AMIGA_GSP @@ -166,12 +190,18 @@ endif # VGA Text Console -ifdef CONFIG_ABSTRACT_CONSOLE ifdef CONFIG_VGA_CONSOLE +ifndef CONFIG_FB_VGA L_OBJS := $(L_OBJS) vgacon.o endif endif +# Console Wrapper + +ifdef CONFIG_ABSCON_COMPAT +L_OBJS := $(L_OBJS) compatcon.o +endif + include $(TOPDIR)/Rules.make gspcore.c: gspcore.gsp diff --git a/drivers/video/S3triofb.c b/drivers/video/S3triofb.c index 16c0b888a311..0869c6e079bc 100644 --- a/drivers/video/S3triofb.c +++ b/drivers/video/S3triofb.c @@ -23,9 +23,8 @@ */ -#include -#include #include +#include #include #include #include @@ -36,11 +35,18 @@ #include #include #include +#include #include #include +#include #include +#ifdef CONFIG_FB_COMPAT_XPMAC +#include +#endif +#include "fbcon.h" #include "fbcon-cfb8.h" +#include "s3blit.h" #define mem_in8(addr) in_8((void *)(addr)) @@ -60,7 +66,7 @@ static struct display disp; static struct fb_info fb_info; static struct { u_char red, green, blue, pad; } palette[256]; static char s3trio_name[16] = "S3Trio "; - +static char *s3trio_base; static struct fb_fix_screeninfo fb_fix; static struct fb_var_screeninfo fb_var = { 0, }; @@ -70,8 +76,6 @@ static struct fb_var_screeninfo fb_var = { 0, }; * Interface used by the world */ -void of_video_setup(char *options, int *ints); - static int s3trio_open(struct fb_info *info); static int s3trio_release(struct fb_info *info); static int s3trio_get_fix(struct fb_fix_screeninfo *fix, int con, @@ -106,7 +110,9 @@ unsigned long s3trio_fb_init(unsigned long mem_start); static int s3triofbcon_switch(int con, struct fb_info *info); static int s3triofbcon_updatevar(int con, struct fb_info *info); static void s3triofbcon_blank(int blank, struct fb_info *info); +#if 0 static int s3triofbcon_setcmap(struct fb_cmap *cmap, int con); +#endif /* * Text console acceleration @@ -138,12 +144,12 @@ static int s3trio_getcolreg(u_int regno, u_int *red, u_int *green, u_int *blue, u_int *transp, struct fb_info *info); static int s3trio_setcolreg(u_int regno, u_int red, u_int green, u_int blue, u_int transp, struct fb_info *info); -static void do_install_cmap(int con); +static void do_install_cmap(int con, struct fb_info *info); static struct fb_ops s3trio_ops = { s3trio_open, s3trio_release, s3trio_get_fix, s3trio_get_var, s3trio_set_var, - s3trio_get_cmap, s3trio_set_cmap, s3trio_pan_display, NULL, s3trio_ioctl + s3trio_get_cmap, s3trio_set_cmap, s3trio_pan_display, s3trio_ioctl }; @@ -200,11 +206,16 @@ static int s3trio_set_var(struct fb_var_screeninfo *var, int con, struct fb_info *info) { if (var->xres > fb_var.xres || var->yres > fb_var.yres || - var->xres_virtual > fb_var.xres_virtual || - var->yres_virtual > fb_var.yres_virtual || - var->bits_per_pixel > fb_var.bits_per_pixel || - var->nonstd || var->vmode != FB_VMODE_NONINTERLACED) + var->bits_per_pixel > fb_var.bits_per_pixel ) + /* || var->nonstd || var->vmode != FB_VMODE_NONINTERLACED) */ return -EINVAL; + if (var->xres_virtual > fb_var.xres_virtual) { + outw(IO_OUT16VAL((var->xres_virtual /8) & 0xff, 0x13), 0x3d4); + outw(IO_OUT16VAL(((var->xres_virtual /8 ) & 0x300) >> 3, 0x51), 0x3d4); + fb_var.xres_virtual = var->xres_virtual; + fb_fix.line_length = var->xres_virtual; + } + fb_var.yres_virtual = var->yres_virtual; memcpy(var, &fb_var, sizeof(fb_var)); return 0; } @@ -219,12 +230,25 @@ static int s3trio_set_var(struct fb_var_screeninfo *var, int con, static int s3trio_pan_display(struct fb_var_screeninfo *var, int con, struct fb_info *info) { - if (var->xoffset || var->yoffset) + unsigned int base; + + if (var->xoffset > (var->xres_virtual - var->xres)) return -EINVAL; - else - return 0; + if (var->yoffset > (var->yres_virtual - var->yres)) + return -EINVAL; + + fb_var.xoffset = var->xoffset; + fb_var.yoffset = var->yoffset; + + base = var->yoffset * fb_fix.line_length + var->xoffset; + + outw(IO_OUT16VAL((base >> 8) & 0xff, 0x0c),0x03D4); + outw(IO_OUT16VAL(base & 0xff, 0x0d),0x03D4); + outw(IO_OUT16VAL((base >> 16) & 0xf, 0x69),0x03D4); + return 0; } + /* * Get the Colormap */ @@ -238,7 +262,7 @@ static int s3trio_get_cmap(struct fb_cmap *cmap, int kspc, int con, else if (fb_display[con].cmap.len) /* non default colormap? */ fb_copy_cmap(&fb_display[con].cmap, cmap, kspc ? 0 : 2); else - fb_copy_cmap(fb_default_cmap(fb_display[con].var.bits_per_pixel), + fb_copy_cmap(fb_default_cmap(1 << fb_display[con].var.bits_per_pixel), cmap, kspc ? 0 : 2); return 0; } @@ -273,7 +297,18 @@ static int s3trio_ioctl(struct inode *inode, struct file *file, u_int cmd, return -EINVAL; } -__initfunc(int s3trio_resetaccel(void)) { +__initfunc(unsigned long s3triofb_init(unsigned long mem_start)) +{ +#ifdef __powerpc__ + /* We don't want to be called like this. */ + /* We rely on Open Firmware (offb) instead. */ +#else /* !__powerpc__ */ + /* To be merged with cybervision */ +#endif /* !__powerpc__ */ + return mem_start; +} + +__initfunc(void s3trio_resetaccel(void)) { #define EC01_ENH_ENB 0x0005 @@ -314,18 +349,15 @@ __initfunc(int s3trio_resetaccel(void)) { outw(0xffff, 0xaae8); /* Enable all planes */ outw(0xffff, 0xaae8); /* Enable all planes */ outw( MF_PIX_CONTROL | MFA_SRC_FOREGR_MIX, 0xbee8); - } -__initfunc(int s3trio_init(void)) { +__initfunc(int s3trio_init(struct device_node *dp)) { u_char bus, dev; unsigned int t32; unsigned short cmd; - int i; - bus=0; - dev=(3<<3); + pci_device_loc(dp,&bus,&dev); pcibios_read_config_dword(bus, dev, PCI_VENDOR_ID, &t32); if(t32 == (PCI_DEVICE_ID_S3_TRIO << 16) + PCI_VENDOR_ID_S3) { pcibios_read_config_dword(bus, dev, PCI_BASE_ADDRESS_0, &t32); @@ -351,16 +383,16 @@ __initfunc(int s3trio_init(void)) { outw(IO_OUT16VAL(0x48, 0x38),0x03D4); outw(IO_OUT16VAL(0xA0, 0x39),0x03D4); outb(0x33,0x3d4); - outw(IO_OUT16VAL( inb(0x3d5) & ~(0x2 | - 0x10 | 0x40) , 0x33),0x3d4); + outw(IO_OUT16VAL((inb(0x3d5) & ~(0x2 | 0x10 | 0x40)) | + 0x20, 0x33), 0x3d4); - outw(IO_OUT16VAL(0x6,0x8), 0x3c4); + outw(IO_OUT16VAL(0x6, 0x8), 0x3c4); /* switch to MMIO only mode */ - outb(0x58,0x3d4); - outw(IO_OUT16VAL(inb(0x3d5) | 3 | 0x10,0x58),0x3d4); - outw(IO_OUT16VAL(8,0x53),0x3d4); + outb(0x58, 0x3d4); + outw(IO_OUT16VAL(inb(0x3d5) | 3 | 0x10, 0x58), 0x3d4); + outw(IO_OUT16VAL(8, 0x53), 0x3d4); /* switch off I/O accesses */ @@ -368,6 +400,7 @@ __initfunc(int s3trio_init(void)) { pcibios_write_config_word(bus, dev, PCI_COMMAND, PCI_COMMAND_IO | PCI_COMMAND_MEMORY); #endif + return 1; } return 0; @@ -379,18 +412,12 @@ __initfunc(int s3trio_init(void)) { * We heavily rely on OF for the moment. This needs fixing. */ -__initfunc(unsigned long s3trio_fb_init(unsigned long mem_start)) +__initfunc(void s3triofb_init_of(struct device_node *dp)) { - struct device_node *dp; int i, err, *pp, len; - unsigned *up, address; + unsigned long address; u_long *CursorBase; - if (!prom_display_paths[0]) - return mem_start; - if (!(dp = find_path_device(prom_display_paths[0]))) - return mem_start; - strncat(s3trio_name, dp->name, sizeof(s3trio_name)); s3trio_name[sizeof(s3trio_name)-1] = '\0'; strcpy(fb_fix.id, s3trio_name); @@ -398,19 +425,19 @@ __initfunc(unsigned long s3trio_fb_init(unsigned long mem_start)) if((pp = (int *)get_property(dp, "vendor-id", &len)) != NULL && *pp!=PCI_VENDOR_ID_S3) { printk("%s: can't find S3 Trio board\n", dp->full_name); - return mem_start; + return; } if((pp = (int *)get_property(dp, "device-id", &len)) != NULL && *pp!=PCI_DEVICE_ID_S3_TRIO) { printk("%s: can't find S3 Trio board\n", dp->full_name); - return mem_start; + return; } if ((pp = (int *)get_property(dp, "depth", &len)) != NULL && len == sizeof(int) && *pp != 8) { printk("%s: can't use depth = %d\n", dp->full_name, *pp); - return mem_start; + return; } if ((pp = (int *)get_property(dp, "width", &len)) != NULL && len == sizeof(int)) @@ -425,45 +452,51 @@ __initfunc(unsigned long s3trio_fb_init(unsigned long mem_start)) fb_fix.line_length = fb_var.xres_virtual; fb_fix.smem_len = fb_fix.line_length*fb_var.yres; - s3trio_init(); - address=0xc6000000; - fb_fix.smem_start = ioremap(address,64*1024*1024); + s3trio_init(dp); + address = 0xc6000000; + s3trio_base = ioremap(address,64*1024*1024); + fb_fix.smem_start = (char *)address; fb_fix.type = FB_TYPE_PACKED_PIXELS; fb_fix.type_aux = 0; + fb_fix.accel = FB_ACCEL_S3_TRIO64; + fb_fix.mmio_start = (char *)address+0x1000000; + fb_fix.mmio_len = 0x1000000; + fb_fix.xpanstep = 1; + fb_fix.ypanstep = 1; s3trio_resetaccel(); - mem_out8(0x30,fb_fix.smem_start+0x1008000 + 0x03D4); - mem_out8(0x2d,fb_fix.smem_start+0x1008000 + 0x03D4); - mem_out8(0x2e,fb_fix.smem_start+0x1008000 + 0x03D4); + mem_out8(0x30, s3trio_base+0x1008000 + 0x03D4); + mem_out8(0x2d, s3trio_base+0x1008000 + 0x03D4); + mem_out8(0x2e, s3trio_base+0x1008000 + 0x03D4); - mem_out8(0x50,fb_fix.smem_start+0x1008000 + 0x03D4); + mem_out8(0x50, s3trio_base+0x1008000 + 0x03D4); /* disable HW cursor */ - mem_out8(0x39,fb_fix.smem_start+0x1008000 + 0x03D4); - mem_out8(0xa0,fb_fix.smem_start+0x1008000 + 0x03D5); + mem_out8(0x39, s3trio_base+0x1008000 + 0x03D4); + mem_out8(0xa0, s3trio_base+0x1008000 + 0x03D5); - mem_out8(0x45,fb_fix.smem_start+0x1008000 + 0x03D4); - mem_out8(0,fb_fix.smem_start+0x1008000 + 0x03D5); + mem_out8(0x45, s3trio_base+0x1008000 + 0x03D4); + mem_out8(0, s3trio_base+0x1008000 + 0x03D5); - mem_out8(0x4e,fb_fix.smem_start+0x1008000 + 0x03D4); - mem_out8(0,fb_fix.smem_start+0x1008000 + 0x03D5); + mem_out8(0x4e, s3trio_base+0x1008000 + 0x03D4); + mem_out8(0, s3trio_base+0x1008000 + 0x03D5); - mem_out8(0x4f,fb_fix.smem_start+0x1008000 + 0x03D4); - mem_out8(0,fb_fix.smem_start+0x1008000 + 0x03D5); + mem_out8(0x4f, s3trio_base+0x1008000 + 0x03D4); + mem_out8(0, s3trio_base+0x1008000 + 0x03D5); /* init HW cursor */ - CursorBase=(u_long *)(fb_fix.smem_start + 2*1024*1024 - 0x400); - for (i=0; i < 8; i++) { + CursorBase = (u_long *)(s3trio_base + 2*1024*1024 - 0x400); + for (i = 0; i < 8; i++) { *(CursorBase +(i*4)) = 0xffffff00; *(CursorBase+1+(i*4)) = 0xffff0000; *(CursorBase+2+(i*4)) = 0xffff0000; *(CursorBase+3+(i*4)) = 0xffff0000; } - for (i=8; i < 64; i++) { + for (i = 8; i < 64; i++) { *(CursorBase +(i*4)) = 0xffff0000; *(CursorBase+1+(i*4)) = 0xffff0000; *(CursorBase+2+(i*4)) = 0xffff0000; @@ -471,34 +504,43 @@ __initfunc(unsigned long s3trio_fb_init(unsigned long mem_start)) } - mem_out8(0x4c,fb_fix.smem_start+0x1008000 + 0x03D4); - mem_out8(((2*1024 - 1)&0xf00)>>8,fb_fix.smem_start+0x1008000 + 0x03D5); + mem_out8(0x4c, s3trio_base+0x1008000 + 0x03D4); + mem_out8(((2*1024 - 1)&0xf00)>>8, s3trio_base+0x1008000 + 0x03D5); + + mem_out8(0x4d, s3trio_base+0x1008000 + 0x03D4); + mem_out8((2*1024 - 1) & 0xff, s3trio_base+0x1008000 + 0x03D5); - mem_out8(0x4d,fb_fix.smem_start+0x1008000 + 0x03D4); - mem_out8((2*1024 - 1) & 0xff,fb_fix.smem_start+0x1008000 + 0x03D5); + mem_out8(0x45, s3trio_base+0x1008000 + 0x03D4); + mem_in8(s3trio_base+0x1008000 + 0x03D4); - mem_out8(0x45,fb_fix.smem_start+0x1008000 + 0x03D4); - mem_in8(fb_fix.smem_start+0x1008000 + 0x03D4); + mem_out8(0x4a, s3trio_base+0x1008000 + 0x03D4); + mem_out8(0x80, s3trio_base+0x1008000 + 0x03D5); + mem_out8(0x80, s3trio_base+0x1008000 + 0x03D5); + mem_out8(0x80, s3trio_base+0x1008000 + 0x03D5); - mem_out8(0x4a,fb_fix.smem_start+0x1008000 + 0x03D4); - mem_out8(0x80,fb_fix.smem_start+0x1008000 + 0x03D5); - mem_out8(0x80,fb_fix.smem_start+0x1008000 + 0x03D5); - mem_out8(0x80,fb_fix.smem_start+0x1008000 + 0x03D5); + mem_out8(0x4b, s3trio_base+0x1008000 + 0x03D4); + mem_out8(0x00, s3trio_base+0x1008000 + 0x03D5); + mem_out8(0x00, s3trio_base+0x1008000 + 0x03D5); + mem_out8(0x00, s3trio_base+0x1008000 + 0x03D5); - mem_out8(0x4b,fb_fix.smem_start+0x1008000 + 0x03D4); - mem_out8(0x00,fb_fix.smem_start+0x1008000 + 0x03D5); - mem_out8(0x00,fb_fix.smem_start+0x1008000 + 0x03D5); - mem_out8(0x00,fb_fix.smem_start+0x1008000 + 0x03D5); + mem_out8(0x45, s3trio_base+0x1008000 + 0x03D4); + mem_out8(0, s3trio_base+0x1008000 + 0x03D5); - mem_out8(0x45,fb_fix.smem_start+0x1008000 + 0x03D4); - mem_out8(0,fb_fix.smem_start+0x1008000 + 0x03D5); + /* setup default color table */ + + for(i = 0; i < 16; i++) { + int j = color_table[i]; + palette[i].red=default_red[j]; + palette[i].green=default_grn[j]; + palette[i].blue=default_blu[j]; + } s3trio_setcolreg(255, 56, 100, 160, 0, NULL /* not used */); s3trio_setcolreg(254, 0, 0, 0, 0, NULL /* not used */); - memset((char *)fb_fix.smem_start,0,640*480); + memset((char *)s3trio_base, 0, 640*480); #if 0 - Trio_RectFill(0,0,90,90,7,1); + Trio_RectFill(0, 0, 90, 90, 7, 1); #endif fb_fix.visual = FB_VISUAL_PSEUDOCOLOR ; @@ -512,7 +554,8 @@ __initfunc(unsigned long s3trio_fb_init(unsigned long mem_start)) fb_var.nonstd = 0; fb_var.activate = 0; fb_var.height = fb_var.width = -1; - fb_var.accel = 5; + fb_var.accel_flags = FB_ACCELF_TEXT; +#warning FIXME: always obey fb_var.accel_flags fb_var.pixclock = 1; fb_var.left_margin = fb_var.right_margin = 0; fb_var.upper_margin = fb_var.lower_margin = 0; @@ -524,7 +567,7 @@ __initfunc(unsigned long s3trio_fb_init(unsigned long mem_start)) disp.cmap.start = 0; disp.cmap.len = 0; disp.cmap.red = disp.cmap.green = disp.cmap.blue = disp.cmap.transp = NULL; - disp.screen_base = fb_fix.smem_start; + disp.screen_base = s3trio_base; disp.visual = fb_fix.visual; disp.type = fb_fix.type; disp.type_aux = fb_fix.type_aux; @@ -534,7 +577,10 @@ __initfunc(unsigned long s3trio_fb_init(unsigned long mem_start)) disp.can_soft_blank = 1; disp.inverse = 0; #ifdef CONFIG_FBCON_CFB8 - disp.dispsw = &fbcon_trio8; + if (fb_var.accel_flags & FB_ACCELF_TEXT) + disp.dispsw = &fbcon_trio8; + else + disp.dispsw = &fbcon_cfb8; #else disp.dispsw = NULL; #endif @@ -577,12 +623,10 @@ __initfunc(unsigned long s3trio_fb_init(unsigned long mem_start)) err = register_framebuffer(&fb_info); if (err < 0) - return mem_start; + return; printk("fb%d: S3 Trio frame buffer device on %s\n", GET_FB_IDX(fb_info.node), dp->full_name); - - return mem_start; } @@ -595,7 +639,7 @@ static int s3triofbcon_switch(int con, struct fb_info *info) currcon = con; /* Install new colormap */ - do_install_cmap(con); + do_install_cmap(con,info); return 0; } @@ -615,17 +659,23 @@ static int s3triofbcon_updatevar(int con, struct fb_info *info) static void s3triofbcon_blank(int blank, struct fb_info *info) { - /* Nothing */ + unsigned char x; + + mem_out8(0x1, s3trio_base+0x1008000 + 0x03c4); + x = mem_in8(s3trio_base+0x1008000 + 0x03c5); + mem_out8((x & (~0x20)) | (blank << 5), s3trio_base+0x1008000 + 0x03c5); } /* * Set the colormap */ +#if 0 static int s3triofbcon_setcmap(struct fb_cmap *cmap, int con) { return(s3trio_set_cmap(cmap, 1, con, &fb_info)); } +#endif /* @@ -660,16 +710,16 @@ static int s3trio_setcolreg(u_int regno, u_int red, u_int green, u_int blue, palette[regno].green = green; palette[regno].blue = blue; - mem_out8(regno,fb_fix.smem_start+0x1008000 + 0x3c8); - mem_out8((red & 0xff) >> 2,fb_fix.smem_start+0x1008000 + 0x3c9); - mem_out8((green & 0xff) >> 2,fb_fix.smem_start+0x1008000 + 0x3c9); - mem_out8((blue & 0xff) >> 2,fb_fix.smem_start+0x1008000 + 0x3c9); + mem_out8(regno,s3trio_base+0x1008000 + 0x3c8); + mem_out8((red & 0xff) >> 2,s3trio_base+0x1008000 + 0x3c9); + mem_out8((green & 0xff) >> 2,s3trio_base+0x1008000 + 0x3c9); + mem_out8((blue & 0xff) >> 2,s3trio_base+0x1008000 + 0x3c9); return 0; } -static void do_install_cmap(int con) +static void do_install_cmap(int con, struct fb_info *info) { if (con != currcon) return; @@ -689,6 +739,9 @@ static void do_install_cmap(int con) static int s3trio_console_setmode(struct vc_mode *mode, int doit) { +#if 1 + return -EINVAL; +#else int err; struct fb_var_screeninfo var; struct s3trio_par par; @@ -718,11 +771,12 @@ static int s3trio_console_setmode(struct vc_mode *mode, int doit) if (doit) s3trio_set_var(&var, currcon, 0); return 0; +#endif } #endif /* CONFIG_FB_COMPAT_XPMAC */ -void s3trio_video_setup(char *options, int *ints) { +void s3triofb_setup(char *options, int *ints) { return; @@ -734,7 +788,7 @@ static void Trio_WaitQueue(u_short fifo) { do { - status = mem_in16(fb_fix.smem_start + 0x1000000 + 0x9AE8); + status = mem_in16(s3trio_base + 0x1000000 + 0x9AE8); } while (!(status & fifo)); } @@ -745,7 +799,7 @@ static void Trio_WaitBlit(void) { do { - status = mem_in16(fb_fix.smem_start + 0x1000000 + 0x9AE8); + status = mem_in16(s3trio_base + 0x1000000 + 0x9AE8); } while (status & 0x200); } @@ -813,18 +867,18 @@ static void Trio_RectFill(u_short x, u_short y, u_short width, u_short height, static void Trio_MoveCursor(u_short x, u_short y) { - mem_out8(0x39, fb_fix.smem_start + 0x1008000 + 0x3d4); - mem_out8(0xa0, fb_fix.smem_start + 0x1008000 + 0x3d5); + mem_out8(0x39, s3trio_base + 0x1008000 + 0x3d4); + mem_out8(0xa0, s3trio_base + 0x1008000 + 0x3d5); - mem_out8(0x46, fb_fix.smem_start + 0x1008000 + 0x3d4); - mem_out8((x & 0x0700) >> 8, fb_fix.smem_start + 0x1008000 + 0x3d5); - mem_out8(0x47, fb_fix.smem_start + 0x1008000 + 0x3d4); - mem_out8(x & 0x00ff, fb_fix.smem_start + 0x1008000 + 0x3d5); + mem_out8(0x46, s3trio_base + 0x1008000 + 0x3d4); + mem_out8((x & 0x0700) >> 8, s3trio_base + 0x1008000 + 0x3d5); + mem_out8(0x47, s3trio_base + 0x1008000 + 0x3d4); + mem_out8(x & 0x00ff, s3trio_base + 0x1008000 + 0x3d5); - mem_out8(0x48, fb_fix.smem_start + 0x1008000 + 0x3d4); - mem_out8((y & 0x0700) >> 8, fb_fix.smem_start + 0x1008000 + 0x3d5); - mem_out8(0x49, fb_fix.smem_start + 0x1008000 + 0x3d4); - mem_out8(y & 0x00ff, fb_fix.smem_start + 0x1008000 + 0x3d5); + mem_out8(0x48, s3trio_base + 0x1008000 + 0x3d4); + mem_out8((y & 0x0700) >> 8, s3trio_base + 0x1008000 + 0x3d5); + mem_out8(0x49, s3trio_base + 0x1008000 + 0x3d4); + mem_out8(y & 0x00ff, s3trio_base + 0x1008000 + 0x3d5); } @@ -880,6 +934,6 @@ static void fbcon_trio8_revc(struct display *p, int xx, int yy) static struct display_switch fbcon_trio8 = { fbcon_cfb8_setup, fbcon_trio8_bmove, fbcon_trio8_clear, fbcon_trio8_putc, - fbcon_trio8_putcs, fbcon_trio8_revc + fbcon_trio8_putcs, fbcon_trio8_revc, NULL }; #endif diff --git a/drivers/video/amifb.c b/drivers/video/amifb.c index 09ff067dfe53..00b44b5562d3 100644 --- a/drivers/video/amifb.c +++ b/drivers/video/amifb.c @@ -579,8 +579,14 @@ static u_short maxfmode, chipset; #define modx(x,v) ((v) & ((x)-1)) /* if x1 is not a constant, this macro won't make real sense :-) */ +#ifdef __mc68000__ #define DIVUL(x1, x2) ({int res; asm("divul %1,%2,%3": "=d" (res): \ "d" (x2), "d" ((long)((x1)/0x100000000ULL)), "0" ((long)(x1))); res;}) +#else +/* We know a bit about the numbers, so we can do it this way */ +#define DIVUL(x1, x2) ((((long)((unsigned long long)x1 >> 8) / x2) << 8) + \ + ((((long)((unsigned long long)x1 >> 8) % x2) << 8) / x2)) +#endif #define min(a, b) ((a) < (b) ? (a) : (b)) #define max(a, b) ((a) > (b) ? (a) : (b)) @@ -1245,7 +1251,7 @@ extern unsigned short ami_intena_vals[]; static struct fb_ops amifb_ops = { amifb_open, amifb_release, amifb_get_fix, amifb_get_var, amifb_set_var, amifb_get_cmap, amifb_set_cmap, - amifb_pan_display, NULL, amifb_ioctl + amifb_pan_display, amifb_ioctl }; @@ -1803,9 +1809,13 @@ default_chipset: * Calculate the Pixel Clock Values for this Machine */ - pixclock[TAG_SHRES] = DIVUL(25E9, amiga_eclock); /* SHRES: 35 ns / 28 MHz */ - pixclock[TAG_HIRES] = DIVUL(50E9, amiga_eclock); /* HIRES: 70 ns / 14 MHz */ - pixclock[TAG_LORES] = DIVUL(100E9, amiga_eclock); /* LORES: 140 ns / 7 MHz */ + { + u_long tmp = DIVUL(200E9, amiga_eclock); + + pixclock[TAG_SHRES] = (tmp + 4) / 8; /* SHRES: 35 ns / 28 MHz */ + pixclock[TAG_HIRES] = (tmp + 2) / 4; /* HIRES: 70 ns / 14 MHz */ + pixclock[TAG_LORES] = (tmp + 1) / 2; /* LORES: 140 ns / 7 MHz */ + } /* * Replace the Tag Values with the Real Pixel Clock Values @@ -2543,7 +2553,8 @@ static int ami_encode_var(struct fb_var_screeninfo *var, struct amifb_par *par) { u_short clk_shift, line_shift; - int i; + + memset(var, 0, sizeof(struct fb_var_screeninfo)); clk_shift = par->clk_shift; line_shift = par->line_shift; @@ -2626,9 +2637,6 @@ static int ami_encode_var(struct fb_var_screeninfo *var, if (par->vmode & FB_VMODE_YWRAP) var->vmode |= FB_VMODE_YWRAP; - for (i = 0; i < arraysize(var->reserved); i++) - var->reserved[i] = 0; - return 0; } @@ -2927,20 +2935,20 @@ static void ami_do_blank(void) custom.dmacon = DMAF_RASTER | DMAF_SPRITE; red = green = blue = 0; if (!IS_OCS && do_blank > 1) { - switch (do_blank) { - case 2 : /* suspend vsync */ + switch (do_blank-1) { + case VESA_VSYNC_SUSPEND: custom.hsstrt = hsstrt2hw(par->hsstrt); custom.hsstop = hsstop2hw(par->hsstop); custom.vsstrt = vsstrt2hw(par->vtotal+4); custom.vsstop = vsstop2hw(par->vtotal+4); break; - case 3 : /* suspend hsync */ + case VESA_HSYNC_SUSPEND: custom.hsstrt = hsstrt2hw(par->htotal+16); custom.hsstop = hsstop2hw(par->htotal+16); custom.vsstrt = vsstrt2hw(par->vsstrt); custom.vsstop = vsstrt2hw(par->vsstop); break; - case 4 : /* powerdown */ + case VESA_POWERDOWN: custom.hsstrt = hsstrt2hw(par->htotal+16); custom.hsstop = hsstop2hw(par->htotal+16); custom.vsstrt = vsstrt2hw(par->vtotal+4); diff --git a/drivers/video/atafb.c b/drivers/video/atafb.c index ff7aedfe7ea7..5052c3f07aeb 100644 --- a/drivers/video/atafb.c +++ b/drivers/video/atafb.c @@ -492,6 +492,7 @@ static int tt_encode_fix( struct fb_fix_screeninfo *fix, fix->ypanstep=1; fix->ywrapstep=0; fix->line_length = 0; + fix->accel = FB_ACCEL_ATARIBLITT; return 0; } @@ -580,7 +581,8 @@ static int tt_decode_var( struct fb_var_screeninfo *var, static int tt_encode_var( struct fb_var_screeninfo *var, struct atafb_par *par ) { - int linelen, i; + int linelen; + memset(var, 0, sizeof(struct fb_var_screeninfo)); var->red.offset=0; var->red.length=4; var->red.msb_right=0; @@ -668,8 +670,6 @@ static int tt_encode_var( struct fb_var_screeninfo *var, var->nonstd=0; var->activate=0; var->vmode=FB_VMODE_NONINTERLACED; - for (i=0; ireserved); i++) - var->reserved[i]=0; return 0; } @@ -816,6 +816,7 @@ static int falcon_encode_fix( struct fb_fix_screeninfo *fix, fix->xpanstep = 2; } fix->line_length = 0; + fix->accel = FB_ACCEL_ATARIBLITT; return 0; } @@ -1306,11 +1307,12 @@ static int falcon_encode_var( struct fb_var_screeninfo *var, struct atafb_par *par ) { /* !!! only for VGA !!! */ - int linelen, i; + int linelen; int prescale, plen; int hdb_off, hde_off, base_off; struct falcon_hw *hw = &par->hw.falcon; + memset(var, 0, sizeof(struct fb_var_screeninfo)); /* possible frequencies: 25.175 or 32MHz */ var->pixclock = hw->sync & 0x1 ? fext.t : hw->vid_control & VCO_CLOCK25 ? f25.t : f32.t; @@ -1461,8 +1463,6 @@ static int falcon_encode_var( struct fb_var_screeninfo *var, var->yoffset=0; var->nonstd=0; /* what is this for? */ var->activate=0; - for (i=0; ireserved); i++) - var->reserved[i]=0; return 0; } @@ -1773,6 +1773,7 @@ static int stste_encode_fix( struct fb_fix_screeninfo *fix, } fix->ywrapstep = 0; fix->line_length = 0; + fix->accel = FB_ACCEL_ATARIBLITT; return 0; } @@ -1838,7 +1839,8 @@ static int stste_decode_var( struct fb_var_screeninfo *var, static int stste_encode_var( struct fb_var_screeninfo *var, struct atafb_par *par ) { - int linelen, i; + int linelen; + memset(var, 0, sizeof(struct fb_var_screeninfo)); var->red.offset=0; var->red.length = ATARIHW_PRESENT(EXTD_SHIFTER) ? 4 : 3; var->red.msb_right=0; @@ -1908,8 +1910,6 @@ static int stste_encode_var( struct fb_var_screeninfo *var, var->nonstd=0; var->activate=0; var->vmode=FB_VMODE_NONINTERLACED; - for (i=0; ireserved); i++) - var->reserved[i]=0; return 0; } @@ -2145,8 +2145,7 @@ static int ext_decode_var( struct fb_var_screeninfo *var, static int ext_encode_var( struct fb_var_screeninfo *var, struct atafb_par *par ) { - int i; - + memset(var, 0, sizeof(struct fb_var_screeninfo)); var->red.offset=0; var->red.length=(external_pmode == -1) ? external_depth/3 : (external_vgaiobase ? external_bitspercol : 0); @@ -2181,8 +2180,6 @@ static int ext_encode_var( struct fb_var_screeninfo *var, var->nonstd=0; var->activate=0; var->vmode=FB_VMODE_NONINTERLACED; - for (i=0; ireserved); i++) - var->reserved[i]=0; return 0; } @@ -2470,7 +2467,7 @@ atafb_set_disp(int con, struct fb_info *info) atafb_get_var(&var, con, info); if (con == -1) con=0; - display->screen_base = (u_char *)fix.smem_start; + display->screen_base = fix.smem_start; display->visual = fix.visual; display->type = fix.type; display->type_aux = fix.type_aux; @@ -2642,7 +2639,7 @@ atafb_ioctl(struct inode *inode, struct file *file, unsigned int cmd, static struct fb_ops atafb_ops = { atafb_open, atafb_release, atafb_get_fix, atafb_get_var, atafb_set_var, atafb_get_cmap, atafb_set_cmap, - atafb_pan_display, NULL, atafb_ioctl + atafb_pan_display, atafb_ioctl }; static void diff --git a/drivers/video/aty.h b/drivers/video/aty.h index 7c9b00ad7ec7..f3ac3be1876e 100644 --- a/drivers/video/aty.h +++ b/drivers/video/aty.h @@ -223,8 +223,8 @@ #define DP_BKGD_CLR 0x02C0 /* Dword offset 0_B0 */ #define DP_FOG_CLR 0x02C4 /* Dword offset 0_B1 */ #define DP_FRGD_CLR 0x02C4 /* Dword offset 0_B1 */ -#define DP_WRITE_MSK 0x02C8 /* Dword offset 0_B2 */ -#define DP_CHAIN_MSK 0x02CC /* Dword offset 0_B3 */ +#define DP_WRITE_MASK 0x02C8 /* Dword offset 0_B2 */ +#define DP_CHAIN_MASK 0x02CC /* Dword offset 0_B3 */ #define DP_PIX_WIDTH 0x02D0 /* Dword offset 0_B4 */ #define DP_MIX 0x02D4 /* Dword offset 0_B5 */ #define DP_SRC 0x02D8 /* Dword offset 0_B6 */ @@ -238,7 +238,7 @@ #define DP_SET_GUI_ENGINE 0x02FC /* Dword offset 0_BF */ #define CLR_CMP_CLR 0x0300 /* Dword offset 0_C0 */ -#define CLR_CMP_MSK 0x0304 /* Dword offset 0_C1 */ +#define CLR_CMP_MASK 0x0304 /* Dword offset 0_C1 */ #define CLR_CMP_CNTL 0x0308 /* Dword offset 0_C2 */ #define FIFO_STAT 0x0310 /* Dword offset 0_C4 */ @@ -569,7 +569,8 @@ #define PLL_WR_EN 0x02 /* PLL registers */ -#define PLL_MACRO_CNTL 0x01 +#define MPLL_CNTL 0x00 +#define VPLL_CNTL 0x01 #define PLL_REF_DIV 0x02 #define PLL_GEN_CNTL 0x03 #define MCLK_FB_DIV 0x04 @@ -579,7 +580,9 @@ #define VCLK1_FB_DIV 0x08 #define VCLK2_FB_DIV 0x09 #define VCLK3_FB_DIV 0x0A -#define PLL_XCLK_CNTL 0x0B +#define PLL_EXT_CNTL 0x0B +#define DLL_CNTL 0x0C +#define VFC_CNTL 0x0D #define PLL_TEST_CTRL 0x0E #define PLL_TEST_COUNT 0x0F @@ -688,28 +691,88 @@ /* ATI PCI constants */ #define PCI_ATI_VENDOR_ID 0x1002 -#define PCI_MACH64_GX 0x4758 -#define PCI_MACH64_CX 0x4358 -#define PCI_MACH64_CT 0x4354 -#define PCI_MACH64_ET 0x4554 -#define PCI_MACH64_VT 0x5654 -#define PCI_MACH64_GT 0x4754 + +/* mach64GX family */ +#define PCI_MACH64_GX 0x4758 /* mach64GX (ATI888GX00) */ +#define PCI_MACH64_CX 0x4358 /* mach64CX (ATI888CX00) */ + +/* mach64CT family */ +#define PCI_MACH64_CT 0x4354 /* mach64CT (ATI264CT) */ +#define PCI_MACH64_ET 0x4554 /* mach64ET (ATI264ET) */ + +/* mach64CT family / mach64VT class */ +#define PCI_MACH64_VT 0x5654 /* mach64VT (ATI264VT) */ +#define PCI_MACH64_VTB 0x5655 /* mach64VTB (ATI264VTB) */ +#define PCI_MACH64_VT4 0x5656 /* mach64VT4 (ATI264VT4) */ + +/* mach64CT family / mach64GT (3D RAGE) class */ +#define PCI_MACH64_GB 0x4742 /* RAGE PRO, BGA, AGP 1x and 2x */ +#define PCI_MACH64_GD 0x4744 /* RAGE PRO, BGA, AGP 1x only */ +#define PCI_MACH64_GI 0x4749 /* RAGE PRO, BGA, PCI33 only */ +#define PCI_MACH64_GP 0x4750 /* RAGE PRO, PQFP, PCI33, full 3D */ +#define PCI_MACH64_GQ 0x4751 /* RAGE PRO, PQFP, PCI33, limited 3D */ +#define PCI_MACH64_GT 0x4754 /* 3D RAGE II/II+ */ +#define PCI_MACH64_GTB 0x4755 /* 3D II+ */ +#define PCI_MACH64_GTC 0x4756 /* 3D RAGE IIC */ +#define PCI_MACH64_LT 0x4c47 /* 3D RAGE LT */ + /* CONFIG_CHIP_ID register constants */ #define CFG_CHIP_TYPE 0x0000FFFF #define CFG_CHIP_CLASS 0x00FF0000 #define CFG_CHIP_REV 0xFF000000 -#define CFG_CHIP_VERSION 0x07000000 -#define CFG_CHIP_FOUNDRY 0x38000000 -#define CFG_CHIP_REVISION 0xC0000000 +#define CFG_CHIP_MAJOR 0x07000000 +#define CFG_CHIP_FND_ID 0x38000000 +#define CFG_CHIP_MINOR 0xC0000000 + /* Chip IDs read from CONFIG_CHIP_ID */ -#define MACH64_GX_ID 0xD7 -#define MACH64_CX_ID 0x57 -#define MACH64_CT_ID 0x4354 -#define MACH64_ET_ID 0x4554 -#define MACH64_VT_ID 0x5654 -#define MACH64_GT_ID 0x4754 + +/* mach64GX family */ +#define MACH64_GX_ID 0xD7 /* mach64GX (ATI888GX00) */ +#define MACH64_CX_ID 0x57 /* mach64CX (ATI888CX00) */ + +/* mach64CT family */ +#define MACH64_CT_ID PCI_MACH64_CT +#define MACH64_ET_ID PCI_MACH64_ET + +/* mach64CT family / mach64VT class */ +#define MACH64_VT_ID PCI_MACH64_VT +#define MACH64_VTB_ID PCI_MACH64_VTB +#define MACH64_VT4_ID PCI_MACH64_VT4 + +/* mach64CT family / mach64GT (3D RAGE) class */ +#define MACH64_GB_ID PCI_MACH64_GB +#define MACH64_GD_ID PCI_MACH64_GD +#define MACH64_GI_ID PCI_MACH64_GI +#define MACH64_GP_ID PCI_MACH64_GP +#define MACH64_GQ_ID PCI_MACH64_GQ +#define MACH64_GT_ID PCI_MACH64_GT +#define MACH64_GTB_ID PCI_MACH64_GTB +#define MACH64_GTC_ID PCI_MACH64_GTC +#define MACH64_LT_ID PCI_MACH64_LT + + +/* Mach64 major ASIC revisions */ +#define MACH64_ASIC_NEC_VT_A3 0x08 +#define MACH64_ASIC_NEC_VT_A4 0x48 +#define MACH64_ASIC_SGS_VT_A4 0x40 +#define MACH64_ASIC_SGS_VT_B1S1 0x01 +#define MACH64_ASIC_SGS_GT_B1S1 0x01 +#define MACH64_ASIC_SGS_GT_B1S2 0x41 +#define MACH64_ASIC_UMC_GT_B2U1 0x1a +#define MACH64_ASIC_UMC_GT_B2U2 0x5a +#define MACH64_ASIC_UMC_VT_B2U3 0x9a +#define MACH64_ASIC_UMC_GT_B2U3 0x9a +#define MACH64_ASIC_UMC_R3B_D_P_A1 0x1b +#define MACH64_ASIC_UMC_R3B_D_P_A2 0x5b +#define MACH64_ASIC_UMC_R3B_D_P_A3 0x1c +#define MACH64_ASIC_UMC_R3B_D_P_A4 0x5c + +/* Mach64 foundries */ +#define MACH64_FND_SGS 0 +#define MACH64_FND_NEC 1 +#define MACH64_FND_UMC 3 /* Mach64 chip types */ #define MACH64_UNKNOWN 0 @@ -900,24 +963,4 @@ #define MACH64_NUM_CLOCKS 16 #define MACH64_NUM_FREQS 50 -/* Wait until "v" queue entries are free */ -#define aty_WaitQueue(v) { while ((aty_ld_le32(FIFO_STAT) & 0xffff) > \ - ((unsigned short)(0x8000 >> (v)))); } - -/* Wait until GP is idle and queue is empty */ -#define aty_WaitIdleEmpty() { aty_WaitQueue(16); \ - while ((aty_ld_le32(GUI_STAT) & 1) != 0); } - -#define SKIP_2(_v) ((((_v)<<1)&0xfff8)|((_v)&0x3)|(((_v)&0x80)>>5)) - -#define MACH64_BIT_BLT(_srcx, _srcy, _dstx, _dsty, _w, _h, _dir) \ -{ \ - aty_WaitQueue(5); \ - aty_st_le32(SRC_Y_X, (((_srcx) << 16) | ((_srcy) & 0x0000ffff))); \ - aty_st_le32(SRC_WIDTH1, (_w)); \ - aty_st_le32(DST_CNTL, (_dir)); \ - aty_st_le32(DST_Y_X, (((_dstx) << 16) | ((_dsty) & 0x0000ffff))); \ - aty_st_le32(DST_HEIGHT_WIDTH, (((_w) << 16) | ((_h) & 0x0000ffff))); \ -} #endif /* REGMACH64_H */ - diff --git a/drivers/video/atyfb.c b/drivers/video/atyfb.c index 94a77218b256..0fa5ae343339 100644 --- a/drivers/video/atyfb.c +++ b/drivers/video/atyfb.c @@ -1,7 +1,8 @@ /* - * linux/drivers/video/atyfb.c -- Frame buffer device for ATI/Open Firmware + * linux/drivers/video/atyfb.c -- Frame buffer device for ATI Mach64 * * Copyright (C) 1997 Geert Uytterhoeven + * Copyright (C) 1998 Bernd Harries * * This driver is partly based on the PowerMac console driver: * @@ -20,6 +21,14 @@ * more details. */ +/****************************************************************************** + + TODO: + + - support arbitrary video modes + +******************************************************************************/ + #include #include #include @@ -36,10 +45,14 @@ #include #include #include -#include +#ifdef CONFIG_FB_COMPAT_XPMAC +#include +#endif #include +#if defined(CONFIG_PMAC) || defined(CONFIG_CHRP) #include #include +#endif #include "aty.h" #include "fbcon.h" @@ -48,20 +61,28 @@ #include "fbcon-cfb32.h" +#ifndef __powerpc__ +#define eieio() /* Enforce In-order Execution of I/O */ +#endif + static int currcon = 0; static struct display fb_disp; -static struct fb_info fb_info; -static struct { u_char red, green, blue, pad; } palette[256]; static char atyfb_name[16] = "ATY Mach64"; struct atyfb_par { - int vmode; - int cmode; + union { + /* this should contain chipset specific mode information */ + struct { + int vmode; + int cmode; + } gx, gt, vt; + } hw; u_int vxres; /* virtual screen size */ u_int vyres; int xoffset; /* virtual screen position */ int yoffset; + int accel; }; @@ -103,34 +124,27 @@ struct atyfb_par { #define CMODE_32 2 /* 32 (actually 24) bits/pixel */ -static int default_video_mode = VMODE_NVRAM; -static int default_color_mode = CMODE_NVRAM; - -static struct atyfb_par default_par; -static struct atyfb_par current_par; - +static int default_vmode = VMODE_NVRAM; +static int default_cmode = CMODE_NVRAM; +#if defined(CONFIG_PMAC) || defined(CONFIG_CHRP) /* * Addresses in NVRAM where video mode and pixel size are stored. */ #define NV_VMODE 0x140f #define NV_CMODE 0x1410 +#endif /* CONFIG_PMAC || CONFIG_CHRP */ + /* - * Horizontal and vertical resolution information. + * Horizontal and vertical resolution for each mode. */ -extern struct vmode_attr { +static struct vmode_attr { int hres; int vres; int vfreq; int interlaced; -} vmode_attrs[VMODE_MAX]; - - -/* - * Horizontal and vertical resolution for each mode. - */ -static struct vmode_attr vmode_attrs[VMODE_MAX] = { +} vmode_attrs[VMODE_MAX] = { {512, 384, 60, 1}, {512, 384, 60}, {640, 480, 50, 1}, @@ -182,6 +196,7 @@ static struct mon_map { {0x72d, VMODE_832_624_75}, /* 16" RGB (Goldfish) */ {0x730, VMODE_768_576_50I}, /* PAL (Alternate) */ {0x73a, VMODE_1152_870_75}, /* 3rd party 19" */ + {0x73f, VMODE_640_480_67}, /* no sense lines connected at all */ {-1, VMODE_640_480_60}, /* catch-all, must be last */ }; @@ -196,44 +211,59 @@ static int map_monitor_sense(int sense) } struct aty_cmap_regs { - unsigned char windex; - unsigned char lut; - unsigned char mask; - unsigned char rindex; - unsigned char cntl; + u8 windex; + u8 lut; + u8 mask; + u8 rindex; + u8 cntl; }; typedef struct aty_regvals { - int offset[3]; /* first pixel address */ + u32 offset[3]; /* first pixel address */ - int crtc_h_sync_strt_wid[3]; /* depth dependent */ - int crtc_gen_cntl[3]; - int mem_cntl[3]; + u32 crtc_h_sync_strt_wid[3]; /* depth dependent */ + u32 crtc_gen_cntl[3]; + u32 mem_cntl[3]; - int crtc_h_tot_disp; /* mode dependent */ - int crtc_v_tot_disp; - int crtc_v_sync_strt_wid; - int crtc_off_pitch; + u32 crtc_h_tot_disp; /* mode dependent */ + u32 crtc_v_tot_disp; + u32 crtc_v_sync_strt_wid; + u32 crtc_off_pitch; - unsigned char clock_val[2]; /* vals for 20 and 21 */ + u8 clock_val[2]; /* vals for 20 and 21 */ } aty_regvals; struct rage_regvals { - int h_total, h_sync_start, h_sync_width; - int v_total, v_sync_start, v_sync_width; - int h_sync_neg, v_sync_neg; + u32 h_total, h_sync_start, h_sync_width; + u32 v_total, v_sync_start, v_sync_width; + u32 h_sync_neg, v_sync_neg; }; -static int aty_vram_reqd(const struct atyfb_par *par); -static struct aty_regvals *get_aty_struct(int vmode); - -static unsigned long frame_buffer; +struct fb_info_aty { + struct fb_info fb_info; + unsigned long ati_regbase_phys; + unsigned long ati_regbase; + unsigned long frame_buffer_phys; + unsigned long frame_buffer; + u8 chip_class; + u8 pixclock_lim_8; /* ps, <= 8 bpp */ + u8 pixclock_lim_hi; /* ps, > 8 bpp */ + u32 total_vram; + struct aty_cmap_regs *aty_cmap_regs; + struct { u8 red, green, blue, pad; } palette[256]; + struct atyfb_par default_par; + struct atyfb_par current_par; +}; -static int total_vram; /* total amount of video memory, bytes */ -static int chip_type; /* what chip type was detected */ +#ifdef CONFIG_ATARI +static unsigned int mach64_count __initdata = 0; +static unsigned long phys_vmembase[FB_MAX] __initdata = { 0, }; +static unsigned long phys_size[FB_MAX] __initdata = { 0, }; +static unsigned long phys_guiregbase[FB_MAX] __initdata = { 0, }; +#endif -static unsigned long ati_regbase; -static struct aty_cmap_regs *aty_cmap_regs; +static int aty_vram_reqd(const struct atyfb_par *par); +static struct aty_regvals *get_aty_struct(int vmode, struct fb_info_aty *info); #include "ati-gx.h" #include "ati-gt.h" @@ -291,11 +321,54 @@ static struct aty_regvals *aty_vt_reg_init[21] = { &aty_vt_reg_init_20 }; + +#define CLASS_GX 1 +#define CLASS_CT 2 +#define CLASS_VT 3 +#define CLASS_GT 4 + +struct aty_features { + u16 pci_id; + u16 chip_type; + const char *name; + u8 chip_class; + u8 pixclock_lim_8; /* MHz, <= 8 bpp (not sure about these limits!) */ + u8 pixclock_lim_hi; /* MHz, > 8 bpp (not sure about these limits!) */ +} aty_features[] __initdata = { + /* mach64GX family */ + { 0x4758, 0x00d7, "mach64GX (ATI888GX00)", CLASS_GX, 135, 80 }, + { 0x4358, 0x0057, "mach64CX (ATI888CX00)", CLASS_GX, 135, 80 }, + + /* mach64CT family */ + { 0x4354, 0x4354, "mach64CT (ATI264CT)", CLASS_CT, 135, 80 }, + { 0x4554, 0x4554, "mach64ET (ATI264ET)", CLASS_CT, 135, 80 }, + + /* mach64CT family / mach64VT class */ + { 0x5654, 0x5654, "mach64VT (ATI264VT)", CLASS_VT, 160, 135 }, + { 0x5655, 0x5655, "mach64VTB (ATI264VTB)", CLASS_VT, 160, 135 }, + { 0x5656, 0x5656, "mach64VT4 (ATI264VT4)", CLASS_VT, 160, 135 }, + + /* mach64CT family / mach64GT (3D RAGE) class */ + { 0x4742, 0x4742, "3D RAGE PRO (BGA, AGP)", CLASS_GT, 240, 240 }, + { 0x4744, 0x4744, "3D RAGE PRO (BGA, AGP, 1x only)", CLASS_GT, 240, 240 }, + { 0x4749, 0x4749, "3D RAGE PRO (BGA, PCI)", CLASS_GT, 240, 240 }, + { 0x4750, 0x4750, "3D RAGE PRO (PQFP, PCI)", CLASS_GT, 240, 240 }, + { 0x4751, 0x4751, "3D RAGE PRO (PQFP, PCI, limited 3D)", CLASS_GT, 240, 240 }, + { 0x4754, 0x4754, "3D RAGE (GT)", CLASS_GT, 200, 200 }, + { 0x4755, 0x4755, "3D RAGE II+ (GTB)", CLASS_GT, 200, 200 }, + { 0x4756, 0x4756, "3D RAGE IIC", CLASS_GT, 200, 200 }, + { 0x4c47, 0x4c47, "3D RAGE LT", CLASS_GT, 200, 200 }, +}; + + /* * Interface used by the world */ unsigned long atyfb_init(unsigned long mem_start); +#ifdef CONFIG_FB_OF +void atyfb_of_init(struct device_node *dp); +#endif void atyfb_setup(char *options, int *ints); static int atyfb_open(struct fb_info *info); @@ -332,6 +405,12 @@ static void atyfbcon_blank(int blank, struct fb_info *info); #ifdef CONFIG_FBCON_CFB8 static struct display_switch fbcon_aty8; #endif +#ifdef CONFIG_FBCON_CFB16 +static struct display_switch fbcon_aty16; +#endif +#ifdef CONFIG_FBCON_CFB32 +static struct display_switch fbcon_aty32; +#endif #ifdef CONFIG_FB_COMPAT_XPMAC @@ -341,13 +420,19 @@ extern int (*console_setmode_ptr)(struct vc_mode *, int); extern int (*console_set_cmap_ptr)(struct fb_cmap *, int, int, struct fb_info *); static int atyfb_console_setmode(struct vc_mode *, int); -#endif +#endif /* CONFIG_FB_COMPAT_XPMAC */ /* * Internal routines */ +static int aty_init(struct fb_info_aty *info, const char *name); +#ifndef CONFIG_FB_OF +static int store_video_par(char *videopar, unsigned char m64_num); +static char *strtoke(char *s, const char *ct); +#endif + static int atyfb_getcolreg(u_int regno, u_int *red, u_int *green, u_int *blue, u_int *transp, struct fb_info *info); static int atyfb_setcolreg(u_int regno, u_int red, u_int green, u_int blue, @@ -357,352 +442,542 @@ static void do_install_cmap(int con, struct fb_info *info); static struct fb_ops atyfb_ops = { atyfb_open, atyfb_release, atyfb_get_fix, atyfb_get_var, atyfb_set_var, - atyfb_get_cmap, atyfb_set_cmap, atyfb_pan_display, NULL, atyfb_ioctl + atyfb_get_cmap, atyfb_set_cmap, atyfb_pan_display, atyfb_ioctl }; static inline int aty_vram_reqd(const struct atyfb_par *par) { - return (par->vxres*par->vyres) << par->cmode; + return (par->vxres*par->vyres) << par->hw.gx.cmode; } -extern inline unsigned aty_ld_le32(volatile unsigned long addr) +static inline u32 aty_ld_le32(volatile unsigned int regindex, + struct fb_info_aty *info) { - register unsigned long temp = ati_regbase,val; + unsigned long temp; + u32 val; - asm("lwbrx %0,%1,%2": "=r"(val):"r"(addr), "r"(temp)); +#ifdef __powerpc__ + temp = info->ati_regbase; + asm("lwbrx %0,%1,%2": "=r"(val):"r"(regindex), "r"(temp)); +#else + temp = info->ati_regbase+regindex; + val = le32_to_cpu(*((volatile u32 *)(temp))); +#endif return val; } -extern inline void aty_st_le32(volatile unsigned long addr, unsigned val) +static inline void aty_st_le32(volatile unsigned int regindex, u32 val, + struct fb_info_aty *info) { - register unsigned long temp = ati_regbase; + unsigned long temp; - asm("stwbrx %0,%1,%2": : "r"(val), "r"(addr), "r"(temp):"memory"); +#ifdef __powerpc__ + temp = info->ati_regbase; + asm("stwbrx %0,%1,%2": : "r"(val), "r"(regindex), "r"(temp):"memory"); +#else + temp = info->ati_regbase+regindex; + *((volatile u32 *)(temp)) = cpu_to_le32(val); +#endif } -extern inline unsigned char aty_ld_8(volatile unsigned long addr) +static inline u8 aty_ld_8(volatile unsigned int regindex, + struct fb_info_aty *info) { - return *(char *) ((long) addr + (long) ati_regbase); + return *(volatile u8 *)(info->ati_regbase+regindex); } -extern inline void aty_st_8(volatile unsigned long addr, unsigned char val) +static inline void aty_st_8(volatile unsigned int regindex, u8 val, + struct fb_info_aty *info) { - *(unsigned char *) (addr + (unsigned long) ati_regbase) = val; + *(volatile u8 *)(info->ati_regbase+regindex) = val; +} + + /* + * All writes to draw engine registers are automatically routed through a + * 32-bit-wide, 16-entry-deep command FIFO ... + * Register writes to registers with DWORD offsets less than 40h are not + * FIFOed. + * (from Chapter 5 of the Mach64 Programmer's Guide) + */ + +static inline void wait_for_fifo(u16 entries, struct fb_info_aty *info) +{ + while ((aty_ld_le32(FIFO_STAT, info) & 0xffff) > + ((u32)(0x8000 >> entries))); +} + +static inline void wait_for_idle(struct fb_info_aty *info) +{ + wait_for_fifo(16, info); + while ((aty_ld_le32(GUI_STAT, info) & 1)!= 0); +} + +static void reset_engine(struct fb_info_aty *info) +{ + /* reset engine */ + aty_st_le32(GEN_TEST_CNTL, + aty_ld_le32(GEN_TEST_CNTL, info) & ~GUI_ENGINE_ENABLE, info); + /* enable engine */ + aty_st_le32(GEN_TEST_CNTL, + aty_ld_le32(GEN_TEST_CNTL, info) | GUI_ENGINE_ENABLE, info); + /* ensure engine is not locked up by clearing any FIFO or */ + /* HOST errors */ + aty_st_le32(BUS_CNTL, aty_ld_le32(BUS_CNTL, info) | BUS_HOST_ERR_ACK | + BUS_FIFO_ERR_ACK, info); +} + +static void init_engine(const struct atyfb_par *par, struct fb_info_aty *info) +{ + u32 pitch_value; + + /* determine modal information from global mode structure */ + pitch_value = par->vxres; + +#if 0 + if (par->hw.gx.cmode == CMODE_24) { + /* In 24 bpp, the engine is in 8 bpp - this requires that all */ + /* horizontal coordinates and widths must be adjusted */ + pitch_value = pitch_value * 3; + } +#endif + + /* Reset engine, enable, and clear any engine errors */ + reset_engine(info); + /* Ensure that vga page pointers are set to zero - the upper */ + /* page pointers are set to 1 to handle overflows in the */ + /* lower page */ + aty_st_le32(MEM_VGA_WP_SEL, 0x00010000, info); + aty_st_le32(MEM_VGA_RP_SEL, 0x00010000, info); + + /* ---- Setup standard engine context ---- */ + + /* All GUI registers here are FIFOed - therefore, wait for */ + /* the appropriate number of empty FIFO entries */ + wait_for_fifo(14, info); + + /* enable all registers to be loaded for context loads */ + aty_st_le32(CONTEXT_MASK, 0xFFFFFFFF, info); + + /* set destination pitch to modal pitch, set offset to zero */ + aty_st_le32(DST_OFF_PITCH, (pitch_value / 8) << 22, info); + + /* zero these registers (set them to a known state) */ + aty_st_le32(DST_Y_X, 0, info); + aty_st_le32(DST_HEIGHT, 0, info); + aty_st_le32(DST_BRES_ERR, 0, info); + aty_st_le32(DST_BRES_INC, 0, info); + aty_st_le32(DST_BRES_DEC, 0, info); + + /* set destination drawing attributes */ + aty_st_le32(DST_CNTL, DST_LAST_PEL | DST_Y_TOP_TO_BOTTOM | + DST_X_LEFT_TO_RIGHT, info); + + /* set source pitch to modal pitch, set offset to zero */ + aty_st_le32(SRC_OFF_PITCH, (pitch_value / 8) << 22, info); + + /* set these registers to a known state */ + aty_st_le32(SRC_Y_X, 0, info); + aty_st_le32(SRC_HEIGHT1_WIDTH1, 1, info); + aty_st_le32(SRC_Y_X_START, 0, info); + aty_st_le32(SRC_HEIGHT2_WIDTH2, 1, info); + + /* set source pixel retrieving attributes */ + aty_st_le32(SRC_CNTL, SRC_LINE_X_LEFT_TO_RIGHT, info); + + /* set host attributes */ + wait_for_fifo(13, info); + aty_st_le32(HOST_CNTL, 0, info); + + /* set pattern attributes */ + aty_st_le32(PAT_REG0, 0, info); + aty_st_le32(PAT_REG1, 0, info); + aty_st_le32(PAT_CNTL, 0, info); + + /* set scissors to modal size */ + aty_st_le32(SC_LEFT, 0, info); + aty_st_le32(SC_TOP, 0, info); + aty_st_le32(SC_BOTTOM, par->vyres-1, info); + aty_st_le32(SC_RIGHT, pitch_value-1, info); + + /* set background color to minimum value (usually BLACK) */ + aty_st_le32(DP_BKGD_CLR, 0, info); + + /* set foreground color to maximum value (usually WHITE) */ + aty_st_le32(DP_FRGD_CLR, 0xFFFFFFFF, info); + + /* set write mask to effect all pixel bits */ + aty_st_le32(DP_WRITE_MASK, 0xFFFFFFFF, info); + + /* set foreground mix to overpaint and background mix to */ + /* no-effect */ + aty_st_le32(DP_MIX, FRGD_MIX_S | BKGD_MIX_D, info); + + /* set primary source pixel channel to foreground color */ + /* register */ + aty_st_le32(DP_SRC, FRGD_SRC_FRGD_CLR, info); + + /* set compare functionality to false (no-effect on */ + /* destination) */ + wait_for_fifo(3, info); + aty_st_le32(CLR_CMP_CLR, 0, info); + aty_st_le32(CLR_CMP_MASK, 0xFFFFFFFF, info); + aty_st_le32(CLR_CMP_CNTL, 0, info); + + /* set pixel depth */ + wait_for_fifo(2, info); + switch(par->hw.gx.cmode) { +#ifdef CONFIG_FBCON_CFB8 + case CMODE_8: + aty_st_le32(DP_PIX_WIDTH, HOST_8BPP | SRC_8BPP | DST_8BPP | + BYTE_ORDER_LSB_TO_MSB, + info); + aty_st_le32(DP_CHAIN_MASK, 0x8080, info); + break; +#endif +#ifdef CONFIG_FBCON_CFB16 + case CMODE_16: + aty_st_le32(DP_PIX_WIDTH, HOST_15BPP | SRC_15BPP | DST_15BPP | + BYTE_ORDER_LSB_TO_MSB, + info); + aty_st_le32(DP_CHAIN_MASK, 0x4210, info); + break; +#endif +#if 0 + case CMODE_24: + aty_st_le32(DP_PIX_WIDTH, HOST_8BPP | SRC_8BPP | DST_8BPP | + BYTE_ORDER_LSB_TO_MSB, + info); + aty_st_le32(DP_CHAIN_MASK, 0x8080, info); + break; +#endif +#ifdef CONFIG_FBCON_CFB32 + case CMODE_32: + aty_st_le32(DP_PIX_WIDTH, HOST_32BPP | SRC_32BPP | DST_32BPP | + BYTE_ORDER_LSB_TO_MSB, info); + aty_st_le32(DP_CHAIN_MASK, 0x8080, info); + break; +#endif + } + /* insure engine is idle before leaving */ + wait_for_idle(info); } -static void aty_st_514(int offset, char val) +static void aty_st_514(int offset, u8 val, struct fb_info_aty *info) { - aty_WaitQueue(5); - aty_st_8(DAC_CNTL, 1); - aty_st_8(DAC_W_INDEX, offset & 0xff); /* right addr byte */ - aty_st_8(DAC_DATA, (offset >> 8) & 0xff); /* left addr byte */ + aty_st_8(DAC_CNTL, 1, info); + /* right addr byte */ + aty_st_8(DAC_W_INDEX, offset & 0xff, info); + /* left addr byte */ + aty_st_8(DAC_DATA, (offset >> 8) & 0xff, info); eieio(); - aty_st_8(DAC_MASK, val); + aty_st_8(DAC_MASK, val, info); eieio(); - aty_st_8(DAC_CNTL, 0); + aty_st_8(DAC_CNTL, 0, info); } -static void aty_st_pll(int offset, char val) +static void aty_st_pll(int offset, u8 val, struct fb_info_aty *info) { - aty_WaitQueue(3); - aty_st_8(CLOCK_CNTL + 1, (offset << 2) | PLL_WR_EN); /* write addr byte */ + /* write addr byte */ + aty_st_8(CLOCK_CNTL + 1, (offset << 2) | PLL_WR_EN, info); eieio(); - aty_st_8(CLOCK_CNTL + 2, val); /* write the register value */ + /* write the register value */ + aty_st_8(CLOCK_CNTL + 2, val, info); eieio(); - aty_st_8(CLOCK_CNTL + 1, (offset << 2) & ~PLL_WR_EN); + aty_st_8(CLOCK_CNTL + 1, (offset << 2) & ~PLL_WR_EN, info); } -static struct aty_regvals *get_aty_struct(int vmode) +static struct aty_regvals *get_aty_struct(int vmode, struct fb_info_aty *info) { int v = vmode - 1; - switch (chip_type) { - case MACH64_GT_ID: - return aty_gt_reg_init[v]; + switch (info->chip_class) { + case CLASS_GX: + return aty_gx_reg_init[v]; break; - case MACH64_VT_ID: + case CLASS_CT: + case CLASS_VT: return aty_vt_reg_init[v]; break; - default: /* default to MACH64_GX_ID */ - return aty_gx_reg_init[v]; + case CLASS_GT: + return aty_gt_reg_init[v]; break; + default: + /* should NOT happen */ + return NULL; } } -static int read_aty_sense(void) +static int read_aty_sense(struct fb_info_aty *info) { int sense, i; - aty_st_le32(GP_IO, 0x31003100); /* drive outputs high */ + aty_st_le32(GP_IO, 0x31003100, info); /* drive outputs high */ __delay(200); - aty_st_le32(GP_IO, 0); /* turn off outputs */ + aty_st_le32(GP_IO, 0, info); /* turn off outputs */ __delay(2000); - i = aty_ld_le32(GP_IO); /* get primary sense value */ + i = aty_ld_le32(GP_IO, info); /* get primary sense value */ sense = ((i & 0x3000) >> 3) | (i & 0x100); /* drive each sense line low in turn and collect the other 2 */ - aty_st_le32(GP_IO, 0x20000000); /* drive A low */ + aty_st_le32(GP_IO, 0x20000000, info); /* drive A low */ __delay(2000); - i = aty_ld_le32(GP_IO); + i = aty_ld_le32(GP_IO, info); sense |= ((i & 0x1000) >> 7) | ((i & 0x100) >> 4); - aty_st_le32(GP_IO, 0x20002000); /* drive A high again */ + aty_st_le32(GP_IO, 0x20002000, info); /* drive A high again */ __delay(200); - aty_st_le32(GP_IO, 0x10000000); /* drive B low */ + aty_st_le32(GP_IO, 0x10000000, info); /* drive B low */ __delay(2000); - i = aty_ld_le32(GP_IO); + i = aty_ld_le32(GP_IO, info); sense |= ((i & 0x2000) >> 10) | ((i & 0x100) >> 6); - aty_st_le32(GP_IO, 0x10001000); /* drive B high again */ + aty_st_le32(GP_IO, 0x10001000, info); /* drive B high again */ __delay(200); - aty_st_le32(GP_IO, 0x01000000); /* drive C low */ + aty_st_le32(GP_IO, 0x01000000, info); /* drive C low */ __delay(2000); - sense |= (aty_ld_le32(GP_IO) & 0x3000) >> 12; - aty_st_le32(GP_IO, 0); /* turn off outputs */ + sense |= (aty_ld_le32(GP_IO, info) & 0x3000) >> 12; + aty_st_le32(GP_IO, 0, info); /* turn off outputs */ return sense; } -static void RGB514_Program(int cmode) +static void RGB514_Program(int cmode, struct fb_info_aty *info) { typedef struct { - char pixel_dly; - char misc2_cntl; - char pixel_rep; - char pixel_cntl_index; - char pixel_cntl_v1; + u8 pixel_dly; + u8 misc2_cntl; + u8 pixel_rep; + u8 pixel_cntl_index; + u8 pixel_cntl_v1; } RGB514_DAC_Table; static RGB514_DAC_Table RGB514DAC_Tab[8] = { - {0, 0x41, 0x03, 0x71, 0x45}, // 8bpp - {0, 0x45, 0x04, 0x0c, 0x01}, // 555 - {0, 0x45, 0x06, 0x0e, 0x00}, // XRGB + {0, 0x41, 0x03, 0x71, 0x45}, /* 8bpp */ + {0, 0x45, 0x04, 0x0c, 0x01}, /* 555 */ + {0, 0x45, 0x06, 0x0e, 0x00}, /* XRGB */ }; RGB514_DAC_Table *pDacProgTab; pDacProgTab = &RGB514DAC_Tab[cmode]; - aty_st_514(0x90, 0x00); - aty_st_514(0x04, pDacProgTab->pixel_dly); - aty_st_514(0x05, 0x00); + aty_st_514(0x90, 0x00, info); + aty_st_514(0x04, pDacProgTab->pixel_dly, info); + aty_st_514(0x05, 0x00, info); - aty_st_514(0x2, 0x1); - aty_st_514(0x71, pDacProgTab->misc2_cntl); - aty_st_514(0x0a, pDacProgTab->pixel_rep); + aty_st_514(0x2, 0x1, info); + aty_st_514(0x71, pDacProgTab->misc2_cntl, info); + aty_st_514(0x0a, pDacProgTab->pixel_rep, info); - aty_st_514(pDacProgTab->pixel_cntl_index, pDacProgTab->pixel_cntl_v1); + aty_st_514(pDacProgTab->pixel_cntl_index, pDacProgTab->pixel_cntl_v1, + info); } -static void set_off_pitch(const struct atyfb_par *par) +static void set_off_pitch(const struct atyfb_par *par, + struct fb_info_aty *info) { u32 pitch, offset; pitch = par->vxres>>3; - offset = ((par->yoffset*par->vxres+par->xoffset)>>3)<cmode; - aty_st_le32(CRTC_OFF_PITCH, pitch<<22 | offset); - if (chip_type == MACH64_GT_ID) { - /* Is this OK for other chips? */ - aty_st_le32(DST_OFF_PITCH, pitch<<22 | offset); - aty_st_le32(SRC_OFF_PITCH, pitch<<22 | offset); - } + offset = ((par->yoffset*par->vxres+par->xoffset)>>3)<hw.gx.cmode; + aty_st_le32(CRTC_OFF_PITCH, pitch<<22 | offset, info); } -static void atyfb_set_par(struct atyfb_par *par) +static void atyfb_set_par(struct atyfb_par *par, struct fb_info_aty *info) { - int i, hres; - struct aty_regvals *init = get_aty_struct(par->vmode); - int vram_type = aty_ld_le32(CONFIG_STAT0) & 7; + int i, j, hres; + struct aty_regvals *init = get_aty_struct(par->hw.gx.vmode, info); + int vram_type = aty_ld_le32(CONFIG_STAT0, info) & 7; if (init == 0) /* paranoia, shouldn't get here */ - panic("aty: display mode %d not supported", par->vmode); - - current_par = *par; - hres = vmode_attrs[par->vmode-1].hres; + panic("aty: display mode %d not supported", par->hw.gx.vmode); - /* clear FIFO errors */ - aty_st_le32(BUS_CNTL, aty_ld_le32(BUS_CNTL) | BUS_HOST_ERR_ACK - | BUS_FIFO_ERR_ACK); - - /* Reset engine */ - i = aty_ld_le32(GEN_TEST_CNTL); - aty_st_le32(GEN_TEST_CNTL, i & ~GUI_ENGINE_ENABLE); - eieio(); - aty_WaitIdleEmpty(); - aty_st_le32(GEN_TEST_CNTL, i | GUI_ENGINE_ENABLE); - aty_WaitIdleEmpty(); + info->current_par = *par; + hres = vmode_attrs[par->hw.gx.vmode-1].hres; - if ( chip_type != MACH64_GT_ID ) { - i = aty_ld_le32(CRTC_GEN_CNTL); - aty_st_le32(CRTC_GEN_CNTL, i | CRTC_EXT_DISP_EN); + if (info->chip_class != CLASS_GT) { + i = aty_ld_le32(CRTC_GEN_CNTL, info); + aty_st_le32(CRTC_GEN_CNTL, i | CRTC_EXT_DISP_EN, info); } - if ( chip_type == MACH64_GX_ID ) { - i = aty_ld_le32(GEN_TEST_CNTL); - aty_st_le32(GEN_TEST_CNTL, i | GEN_OVR_OUTPUT_EN ); + if (info->chip_class == CLASS_GX) { + i = aty_ld_le32(GEN_TEST_CNTL, info); + aty_st_le32(GEN_TEST_CNTL, i | GEN_OVR_OUTPUT_EN, info); } - switch (chip_type) { - case MACH64_VT_ID: - aty_st_pll(PLL_MACRO_CNTL, 0xb5); - aty_st_pll(PLL_REF_DIV, 0x2d); - aty_st_pll(PLL_GEN_CNTL, 0x14); - aty_st_pll(MCLK_FB_DIV, 0xbd); - aty_st_pll(PLL_VCLK_CNTL, 0x0b); - aty_st_pll(VCLK_POST_DIV, init->clock_val[0]); - aty_st_pll(VCLK0_FB_DIV, init->clock_val[1]); - aty_st_pll(VCLK1_FB_DIV, 0xd6); - aty_st_pll(VCLK2_FB_DIV, 0xee); - aty_st_pll(VCLK3_FB_DIV, 0xf8); - aty_st_pll(PLL_XCLK_CNTL, 0x0); - aty_st_pll(PLL_TEST_CTRL, 0x0); - aty_st_pll(PLL_TEST_COUNT, 0x0); + switch (info->chip_class) { + case CLASS_GX: + RGB514_Program(par->hw.gx.cmode, info); + wait_for_idle(info); + aty_st_514(0x06, 0x02, info); + aty_st_514(0x10, 0x01, info); + aty_st_514(0x70, 0x01, info); + aty_st_514(0x8f, 0x1f, info); + aty_st_514(0x03, 0x00, info); + aty_st_514(0x05, 0x00, info); + aty_st_514(0x20, init->clock_val[0], info); + aty_st_514(0x21, init->clock_val[1], info); break; - case MACH64_GT_ID: + case CLASS_CT: + case CLASS_VT: + aty_st_pll(VPLL_CNTL, 0xb5, info); + aty_st_pll(PLL_REF_DIV, 0x2d, info); + aty_st_pll(PLL_GEN_CNTL, 0x14, info); + aty_st_pll(MCLK_FB_DIV, 0xbd, info); + aty_st_pll(PLL_VCLK_CNTL, 0x0b, info); + aty_st_pll(VCLK_POST_DIV, init->clock_val[0], info); + aty_st_pll(VCLK0_FB_DIV, init->clock_val[1], info); + aty_st_pll(VCLK1_FB_DIV, 0xd6, info); + aty_st_pll(VCLK2_FB_DIV, 0xee, info); + aty_st_pll(VCLK3_FB_DIV, 0xf8, info); + aty_st_pll(PLL_EXT_CNTL, 0x0, info); + aty_st_pll(PLL_TEST_CTRL, 0x0, info); + aty_st_pll(PLL_TEST_COUNT, 0x0, info); + break; + case CLASS_GT: if (vram_type == 5) { - aty_st_pll(0, 0xcd); - aty_st_pll(PLL_MACRO_CNTL, - par->vmode >= VMODE_1024_768_60 ? 0xd3: 0xd5); - aty_st_pll(PLL_REF_DIV, 0x21); - aty_st_pll(PLL_GEN_CNTL, 0x44); - aty_st_pll(MCLK_FB_DIV, 0xe8); - aty_st_pll(PLL_VCLK_CNTL, 0x03); - aty_st_pll(VCLK_POST_DIV, init->offset[0]); - aty_st_pll(VCLK0_FB_DIV, init->offset[1]); - aty_st_pll(VCLK1_FB_DIV, 0x8e); - aty_st_pll(VCLK2_FB_DIV, 0x9e); - aty_st_pll(VCLK3_FB_DIV, 0xc6); - aty_st_pll(PLL_XCLK_CNTL, init->offset[2]); - aty_st_pll(12, 0xa6); - aty_st_pll(13, 0x1b); + aty_st_pll(MPLL_CNTL, 0xcd, info); + aty_st_pll(VPLL_CNTL, + par->hw.gx.vmode >= VMODE_1024_768_60 ? 0xd3 + : 0xd5, + info); + aty_st_pll(PLL_REF_DIV, 0x21, info); + aty_st_pll(PLL_GEN_CNTL, 0x44, info); + aty_st_pll(MCLK_FB_DIV, 0xe8, info); + aty_st_pll(PLL_VCLK_CNTL, 0x03, info); + aty_st_pll(VCLK_POST_DIV, init->offset[0], info); + aty_st_pll(VCLK0_FB_DIV, init->offset[1], info); + aty_st_pll(VCLK1_FB_DIV, 0x8e, info); + aty_st_pll(VCLK2_FB_DIV, 0x9e, info); + aty_st_pll(VCLK3_FB_DIV, 0xc6, info); + aty_st_pll(PLL_EXT_CNTL, init->offset[2], info); + aty_st_pll(DLL_CNTL, 0xa6, info); + aty_st_pll(VFC_CNTL, 0x1b, info); } else { - aty_st_pll(PLL_MACRO_CNTL, 0xd5); - aty_st_pll(PLL_REF_DIV, 0x21); - aty_st_pll(PLL_GEN_CNTL, 0xc4); - aty_st_pll(MCLK_FB_DIV, 0xda); - aty_st_pll(PLL_VCLK_CNTL, 0x03); + aty_st_pll(VPLL_CNTL, 0xd5, info); + aty_st_pll(PLL_REF_DIV, 0x21, info); + aty_st_pll(PLL_GEN_CNTL, 0xc4, info); + aty_st_pll(MCLK_FB_DIV, 0xda, info); + aty_st_pll(PLL_VCLK_CNTL, 0x03, info); /* offset actually holds clock values */ - aty_st_pll(VCLK_POST_DIV, init->offset[0]); - aty_st_pll(VCLK0_FB_DIV, init->offset[1]); - aty_st_pll(VCLK1_FB_DIV, 0x8e); - aty_st_pll(VCLK2_FB_DIV, 0x9e); - aty_st_pll(VCLK3_FB_DIV, 0xc6); - aty_st_pll(PLL_TEST_CTRL, 0x0); - aty_st_pll(PLL_XCLK_CNTL, init->offset[2]); - aty_st_pll(12, 0xa0); - aty_st_pll(13, 0x1b); + aty_st_pll(VCLK_POST_DIV, init->offset[0], info); + aty_st_pll(VCLK0_FB_DIV, init->offset[1], info); + aty_st_pll(VCLK1_FB_DIV, 0x8e, info); + aty_st_pll(VCLK2_FB_DIV, 0x9e, info); + aty_st_pll(VCLK3_FB_DIV, 0xc6, info); + aty_st_pll(PLL_TEST_CTRL, 0x0, info); + aty_st_pll(PLL_EXT_CNTL, init->offset[2], info); + aty_st_pll(DLL_CNTL, 0xa0, info); + aty_st_pll(VFC_CNTL, 0x1b, info); } break; - default: - RGB514_Program(par->cmode); - aty_WaitIdleEmpty(); - aty_st_514(0x06, 0x02); - aty_st_514(0x10, 0x01); - aty_st_514(0x70, 0x01); - aty_st_514(0x8f, 0x1f); - aty_st_514(0x03, 0x00); - aty_st_514(0x05, 0x00); - aty_st_514(0x20, init->clock_val[0]); - aty_st_514(0x21, init->clock_val[1]); - break; } - aty_ld_8(DAC_REGS); /* clear counter */ - aty_WaitIdleEmpty(); - - aty_st_le32(CRTC_H_TOTAL_DISP, init->crtc_h_tot_disp); - aty_st_le32(CRTC_H_SYNC_STRT_WID, init->crtc_h_sync_strt_wid[par->cmode]); - aty_st_le32(CRTC_V_TOTAL_DISP, init->crtc_v_tot_disp); - aty_st_le32(CRTC_V_SYNC_STRT_WID, init->crtc_v_sync_strt_wid); - - aty_st_8(CLOCK_CNTL, 0); - aty_st_8(CLOCK_CNTL, CLOCK_STROBE); + aty_ld_8(DAC_REGS, info); /* clear counter */ + wait_for_idle(info); + + aty_st_le32(CRTC_H_TOTAL_DISP, init->crtc_h_tot_disp, info); + aty_st_le32(CRTC_H_SYNC_STRT_WID, + init->crtc_h_sync_strt_wid[par->hw.gx.cmode], info); + aty_st_le32(CRTC_V_TOTAL_DISP, init->crtc_v_tot_disp, info); + aty_st_le32(CRTC_V_SYNC_STRT_WID, init->crtc_v_sync_strt_wid, info); + + aty_st_8(CLOCK_CNTL, 0, info); + aty_st_8(CLOCK_CNTL, CLOCK_STROBE, info); + + aty_st_le32(CRTC_VLINE_CRNT_VLINE, 0, info); + + set_off_pitch(par, info); + + switch (info->chip_class) { + case CLASS_GX: + /* The magic constant below translates into: + * 5 = No RDY delay, 1 wait st for mem write, increment during + * burst transfer + * 9 = DAC access delayed, 1 wait state for DAC + * 0 = Disables interupts for FIFO errors + * e = Allows FIFO to generate 14 wait states before generating + * error + * 1 = DAC snooping disabled, ROM disabled + * 0 = ROM page at 0 (disabled so doesn't matter) + * f = 15 ROM wait states (disabled so doesn't matter) + * f = 15 BUS wait states (I'm not sure this applies to PCI bus + * types) + * at some point it would be good to experiment with bench marks to + * if we can gain some speed by fooling with the wait states etc. + */ + aty_st_le32(BUS_CNTL, 0x890e20f1 /* 0x590e10ff */, info); + j = 0x47012100; + j = 0x47052100; + break; - aty_st_le32(CRTC_VLINE_CRNT_VLINE, 0); + case CLASS_CT: + case CLASS_VT: + aty_st_le32(BUS_CNTL, 0x680000f9, info); + switch (info->total_vram) { + case 0x00100000: + aty_st_le32(MEM_CNTL, vt_mem_cntl[0][par->hw.gx.cmode], + info); + break; + case 0x00200000: + aty_st_le32(MEM_CNTL, vt_mem_cntl[1][par->hw.gx.cmode], + info); + break; + case 0x00400000: + aty_st_le32(MEM_CNTL, vt_mem_cntl[2][par->hw.gx.cmode], + info); + break; + default: + i = aty_ld_le32(MEM_CNTL, info) & 0x000F; + aty_st_le32(MEM_CNTL, + (init->mem_cntl[par->hw.gx.cmode] & + 0xFFFFFFF0) | i, + info); + } + j = 0x87010184; + break; - set_off_pitch(par); + case CLASS_GT: + aty_st_le32(BUS_CNTL, 0x7b23a040, info); - if (chip_type == MACH64_GT_ID) { - aty_st_le32(BUS_CNTL, 0x7b23a040); + /* need to set DSP values !! assume sdram */ + i = init->crtc_gen_cntl[0] - (0x100000 * par->hw.gx.cmode); + if ( vram_type == 5 ) + i = init->crtc_gen_cntl[1] - (0x100000 * par->hw.gx.cmode); + aty_st_le32(DSP_CONFIG, i, info); - /* need to set DSP values !! assume sdram */ - i = init->crtc_gen_cntl[0] - (0x100000 * par->cmode); - if ( vram_type == 5 ) - i = init->crtc_gen_cntl[1] - (0x100000 * par->cmode); - aty_st_le32(DSP_CONFIG, i); + i = aty_ld_le32(MEM_CNTL, info) & MEM_SIZE_ALIAS; + if ( vram_type == 5 ) { + i |= ((1 * par->hw.gx.cmode) << 26) | 0x4215b0; + aty_st_le32(DSP_ON_OFF, + sgram_dsp[par->hw.gx.vmode-1][par->hw.gx.cmode], + info); - i = aty_ld_le32(MEM_CNTL) & MEM_SIZE_ALIAS; - if ( vram_type == 5 ) { - i |= ((1 * par->cmode) << 26) | 0x4215b0; - aty_st_le32(DSP_ON_OFF,sgram_dsp[par->vmode-1][par->cmode]); + /* aty_st_le32(CLOCK_CNTL, 8192, info); */ + } else { + i |= ((1 * par->hw.gx.cmode) << 26) | 0x300090; + aty_st_le32(DSP_ON_OFF, init->mem_cntl[par->hw.gx.cmode], + info); + } + aty_st_le32(MEM_CNTL, i, info); + aty_st_le32(EXT_MEM_CNTL, 0x5000001, info); - //aty_st_le32(CLOCK_CNTL,8192); - } else { - i |= ((1 * par->cmode) << 26) | 0x300090; - aty_st_le32(DSP_ON_OFF, init->mem_cntl[par->cmode]); - } + /* if (info->total_vram > 0x400000) + i |= 0x538; this not been verified on > 4Megs!! */ - aty_st_le32(MEM_CNTL, i); - aty_st_le32(EXT_MEM_CNTL, 0x5000001); - - /* if (total_vram > 0x400000) - i |= 0x538; this not been verified on > 4Megs!! */ - } else { - -/* The magic constant below translates into: -* 5 = No RDY delay, 1 wait st for mem write, increment during burst transfer -* 9 = DAC access delayed, 1 wait state for DAC -* 0 = Disables interupts for FIFO errors -* e = Allows FIFO to generate 14 wait states before generating error -* 1 = DAC snooping disabled, ROM disabled -* 0 = ROM page at 0 (disabled so doesn't matter) -* f = 15 ROM wait states (disabled so doesn't matter) -* f = 15 BUS wait states (I'm not sure this applies to PCI bus types) -* at some point it would be good to experiment with bench marks to see if -* we can gain some speed by fooling with the wait states etc. -*/ - if (chip_type == MACH64_VT_ID) - aty_st_le32(BUS_CNTL, 0x680000f9); - else - aty_st_le32(BUS_CNTL, 0x590e10ff); - - switch (total_vram) { - case 0x00100000: - aty_st_le32(MEM_CNTL, vt_mem_cntl[0][par->cmode]); - break; - case 0x00200000: - aty_st_le32(MEM_CNTL, vt_mem_cntl[1][par->cmode]); - break; - case 0x00400000: - aty_st_le32(MEM_CNTL, vt_mem_cntl[2][par->cmode]); - break; - default: - i = aty_ld_le32(MEM_CNTL) & 0x000F; - aty_st_le32(MEM_CNTL, - (init->mem_cntl[par->cmode] & 0xFFFFFFF0) | i); - } - } -/* These magic constants are harder to figure out -* on the vt chipset bit 2 set makes the screen brighter -* and bit 15 makes the screen black! But nothing else -* seems to matter for the vt DAC_CNTL -*/ - switch (chip_type) { - case MACH64_GT_ID: - i = 0x86010102; - break; - case MACH64_VT_ID: - i = 0x87010184; - break; - default: - i = 0x47012100; + j = 0x86010102; break; } - aty_st_le32(DAC_CNTL, i); - aty_st_8(DAC_MASK, 0xff); + /* These magic constants (variable j) are harder to figure out + * on the vt chipset bit 2 set makes the screen brighter + * and bit 15 makes the screen black! But nothing else + * seems to matter for the vt DAC_CNTL + */ + aty_st_le32(DAC_CNTL, j, info); + aty_st_8(DAC_MASK, 0xff, info); - switch (par->cmode) { + switch (par->hw.gx.cmode) { case CMODE_16: i = CRTC_PIX_WIDTH_15BPP; break; /*case CMODE_24: */ @@ -713,28 +988,35 @@ static void atyfb_set_par(struct atyfb_par *par) i = CRTC_PIX_WIDTH_8BPP; break; } - if (chip_type != MACH64_GT_ID) { - aty_st_le32(CRTC_INT_CNTL, 0x00000002); - aty_st_le32(GEN_TEST_CNTL, GUI_ENGINE_ENABLE | BLOCK_WRITE_ENABLE); /* gui_en block_en */ - i |= init->crtc_gen_cntl[par->cmode]; + if (info->chip_class != CLASS_GT) { + aty_st_le32(CRTC_INT_CNTL, 0x00000002, info); + aty_st_le32(GEN_TEST_CNTL, GUI_ENGINE_ENABLE | BLOCK_WRITE_ENABLE, + info); /* gui_en block_en */ + i |= init->crtc_gen_cntl[par->hw.gx.cmode]; } /* Gentlemen, start your crtc engine */ - aty_st_le32(CRTC_GEN_CNTL, CRTC_EXT_DISP_EN | CRTC_ENABLE | i); + aty_st_le32(CRTC_GEN_CNTL, CRTC_EXT_DISP_EN | CRTC_ENABLE | i, info); + + /* Initialize the graphics engine */ + if (par->accel & FB_ACCELF_TEXT) + init_engine(par, info); #ifdef CONFIG_FB_COMPAT_XPMAC - display_info.height = vmode_attrs[par->vmode-1].vres; - display_info.width = vmode_attrs[par->vmode-1].hres; - display_info.depth = 8<cmode; - display_info.pitch = par->vxres<cmode; - display_info.mode = par->vmode; - strcpy(display_info.name, atyfb_name); - display_info.fb_address = - iopa(((chip_type != MACH64_GT_ID) ? - frame_buffer + init->offset[par->cmode] : frame_buffer)); - display_info.cmap_adr_address = iopa((unsigned long)&aty_cmap_regs->windex); - display_info.cmap_data_address = iopa((unsigned long)&aty_cmap_regs->lut); - display_info.disp_reg_address = iopa(ati_regbase); -#endif /* CONFIG_FB_COMPAT_XPMAC) */ + if (console_fb_info == &info->fb_info) { + display_info.height = vmode_attrs[par->hw.gx.vmode-1].vres; + display_info.width = vmode_attrs[par->hw.gx.vmode-1].hres; + display_info.depth = 8<hw.gx.cmode; + display_info.pitch = par->vxres<hw.gx.cmode; + display_info.mode = par->hw.gx.vmode; + strcpy(display_info.name, atyfb_name); + display_info.fb_address = info->frame_buffer_phys; + if (info->chip_class == CLASS_VT) + display_info.fb_address += init->offset[par->hw.gx.cmode]; + display_info.cmap_adr_address = info->ati_regbase_phys+0xc0; + display_info.cmap_data_address = info->ati_regbase_phys+0xc1; + display_info.disp_reg_address = info->ati_regbase_phys; + } +#endif /* CONFIG_FB_COMPAT_XPMAC */ } @@ -761,30 +1043,67 @@ static int atyfb_release(struct fb_info *info) static int encode_fix(struct fb_fix_screeninfo *fix, - const struct atyfb_par *par) + const struct atyfb_par *par, struct fb_info_aty *info) { struct aty_regvals *init; memset(fix, 0, sizeof(struct fb_fix_screeninfo)); strcpy(fix->id, atyfb_name); - init = get_aty_struct(par->vmode); + init = get_aty_struct(par->hw.gx.vmode, info); /* * FIXME: This will cause problems on non-GT chips, because the frame * buffer must be aligned to a page */ - fix->smem_start = (char *)((chip_type != MACH64_GT_ID) - ? frame_buffer + init->offset[par->cmode] : frame_buffer); - fix->smem_len = (u32)total_vram; - if (fix->smem_len > 0x7ff000) - fix->smem_len = 0x7ff000; /* last page is MMIO */ - fix->mmio_start = (char *)(ati_regbase & ~0xfff); - fix->mmio_len = 4096; + fix->smem_start = (char *)info->frame_buffer_phys; + if (info->chip_class == CLASS_VT) + fix->smem_start += init->offset[par->hw.gx.cmode]; + fix->smem_len = (u32)info->total_vram; + +#ifdef __LITTLE_ENDIAN + /* + * Last page of 8 MB little-endian aperture is MMIO + * FIXME: we should use the auxillary aperture instead so we can acces the + * full 8 MB of video RAM on 8 MB boards + */ + if (fix->smem_len > 0x800000-PAGE_SIZE) + fix->smem_len = 0x800000-PAGE_SIZE; +#endif + /* + * Reg Block 0 (CT-compatible block) is at ati_regbase_phys + * Reg Block 1 (multimedia extensions) is at ati_regbase_phys-0x400 + */ + switch (info->chip_class) { + case CLASS_GX: + fix->mmio_start = (char *)info->ati_regbase_phys; + fix->mmio_len = 0x400; + fix->accel = FB_ACCEL_ATI_MACH64GX; + break; + case CLASS_CT: + fix->mmio_start = (char *)info->ati_regbase_phys; + fix->mmio_len = 0x400; + fix->accel = FB_ACCEL_ATI_MACH64CT; + break; + case CLASS_VT: + fix->mmio_start = (char *)(info->ati_regbase_phys-0x400); + fix->mmio_len = 0x800; + fix->accel = FB_ACCEL_ATI_MACH64VT; + break; + case CLASS_GT: + fix->mmio_start = (char *)(info->ati_regbase_phys-0x400); + fix->mmio_len = 0x800; + fix->accel = FB_ACCEL_ATI_MACH64GT; + break; + default: + fix->mmio_start = NULL; + fix->mmio_len = 0; + fix->accel = 0; + } fix->type = FB_TYPE_PACKED_PIXELS; fix->type_aux = 0; - fix->line_length = par->vxres<cmode; - fix->visual = par->cmode == CMODE_8 ? FB_VISUAL_PSEUDOCOLOR - : FB_VISUAL_TRUECOLOR; + fix->line_length = par->vxres<hw.gx.cmode; + fix->visual = par->hw.gx.cmode == CMODE_8 ? FB_VISUAL_PSEUDOCOLOR + : FB_VISUAL_TRUECOLOR; fix->ywrapstep = 0; fix->xpanstep = 8; fix->ypanstep = 1; @@ -794,7 +1113,7 @@ static int encode_fix(struct fb_fix_screeninfo *fix, static int decode_var(struct fb_var_screeninfo *var, - struct atyfb_par *par) + struct atyfb_par *par, struct fb_info_aty *info) { int xres = var->xres; int yres = var->yres; @@ -804,30 +1123,30 @@ static int decode_var(struct fb_var_screeninfo *var, /* This should support more video modes */ if (xres <= 512 && yres <= 384) - par->vmode = VMODE_512_384_60; /* 512x384, 60Hz */ + par->hw.gx.vmode = VMODE_512_384_60; /* 512x384, 60Hz */ else if (xres <= 640 && yres <= 480) - par->vmode = VMODE_640_480_67; /* 640x480, 67Hz */ + par->hw.gx.vmode = VMODE_640_480_67; /* 640x480, 67Hz */ else if (xres <= 640 && yres <= 870) - par->vmode = VMODE_640_870_75P; /* 640x870, 75Hz (portrait) */ + par->hw.gx.vmode = VMODE_640_870_75P; /* 640x870, 75Hz (portrait) */ else if (xres <= 768 && yres <= 576) - par->vmode = VMODE_768_576_50I; /* 768x576, 50Hz (PAL full frame) */ + par->hw.gx.vmode = VMODE_768_576_50I; /* 768x576, 50Hz (PAL full frame) */ else if (xres <= 800 && yres <= 600) - par->vmode = VMODE_800_600_75; /* 800x600, 75Hz */ + par->hw.gx.vmode = VMODE_800_600_75; /* 800x600, 75Hz */ else if (xres <= 832 && yres <= 624) - par->vmode = VMODE_832_624_75; /* 832x624, 75Hz */ + par->hw.gx.vmode = VMODE_832_624_75; /* 832x624, 75Hz */ else if (xres <= 1024 && yres <= 768) - par->vmode = VMODE_1024_768_75; /* 1024x768, 75Hz */ + par->hw.gx.vmode = VMODE_1024_768_75; /* 1024x768, 75Hz */ else if (xres <= 1152 && yres <= 870) - par->vmode = VMODE_1152_870_75; /* 1152x870, 75Hz */ + par->hw.gx.vmode = VMODE_1152_870_75; /* 1152x870, 75Hz */ else if (xres <= 1280 && yres <= 960) - par->vmode = VMODE_1280_960_75; /* 1280x960, 75Hz */ + par->hw.gx.vmode = VMODE_1280_960_75; /* 1280x960, 75Hz */ else if (xres <= 1280 && yres <= 1024) - par->vmode = VMODE_1280_1024_75; /* 1280x1024, 75Hz */ + par->hw.gx.vmode = VMODE_1280_1024_75; /* 1280x1024, 75Hz */ else return -EINVAL; - xres = vmode_attrs[par->vmode-1].hres; - yres = vmode_attrs[par->vmode-1].vres; + xres = vmode_attrs[par->hw.gx.vmode-1].hres; + yres = vmode_attrs[par->hw.gx.vmode-1].vres; if (var->xres_virtual <= xres) par->vxres = xres; @@ -844,23 +1163,29 @@ static int decode_var(struct fb_var_screeninfo *var, return -EINVAL; if (bpp <= 8) - par->cmode = CMODE_8; + par->hw.gx.cmode = CMODE_8; else if (bpp <= 16) - par->cmode = CMODE_16; + par->hw.gx.cmode = CMODE_16; else if (bpp <= 32) - par->cmode = CMODE_32; + par->hw.gx.cmode = CMODE_32; else return -EINVAL; - if (aty_vram_reqd(par) > total_vram) + if (var->accel_flags & FB_ACCELF_TEXT) + par->accel = FB_ACCELF_TEXT; + else + par->accel = 0; + + if (aty_vram_reqd(par) > info->total_vram) return -EINVAL; /* Check if we know about the wanted video mode */ - init = get_aty_struct(par->vmode); - if (init == NULL || init->crtc_h_sync_strt_wid[par->cmode] == 0 || - (chip_type != MACH64_GT_ID && - init->crtc_gen_cntl[par->cmode] == 0) || - (chip_type == MACH64_GT_ID && (aty_ld_le32(CONFIG_STAT0) & 7) == 5 && + init = get_aty_struct(par->hw.gx.vmode, info); + if (init == NULL || init->crtc_h_sync_strt_wid[par->hw.gx.cmode] == 0 || + (info->chip_class != CLASS_GT && + init->crtc_gen_cntl[par->hw.gx.cmode] == 0) || + (info->chip_class == CLASS_GT && + (aty_ld_le32(CONFIG_STAT0, info) & 7) == 5 && init->crtc_gen_cntl[1] == 0)) return -EINVAL; @@ -873,18 +1198,31 @@ static int decode_var(struct fb_var_screeninfo *var, } static int encode_var(struct fb_var_screeninfo *var, - const struct atyfb_par *par) + const struct atyfb_par *par, + struct fb_info_aty *info) { + int vmode = par->hw.gx.vmode; + int cmode = par->hw.gx.cmode; + struct aty_regvals *init = get_aty_struct(vmode, info); + u_int h_total, h_disp; + u_int h_sync_strt, h_sync_dly, h_sync_wid, h_sync_pol; + u_int v_total, v_disp; + u_int v_sync_strt, v_sync_wid, v_sync_pol; + u_int xtalin, vclk; + u8 pll_ref_div, vclk_fb_div, vclk_post_div, pll_ext_cntl; + memset(var, 0, sizeof(struct fb_var_screeninfo)); + if (!init) + return -EINVAL; - var->xres = vmode_attrs[par->vmode-1].hres; - var->yres = vmode_attrs[par->vmode-1].vres; + var->xres = vmode_attrs[vmode-1].hres; + var->yres = vmode_attrs[vmode-1].vres; var->xres_virtual = par->vxres; var->yres_virtual = par->vyres; var->xoffset = par->xoffset; var->yoffset = par->yoffset; var->grayscale = 0; - switch (par->cmode) { + switch (cmode) { case CMODE_8: var->bits_per_pixel = 8; var->red.offset = 0; @@ -927,21 +1265,97 @@ static int encode_var(struct fb_var_screeninfo *var, var->activate = 0; var->height = -1; var->width = -1; - var->accel = /* FB_ACCEL_ATY */ 0; var->vmode = FB_VMODE_NONINTERLACED; - var->left_margin = var->right_margin = 64; /* guesses */ - var->upper_margin = var->lower_margin = 32; - var->hsync_len = 64; - var->vsync_len = 2; - - /* no long long support in the kernel :-( */ - /* this splittig trick will work if xres > 232 */ - var->pixclock = 1000000000/ - (var->left_margin+var->xres+var->right_margin+var->hsync_len); - var->pixclock *= 1000; - var->pixclock /= vmode_attrs[par->vmode-1].vfreq* - (var->upper_margin+var->yres+var->lower_margin+var->vsync_len); - var->sync = 0; + var->accel_flags = par->accel; + + h_total = (init->crtc_h_tot_disp<<3) & 0xff8; + h_disp = (init->crtc_h_tot_disp>>13) & 0x7f8; + h_sync_strt = ((init->crtc_h_sync_strt_wid[cmode]<<3) & 0x7f8) | + ((init->crtc_h_sync_strt_wid[cmode]>>1) & 0x800); + h_sync_dly = (init->crtc_h_sync_strt_wid[cmode]>>8) & 0x7; + h_sync_wid = (init->crtc_h_sync_strt_wid[cmode]>>13) & 0xf8; + h_sync_pol = (init->crtc_h_sync_strt_wid[cmode]>>21) & 0x1; + + v_total = init->crtc_v_tot_disp & 0x7ff; + v_disp = (init->crtc_v_tot_disp>>16) & 0x7ff; + v_sync_strt = init->crtc_v_sync_strt_wid & 0x7ff; + v_sync_wid = (init->crtc_v_sync_strt_wid>>16) & 0x1f; + v_sync_pol = (init->crtc_v_sync_strt_wid>>21) & 0x1; + + var->left_margin = (h_total+8)-h_sync_strt-h_sync_wid; + var->right_margin = h_sync_strt-(h_disp+8); + var->upper_margin = (v_total+1)-v_sync_strt-v_sync_wid; + var->lower_margin = v_sync_strt-(v_disp+1); + var->hsync_len = h_sync_wid; + var->vsync_len = v_sync_wid; + var->sync = (h_sync_pol ? 0 : FB_SYNC_HOR_HIGH_ACT) | + (v_sync_pol ? 0 : FB_SYNC_VERT_HIGH_ACT); + + xtalin = 69841; /* 14.31818 MHz */ + switch (info->chip_class) { + case CLASS_GX: + { + /* haven't read the IBM RGB514 PDF yet, so just guesses */ + static u32 gx_vclk[VMODE_MAX] = { + 0, /* vmode 1 */ + 0, /* vmode 2 */ + 0, /* vmode 3 */ + 0, /* vmode 4 */ + 39722, /* vmode 5 (25.175 MHz) */ + 33333, /* vmode 6 (30 MHz) */ + 0, /* vmode 7 */ + 0, /* vmode 8 */ + 27778, /* vmode 9 (36 MHz) */ + 25000, /* vmode 10 (40 MHz) */ + 20000, /* vmode 11 (50 MHz) */ + 20000, /* vmode 12 (50 MHz) */ + 17544, /* vmode 13 (57 MHz) */ + 15385, /* vmode 14 (65 MHz) */ + 13333, /* vmode 15 (75 MHz) */ + 0, /* vmode 16 */ + 12821, /* vmode 17 (78 MHz) */ + 10000, /* vmode 18 (100 MHz) */ + 7937, /* vmode 19 (126 MHz) */ + 7407 /* vmode 20 (135 MHz) */ + }; + vclk = gx_vclk[vmode-1]; + } + break; + case CLASS_CT: + case CLASS_GT: + case CLASS_VT: + if (info->chip_class == CLASS_GT) { + pll_ref_div = 0x21; + vclk_post_div = init->offset[0]; + vclk_fb_div = init->offset[1]; + pll_ext_cntl = init->offset[2]; + } else { + pll_ref_div = 0x2d; + vclk_post_div = init->clock_val[0]; + vclk_fb_div = init->clock_val[1]; + pll_ext_cntl = 0x0; + } + vclk = xtalin*pll_ref_div; + switch (vclk_post_div & 3) { + case 0: + vclk *= (pll_ext_cntl & 0x10) ? 3 : 1; + break; + case 1: + if (pll_ext_cntl & 0x10) + return -EINVAL; + vclk *= 2; + break; + case 2: + vclk *= (pll_ext_cntl & 0x10) ? 6 : 4; + break; + case 3: + vclk *= (pll_ext_cntl & 0x10) ? 12 : 8; + break; + } + vclk /= 2*vclk_fb_div; + break; + } + var->pixclock = vclk; return 0; } @@ -949,12 +1363,13 @@ static int encode_var(struct fb_var_screeninfo *var, static void init_par(struct atyfb_par *par, int vmode, int cmode) { - par->vmode = vmode; - par->cmode = cmode; + par->hw.gx.vmode = vmode; + par->hw.gx.cmode = cmode; par->vxres = vmode_attrs[vmode-1].hres; par->vyres = vmode_attrs[vmode-1].vres; par->xoffset = 0; par->yoffset = 0; + par->accel = FB_ACCELF_TEXT; } @@ -965,13 +1380,14 @@ static void init_par(struct atyfb_par *par, int vmode, int cmode) static int atyfb_get_fix(struct fb_fix_screeninfo *fix, int con, struct fb_info *info) { + struct fb_info_aty *info2 = (struct fb_info_aty *)info; struct atyfb_par par; if (con == -1) - par = default_par; + par = info2->default_par; else - decode_var(&fb_display[con].var, &par); - encode_fix(fix, &par); + decode_var(&fb_display[con].var, &par, info2); + encode_fix(fix, &par, info2); return 0; } @@ -983,10 +1399,12 @@ static int atyfb_get_fix(struct fb_fix_screeninfo *fix, int con, static int atyfb_get_var(struct fb_var_screeninfo *var, int con, struct fb_info *info) { + struct fb_info_aty *info2 = (struct fb_info_aty *)info; + if (con == -1) - encode_var(var, &default_par); + encode_var(var, &info2->default_par, (struct fb_info_aty *)info); else - *var=fb_display[con].var; + *var = fb_display[con].var; return 0; } @@ -998,10 +1416,10 @@ static int atyfb_get_var(struct fb_var_screeninfo *var, int con, static int atyfb_set_var(struct fb_var_screeninfo *var, int con, struct fb_info *info) { + struct fb_info_aty *info2 = (struct fb_info_aty *)info; struct atyfb_par par; struct display *display; - int oldxres, oldyres, oldvxres, oldvyres, oldbpp; - int err; + int oldxres, oldyres, oldvxres, oldvyres, oldbpp, oldaccel, accel, err; int activate = var->activate; if (con >= 0) @@ -1009,10 +1427,10 @@ static int atyfb_set_var(struct fb_var_screeninfo *var, int con, else display = &fb_disp; /* used during initialization */ - if ((err = decode_var(var, &par))) + if ((err = decode_var(var, &par, info2))) return err; - encode_var(var, &par); + encode_var(var, &par, (struct fb_info_aty *)info); if ((activate & FB_ACTIVATE_MASK) == FB_ACTIVATE_NOW) { oldxres = display->var.xres; @@ -1020,14 +1438,15 @@ static int atyfb_set_var(struct fb_var_screeninfo *var, int con, oldvxres = display->var.xres_virtual; oldvyres = display->var.yres_virtual; oldbpp = display->var.bits_per_pixel; + oldaccel = display->var.accel_flags; display->var = *var; if (oldxres != var->xres || oldyres != var->yres || oldvxres != var->xres_virtual || oldvyres != var->yres_virtual || - oldbpp != var->bits_per_pixel) { + oldbpp != var->bits_per_pixel || oldaccel != var->accel_flags) { struct fb_fix_screeninfo fix; - encode_fix(&fix, &par); - display->screen_base = (u_char *)fix.smem_start; + encode_fix(&fix, &par, info2); + display->screen_base = (char *)info2->frame_buffer; display->visual = fix.visual; display->type = fix.type; display->type_aux = fix.type_aux; @@ -1036,29 +1455,32 @@ static int atyfb_set_var(struct fb_var_screeninfo *var, int con, display->line_length = fix.line_length; display->can_soft_blank = 1; display->inverse = 0; - switch (par.cmode) { + accel = var->accel_flags & FB_ACCELF_TEXT; + switch (par.hw.gx.cmode) { +#ifdef CONFIG_FBCON_CFB8 case CMODE_8: -#if 1 - display->dispsw = &fbcon_cfb8; -#else - display->dispsw = &fbcon_aty8; -#endif + display->dispsw = accel ? &fbcon_aty8 : &fbcon_cfb8; break; +#endif +#ifdef CONFIG_FBCON_CFB16 case CMODE_16: - display->dispsw = &fbcon_cfb16; + display->dispsw = accel ? &fbcon_aty16 : &fbcon_cfb16; break; +#endif +#ifdef CONFIG_FBCON_CFB32 case CMODE_32: - display->dispsw = &fbcon_cfb32; + display->dispsw = accel ? &fbcon_aty32 : &fbcon_cfb32; break; +#endif default: display->dispsw = NULL; break; } - if (fb_info.changevar) - (*fb_info.changevar)(con); + if (info->changevar) + (*info->changevar)(con); } if (con == currcon) - atyfb_set_par(&par); + atyfb_set_par(&par, info2); if (oldbpp != var->bits_per_pixel) { if ((err = fb_alloc_cmap(&display->cmap, 0, 0))) return err; @@ -1079,18 +1501,19 @@ static int atyfb_set_var(struct fb_var_screeninfo *var, int con, static int atyfb_pan_display(struct fb_var_screeninfo *var, int con, struct fb_info *info) { + struct fb_info_aty *info2 = (struct fb_info_aty *)info; u32 xres, yres, xoffset, yoffset; - struct atyfb_par *par = ¤t_par; + struct atyfb_par *par = &info2->current_par; - xres = vmode_attrs[par->vmode-1].hres; - yres = vmode_attrs[par->vmode-1].vres; + xres = vmode_attrs[par->hw.gx.vmode-1].hres; + yres = vmode_attrs[par->hw.gx.vmode-1].vres; xoffset = (var->xoffset+7) & ~7; yoffset = var->yoffset; if (xoffset+xres > par->vxres || yoffset+yres > par->vyres) return -EINVAL; par->xoffset = xoffset; par->yoffset = yoffset; - set_off_pitch(par); + set_off_pitch(par, info2); return 0; } @@ -1146,225 +1569,328 @@ static int atyfb_ioctl(struct inode *inode, struct file *file, u_int cmd, * Initialisation */ -__initfunc(unsigned long atyfb_init(unsigned long mem_start)) +__initfunc(static int aty_init(struct fb_info_aty *info, const char *name)) { -#ifdef __powerpc__ - /* We don't want to be called like this. */ - /* We rely on Open Firmware (offb) instead. */ - return mem_start; -#else /* !__powerpc__ */ - /* To be merged with Bernd's mach64fb */ - return mem_start; -#endif /* !__powerpc__ */ -} - - -unsigned long atyfb_of_init(unsigned long mem_start, struct device_node *dp) -{ - int i, err, sense; + u32 chip_id; + u32 i; + int j, k, err, sense; struct fb_var_screeninfo var; struct aty_regvals *init; - unsigned long addr; - unsigned char bus, devfn; - unsigned short cmd; - - if (dp->next) - printk("Warning: only using first ATI card detected\n"); - if (dp->n_addrs != 1 && dp->n_addrs != 3) - printk("Warning: expecting 1 or 3 addresses for ATY (got %d)", - dp->n_addrs); - - ati_regbase = (int)ioremap((0x7ffc00 + dp->addrs[0].address), 0x1000); - aty_cmap_regs = (struct aty_cmap_regs *)(ati_regbase + 0xC0); - - /* enable memory-space accesses using config-space command register */ - if (pci_device_loc(dp, &bus, &devfn) == 0) { - pcibios_read_config_word(bus, devfn, PCI_COMMAND, &cmd); - if (cmd != 0xffff) { - cmd |= PCI_COMMAND_MEMORY; - pcibios_write_config_word(bus, devfn, PCI_COMMAND, cmd); + const char *chipname = NULL; + u8 rev; + + info->aty_cmap_regs = (struct aty_cmap_regs *)(info->ati_regbase+0xc0); + chip_id = aty_ld_le32(CONFIG_CHIP_ID, info); + for (j = 0; j < (sizeof(aty_features)/sizeof(*aty_features)); j++) + if (aty_features[j].chip_type == (chip_id & CFG_CHIP_TYPE)) { + chipname = aty_features[j].name; + info->chip_class = aty_features[j].chip_class; + info->pixclock_lim_8 = 1000000/aty_features[j].pixclock_lim_8; + info->pixclock_lim_hi = 1000000/aty_features[j].pixclock_lim_hi; } + if (!chipname) { + printk("atyfb: Unknown Mach64 0x%04x\n", chip_id & CFG_CHIP_TYPE); + return 0; + } else + printk("atyfb: %s [", chipname); + rev = (chip_id & CFG_CHIP_REV)>>24; + switch ((rev>>3) & 7) { + case MACH64_FND_SGS: + printk("SGS"); + break; + case MACH64_FND_NEC: + printk("NEC"); + break; + case MACH64_FND_UMC: + printk("UMC"); + break; } - chip_type = (aty_ld_le32(CONFIG_CHIP_ID) & CFG_CHIP_TYPE); + printk(" %c%d]\n", 'A'+(rev & 7), rev>>6); - i = aty_ld_le32(MEM_CNTL); - if (chip_type != MACH64_GT_ID) + i = aty_ld_le32(MEM_CNTL, info); + if (info->chip_class != CLASS_GT) switch (i & MEM_SIZE_ALIAS) { case MEM_SIZE_512K: - total_vram = 0x80000; + info->total_vram = 0x80000; break; case MEM_SIZE_1M: - total_vram = 0x100000; + info->total_vram = 0x100000; break; case MEM_SIZE_2M: - total_vram = 0x200000; + info->total_vram = 0x200000; break; case MEM_SIZE_4M: - total_vram = 0x400000; + info->total_vram = 0x400000; break; case MEM_SIZE_6M: - total_vram = 0x600000; + info->total_vram = 0x600000; break; case MEM_SIZE_8M: - total_vram = 0x800000; + info->total_vram = 0x800000; break; default: - total_vram = 0x80000; + info->total_vram = 0x80000; } else switch (i & 0xF) { /* 0xF used instead of MEM_SIZE_ALIAS */ case MEM_SIZE_512K: - total_vram = 0x80000; + info->total_vram = 0x80000; break; case MEM_SIZE_1M: - total_vram = 0x100000; + info->total_vram = 0x100000; break; case MEM_SIZE_2M_GTB: - total_vram = 0x200000; + info->total_vram = 0x200000; break; case MEM_SIZE_4M_GTB: - total_vram = 0x400000; + info->total_vram = 0x400000; break; case MEM_SIZE_6M_GTB: - total_vram = 0x600000; + info->total_vram = 0x600000; break; case MEM_SIZE_8M_GTB: - total_vram = 0x800000; + info->total_vram = 0x800000; break; default: - total_vram = 0x80000; + info->total_vram = 0x80000; } - -#if 1 - printk("aty_display_init: node = %p, addrs = ", dp->node); - printk(" %x(%x)", dp->addrs[0].address, dp->addrs[0].size); - printk(", intrs ="); - for (i = 0; i < dp->n_intrs; ++i) - printk(" %x", dp->intrs[i].line); - printk("\nregbase: %x pci loc: %x:%x total_vram: %x cregs: %p\n", - (int)ati_regbase, bus, devfn, total_vram, aty_cmap_regs); +#ifdef CONFIG_ATARI /* this is definately not the wrong way to set this */ + if ((info->total_vram == 0x400000) || (info->total_vram == 0x800000)) { + /* protect GUI-regs if complete Aperture is VRAM */ + info->total_vram -= 0x00001000; + } #endif - /* Map in frame buffer */ - addr = dp->addrs[0].address; - - /* use the big-endian aperture (??) */ - addr += 0x800000; - frame_buffer = (unsigned long)__ioremap(addr, 0x800000, _PAGE_WRITETHRU); - - if (default_video_mode != -1) { - sense = read_aty_sense(); - printk("monitor sense = %x\n", sense); - if (default_video_mode == VMODE_NVRAM) { - default_video_mode = nvram_read_byte(NV_VMODE); - init = get_aty_struct(default_video_mode); - if (default_video_mode <= 0 || - default_video_mode > VMODE_MAX || init == 0) - default_video_mode = VMODE_CHOOSE; - } - if (default_video_mode == VMODE_CHOOSE) - default_video_mode = map_monitor_sense(sense); +#if 0 + printk("aty_init: regbase = %lx, frame_buffer = %lx, total_vram = %x\n", + info->ati_regbase, info->frame_buffer, info->total_vram); +#endif - init = get_aty_struct(default_video_mode); - if (!init) - default_video_mode = VMODE_640_480_60; + sense = read_aty_sense(info); + printk("monitor sense = %x\n", sense); +#if defined(CONFIG_PMAC) || defined(CONFIG_CHRP) + if (default_vmode == VMODE_NVRAM) { + default_vmode = nvram_read_byte(NV_VMODE); + init = get_aty_struct(default_vmode, info); + if (default_vmode <= 0 || default_vmode > VMODE_MAX || init == 0) + default_vmode = VMODE_CHOOSE; } + if (default_vmode == VMODE_CHOOSE) + default_vmode = map_monitor_sense(sense); +#else /* !CONFIG_PMAC && !CONFIG_CHRP */ + if (default_vmode == VMODE_NVRAM) + default_vmode = map_monitor_sense(sense); +#endif /* !CONFIG_PMAC && !CONFIG_CHRP */ + + if (!(init = get_aty_struct(default_vmode, info))) + default_vmode = VMODE_640_480_60; /* * Reduce the pixel size if we don't have enough VRAM. */ - if (default_color_mode == CMODE_NVRAM) - default_color_mode = nvram_read_byte(NV_CMODE); - if (default_color_mode < CMODE_8 || - default_color_mode > CMODE_32) - default_color_mode = CMODE_8; - - init_par(&default_par, default_video_mode, default_color_mode); - while (aty_vram_reqd(&default_par) > total_vram) { - while (default_color_mode > CMODE_8 && - aty_vram_reqd(&default_par) > total_vram) { - --default_color_mode; - init_par(&default_par, default_video_mode, default_color_mode); + if (default_cmode == CMODE_NVRAM) +#if defined(CONFIG_PMAC) || defined(CONFIG_CHRP) + default_cmode = nvram_read_byte(NV_CMODE); +#else /* !CONFIG_PMAC && !CONFIG_CHRP */ + default_cmode = CMODE_8; +#endif /* !CONFIG_PMAC && !CONFIG_CHRP */ + if (default_cmode < CMODE_8 || default_cmode > CMODE_32) + default_cmode = CMODE_8; + + init_par(&info->default_par, default_vmode, default_cmode); + while (aty_vram_reqd(&info->default_par) > info->total_vram) { + while (default_cmode > CMODE_8 && + aty_vram_reqd(&info->default_par) > info->total_vram) { + --default_cmode; + init_par(&info->default_par, default_vmode, default_cmode); } /* - * adjust the video mode smaller if there still is not enough VRAM + * Adjust the video mode smaller if there still is not enough VRAM */ - if (aty_vram_reqd(&default_par) > total_vram) + if (aty_vram_reqd(&info->default_par) > info->total_vram) do { - default_video_mode--; - init_par(&default_par, default_video_mode, default_color_mode); - init = get_aty_struct(default_video_mode); + default_vmode--; + init_par(&info->default_par, default_vmode, default_cmode); + init = get_aty_struct(default_vmode, info); } while ((init == 0) && - (default_video_mode > VMODE_640_480_60)); + (default_vmode > VMODE_640_480_60)); } - if (chip_type == MACH64_GT_ID && (aty_ld_le32(CONFIG_STAT0) & 7) == 5 + if (info->chip_class == CLASS_GT && + (aty_ld_le32(CONFIG_STAT0, info) & 7) == 5 && init->crtc_gen_cntl[1] == 0) { - default_video_mode = VMODE_640_480_67; - default_color_mode = CMODE_8; - init_par(&default_par, default_video_mode, default_color_mode); + default_vmode = VMODE_640_480_67; + default_cmode = CMODE_8; + init_par(&info->default_par, default_vmode, default_cmode); } - switch (chip_type) { - case MACH64_GX_ID: + switch (info->chip_class) { + case CLASS_GX: strcat(atyfb_name, "GX"); break; - case MACH64_VT_ID: + case CLASS_CT: + strcat(atyfb_name, "CT"); + break; + case CLASS_VT: strcat(atyfb_name, "VT"); break; - case MACH64_GT_ID: + case CLASS_GT: strcat(atyfb_name, "GT"); break; - default: - break; } - strcpy(fb_info.modename, atyfb_name); - fb_info.node = -1; - fb_info.fbops = &atyfb_ops; - fb_info.disp = &fb_disp; - fb_info.fontname[0] = '\0'; - fb_info.changevar = NULL; - fb_info.switch_con = &atyfbcon_switch; - fb_info.updatevar = &atyfbcon_updatevar; - fb_info.blank = &atyfbcon_blank; - - err = register_framebuffer(&fb_info); + strcpy(info->fb_info.modename, atyfb_name); + info->fb_info.node = -1; + info->fb_info.fbops = &atyfb_ops; + info->fb_info.disp = &fb_disp; + info->fb_info.fontname[0] = '\0'; + info->fb_info.changevar = NULL; + info->fb_info.switch_con = &atyfbcon_switch; + info->fb_info.updatevar = &atyfbcon_updatevar; + info->fb_info.blank = &atyfbcon_blank; + + for (j = 0; j < 16; j++) { + k = color_table[j]; + info->palette[j].red = default_red[k]; + info->palette[j].green = default_grn[k]; + info->palette[j].blue = default_blu[k]; + } + + err = register_framebuffer(&info->fb_info); if (err < 0) - return mem_start; + return 0; + atyfb_set_par(&info->default_par, info); + encode_var(&var, &info->default_par, info); + atyfb_set_var(&var, -1, &info->fb_info); + + printk("fb%d: %s frame buffer device on %s\n", + GET_FB_IDX(info->fb_info.node), atyfb_name, name); + return 1; +} - for (i = 0; i < 16; i++) { - int j = color_table[i]; - palette[i].red = default_red[j]; - palette[i].green = default_grn[j]; - palette[i].blue = default_blu[j]; +__initfunc(unsigned long atyfb_init(unsigned long mem_start)) +{ +#if defined(CONFIG_FB_OF) + /* We don't want to be called like this. */ + /* We rely on Open Firmware (offb) instead. */ +#elif defined(CONFIG_PCI) + /* Anyone who wants to do a PCI probe for an ATI chip? */ +#elif defined(CONFIG_ATARI) + int m64_num; + struct fb_info_aty *info; + + for (m64_num = 0; m64_num < mach64_count; m64_num++) { + if (!phys_vmembase[m64_num] || !phys_size[m64_num] || + !phys_guiregbase[m64_num]) { + printk(" phys_*[%d] parameters not set => returning early. \n", + m64_num); + continue; + } + + info = (struct fb_info_aty *)mem_start; + mem_start += sizeof(struct fb_info_aty); + mem_start = PAGE_ALIGN(mem_start); + + /* + * Map the video memory (physical address given) to somewhere in the + * kernel address space. + */ + info->frame_buffer = kernel_map(phys_vmembase[m64_num], + phys_size[m64_num], + KERNELMAP_NOCACHE_SER, &mem_start); + info->frame_buffer_phys = info->frame_buffer; + info->ati_regbase = kernel_map(phys_guiregbase[m64_num], 0x10000, + KERNELMAP_NOCACHE_SER, &mem_start) + +0xFC00ul; + info->ati_regbase_phys = info->ati_regbase; + + if (!aty_init(info, "ISA bus")) { + /* This is insufficient! kernel_map has added two large chunks!! */ + return mem_start; + } } - atyfb_set_par(&default_par); - encode_var(&var, &default_par); - atyfb_set_var(&var, -1, &fb_info); +#endif + return mem_start; +} + +#ifdef CONFIG_FB_OF +__initfunc(void atyfb_of_init(struct device_node *dp)) +{ + unsigned long addr; + u8 bus, devfn; + u16 cmd; + struct fb_info_aty *info; + int i; + + for (; dp; dp = dp->next) { + switch (dp->n_addrs) { + case 1: + case 3: + addr = dp->addrs[0].address; + break; + case 4: + addr = dp->addrs[1].address; + break; + default: + printk("Warning: got %d adresses for ATY:\n", dp->n_addrs); + for (i = 0; i < dp->n_addrs; i++) + printk(" %08x-%08x", dp->addrs[i].address, + dp->addrs[i].address+dp->addrs[i].size-1); + if (dp->n_addrs) + printk("\n"); + continue; + } - printk("fb%d: %s frame buffer device on %s\n", GET_FB_IDX(fb_info.node), - atyfb_name, dp->full_name); + info = kmalloc(sizeof(struct fb_info_aty), GFP_ATOMIC); + + info->ati_regbase = (unsigned long)ioremap(0x7ff000+addr, + 0x1000)+0xc00; + info->ati_regbase_phys = 0x7ff000+addr; + info->ati_regbase = (unsigned long)ioremap(info->ati_regbase_phys, + 0x1000); + info->ati_regbase_phys += 0xc00; + info->ati_regbase += 0xc00; + + /* enable memory-space accesses using config-space command register */ + if (pci_device_loc(dp, &bus, &devfn) == 0) { + pcibios_read_config_word(bus, devfn, PCI_COMMAND, &cmd); + if (cmd != 0xffff) { + cmd |= PCI_COMMAND_MEMORY; + pcibios_write_config_word(bus, devfn, PCI_COMMAND, cmd); + } + } + +#ifdef __BIG_ENDIAN + /* Use the big-endian aperture */ + addr += 0x800000; +#endif + + /* Map in frame buffer */ + info->frame_buffer_phys = addr; + info->frame_buffer = (unsigned long)ioremap(addr, 0x800000); + + if (!aty_init(info, dp->full_name)) { + kfree(info); + return; + } #ifdef CONFIG_FB_COMPAT_XPMAC - if (!console_fb_info) { - console_fb_info = &fb_info; - console_setmode_ptr = atyfb_console_setmode; - console_set_cmap_ptr = atyfb_set_cmap; + if (!console_fb_info) { + console_fb_info = &info->fb_info; + console_setmode_ptr = atyfb_console_setmode; + console_set_cmap_ptr = atyfb_set_cmap; + } +#endif /* CONFIG_FB_COMPAT_XPMAC */ } -#endif /* CONFIG_FB_COMPAT_XPMAC) */ - - return mem_start; } +#endif /* CONFIG_FB_OF */ -/* XXX: doesn't work yet */ -void atyfb_setup(char *options, int *ints) +__initfunc(void atyfb_setup(char *options, int *ints)) { char *this_opt; int vmode; int depth; - if (!options || !*options) return; @@ -1373,29 +1899,94 @@ void atyfb_setup(char *options, int *ints) if (!strncmp(this_opt, "vmode:", 6)) { vmode = simple_strtoul(this_opt+6, NULL, 0); if (vmode > 0 && vmode <= VMODE_MAX) - default_video_mode = vmode; + default_vmode = vmode; } else if (!strncmp(this_opt, "cmode:", 6)) { depth = simple_strtoul(this_opt+6, NULL, 0); switch (depth) { case 8: - default_color_mode = CMODE_8; + default_cmode = CMODE_8; break; case 15: case 16: - default_color_mode = CMODE_16; + default_cmode = CMODE_16; break; case 24: case 32: - default_color_mode = CMODE_32; + default_cmode = CMODE_32; break; - }; + } + } +#ifdef CONFIG_ATARI + /* + * Why do we need this silly Mach64 argument? + * We are already here because of mach64= so its redundant. + */ + else if (MACH_IS_ATARI && (!strncmp(this_opt, "Mach64:", 7))) { + static unsigned char m64_num; + static char mach64_str[80]; + strncpy(mach64_str, this_opt+7, 80); + if (!store_video_par(mach64_str, m64_num)) { + m64_num++; + mach64_count = m64_num; + } } +#endif } } +#ifdef CONFIG_ATARI +__initfunc(static int store_video_par(char *video_str, unsigned char m64_num)) +{ + char *p; + unsigned long vmembase, size, guiregbase; + + printk("store_video_par() '%s' \n", video_str); + + if (!(p = strtoke(video_str, ";")) || !*p) + goto mach64_invalid; + vmembase = simple_strtoul(p, NULL, 0); + if (!(p = strtoke(NULL, ";")) || !*p) + goto mach64_invalid; + size = simple_strtoul(p, NULL, 0); + if (!(p = strtoke(NULL, ";")) || !*p) + goto mach64_invalid; + guiregbase = simple_strtoul(p, NULL, 0); + + phys_vmembase[m64_num] = vmembase; + phys_size[m64_num] = size; + phys_guiregbase[m64_num] = guiregbase; + printk(" stored them all: $%08lX $%08lX $%08lX \n", vmembase, size, + guiregbase); + return 0; + +mach64_invalid: + phys_vmembase[m64_num] = 0; + return -1; +} + +__initfunc(static char *strtoke(char *s, const char *ct)) +{ + static char *ssave = NULL; + char *sbegin, *send; + + sbegin = s ? s : ssave; + if (!sbegin) + return NULL; + if (*sbegin == '\0') { + ssave = NULL; + return NULL; + } + send = strpbrk(sbegin, ct); + if (send && *send != '\0') + *send++ = '\0'; + ssave = send; + return sbegin; +} +#endif /* !CONFIG_FB_OF */ static int atyfbcon_switch(int con, struct fb_info *info) { + struct fb_info_aty *info2 = (struct fb_info_aty *)info; struct atyfb_par par; /* Do we have to save the colormap? */ @@ -1403,8 +1994,8 @@ static int atyfbcon_switch(int con, struct fb_info *info) fb_get_cmap(&fb_display[currcon].cmap, &fb_display[currcon].var, 1, atyfb_getcolreg, info); currcon = con; - decode_var(&fb_display[con].var, &par); - atyfb_set_par(&par); + decode_var(&fb_display[con].var, &par, info2); + atyfb_set_par(&par, info2); /* Install new colormap */ do_install_cmap(con, info); return 0; @@ -1416,8 +2007,10 @@ static int atyfbcon_switch(int con, struct fb_info *info) static int atyfbcon_updatevar(int con, struct fb_info *info) { - current_par.yoffset = fb_display[con].var.yoffset; - set_off_pitch(¤t_par); + struct fb_info_aty *info2 = (struct fb_info_aty *)info; + + info2->current_par.yoffset = fb_display[con].var.yoffset; + set_off_pitch(&info2->current_par, info2); return 0; } @@ -1427,9 +2020,10 @@ static int atyfbcon_updatevar(int con, struct fb_info *info) static void atyfbcon_blank(int blank, struct fb_info *info) { - char gen_cntl; + struct fb_info_aty *info2 = (struct fb_info_aty *)info; + u8 gen_cntl; - gen_cntl = aty_ld_8(CRTC_GEN_CNTL); + gen_cntl = aty_ld_8(CRTC_GEN_CNTL, info2); if (blank & VESA_VSYNC_SUSPEND) gen_cntl |= 0x8; if (blank & VESA_HSYNC_SUSPEND) @@ -1438,7 +2032,7 @@ static void atyfbcon_blank(int blank, struct fb_info *info) gen_cntl |= 0x40; if (blank == VESA_NO_BLANKING) gen_cntl &= ~(0x4c); - aty_st_8(CRTC_GEN_CNTL, gen_cntl); + aty_st_8(CRTC_GEN_CNTL, gen_cntl, info2); } @@ -1448,13 +2042,15 @@ static void atyfbcon_blank(int blank, struct fb_info *info) */ static int atyfb_getcolreg(u_int regno, u_int *red, u_int *green, u_int *blue, - u_int *transp, struct fb_info *info) + u_int *transp, struct fb_info *info) { + struct fb_info_aty *info2 = (struct fb_info_aty *)info; + if (regno > 255) return 1; - *red = palette[regno].red; - *green = palette[regno].green; - *blue = palette[regno].blue; + *red = info2->palette[regno].red; + *green = info2->palette[regno].green; + *blue = info2->palette[regno].blue; return 0; } @@ -1466,32 +2062,31 @@ static int atyfb_getcolreg(u_int regno, u_int *red, u_int *green, u_int *blue, */ static int atyfb_setcolreg(u_int regno, u_int red, u_int green, u_int blue, - u_int transp, struct fb_info *info) + u_int transp, struct fb_info *info) { + struct fb_info_aty *info2 = (struct fb_info_aty *)info; int i, scale; if (regno > 255) return 1; - palette[regno].red = red; - palette[regno].green = green; - palette[regno].blue = blue; - aty_WaitQueue(2); - i = aty_ld_8(DAC_CNTL) & 0xfc; - if (chip_type == MACH64_GT_ID) - i |= 0x2; /*DAC_CNTL|0x2 turns off the extra brightness for gt*/ - aty_st_8(DAC_CNTL, i); - aty_st_8(DAC_REGS + DAC_MASK, 0xff); + info2->palette[regno].red = red; + info2->palette[regno].green = green; + info2->palette[regno].blue = blue; + i = aty_ld_8(DAC_CNTL, info2) & 0xfc; + if (info2->chip_class == CLASS_GT) + i |= 0x2; /*DAC_CNTL|0x2 turns off the extra brightness for gt*/ + aty_st_8(DAC_CNTL, i, info2); + aty_st_8(DAC_REGS + DAC_MASK, 0xff, info2); eieio(); - scale = ((chip_type != MACH64_GX_ID) && - (current_par.cmode == CMODE_16)) ? 3 : 0; - aty_WaitQueue(4); - aty_cmap_regs->windex = regno << scale; + scale = ((info2->chip_class != CLASS_GX) && + (info2->current_par.hw.gx.cmode == CMODE_16)) ? 3 : 0; + info2->aty_cmap_regs->windex = regno << scale; eieio(); - aty_cmap_regs->lut = red << scale; + info2->aty_cmap_regs->lut = red << scale; eieio(); - aty_cmap_regs->lut = green << scale; + info2->aty_cmap_regs->lut = green << scale; eieio(); - aty_cmap_regs->lut = blue << scale; + info2->aty_cmap_regs->lut = blue << scale; eieio(); if (regno < 16) { #ifdef CONFIG_FBCON_CFB16 @@ -1524,15 +2119,33 @@ static void do_install_cmap(int con, struct fb_info *info) * Accelerated functions */ -void aty_waitblit(void) +static inline void draw_rect(s16 x, s16 y, u16 width, u16 height, + struct fb_info_aty *info) { - aty_WaitIdleEmpty(); /* Make sure that all commands have finished */ + /* perform rectangle fill */ + wait_for_fifo(2, info); + aty_st_le32(DST_Y_X, (x << 16) | y, info); + aty_st_le32(DST_HEIGHT_WIDTH, (width << 16) | height, info); } -void aty_rectcopy(int srcx, int srcy, int dstx, int dsty, u_int width, - u_int height) +static inline void aty_rectcopy(int srcx, int srcy, int dstx, int dsty, + u_int width, u_int height, + struct fb_info_aty *info) { - u_int direction = 0; + u32 direction = DST_LAST_PEL; + u32 pitch_value; + + if (!width || !height) + return; + + pitch_value = info->current_par.vxres; +#if 0 + if (par->hw.gx.cmode == CMODE_24) { + /* In 24 bpp, the engine is in 8 bpp - this requires that all */ + /* horizontal coordinates and widths must be adjusted */ + pitch_value = pitch_value * 3; + } +#endif if (srcy < dsty) { dsty += height - 1; @@ -1546,46 +2159,33 @@ void aty_rectcopy(int srcx, int srcy, int dstx, int dsty, u_int width, } else direction |= DST_X_LEFT_TO_RIGHT; - aty_WaitQueue(4); - aty_st_le32(DP_WRITE_MSK, 0x000000FF /* pGC->planemask */ ); - aty_st_le32(DP_MIX, (MIX_SRC << 16) | MIX_DST); - aty_st_le32(DP_SRC, FRGD_SRC_BLIT); - - aty_WaitQueue(5); - aty_st_le32(SRC_Y_X, (srcx << 16) | (srcy & 0x0000ffff)); - aty_st_le32(SRC_WIDTH1, width); - aty_st_le32(DST_CNTL, direction); - aty_st_le32(DST_Y_X, (dstx << 16) | (dsty & 0x0000ffff)); - aty_st_le32(DST_HEIGHT_WIDTH, (width << 16) | (height & 0x0000ffff)); - - aty_WaitIdleEmpty(); /* Make sure that all commands have finished */ - + wait_for_fifo(5, info); + aty_st_le32(DP_SRC, FRGD_SRC_BLIT, info); /* - * Make sure that the destination trajectory is correctly set - * for subsequent calls. MACH64_BIT_BLT is the only function that - * currently changes the destination trajectory from L->R and T->B. + * ++Geert: + * Warning: SRC_OFF_PITCH may be thrashed by writing to other registers + * (e.g. CRTC_H_TOTAL_DISP, DP_SRC, DP_FRGD_CLR) */ - aty_st_le32(DST_CNTL, (DST_X_LEFT_TO_RIGHT | DST_Y_TOP_TO_BOTTOM)); + aty_st_le32(SRC_OFF_PITCH, (pitch_value / 8) << 22, info); + aty_st_le32(SRC_Y_X, (srcx << 16) | srcy, info); + aty_st_le32(SRC_HEIGHT1_WIDTH1, (width << 16) | height, info); + aty_st_le32(DST_CNTL, direction, info); + draw_rect(dstx, dsty, width, height, info); } -void aty_rectfill(int dstx, int dsty, u_int width, u_int height, u_int color) +static inline void aty_rectfill(int dstx, int dsty, u_int width, u_int height, + u_int color, struct fb_info_aty *info) { if (!width || !height) return; - aty_WaitQueue(5); - aty_st_le32(DP_FRGD_CLR, color /* pGC->fgPixel */ ); - aty_st_le32(DP_WRITE_MSK, 0x000000FF /* pGC->planemask */ ); - aty_st_le32(DP_MIX, (MIX_SRC << 16) | MIX_DST); - aty_st_le32(DP_SRC, FRGD_SRC_FRGD_CLR); - - aty_st_le32(DST_CNTL, DST_X_LEFT_TO_RIGHT | DST_Y_TOP_TO_BOTTOM); - - aty_WaitQueue(2); - aty_st_le32(DST_Y_X, (((u_int)dstx << 16) | ((u_int)dsty & 0x0000ffff))); - aty_st_le32(DST_HEIGHT_WIDTH, (((u_int)width << 16) | height)); - - aty_WaitIdleEmpty(); /* Make sure that all commands have finished */ + wait_for_fifo(3, info); + aty_st_le32(DP_FRGD_CLR, color, info); + aty_st_le32(DP_SRC, BKGD_SRC_BKGD_CLR | FRGD_SRC_FRGD_CLR | MONO_SRC_ONE, + info); + aty_st_le32(DST_CNTL, DST_LAST_PEL | DST_Y_TOP_TO_BOTTOM | + DST_X_LEFT_TO_RIGHT, info); + draw_rect(dstx, dsty, width, height, info); } @@ -1593,8 +2193,8 @@ void aty_rectfill(int dstx, int dsty, u_int width, u_int height, u_int color) * Text console acceleration */ -static void fbcon_aty8_bmove(struct display *p, int sy, int sx, int dy, int dx, - int height, int width) +static void fbcon_aty_bmove(struct display *p, int sy, int sx, int dy, int dx, + int height, int width) { sx *= p->fontwidth; sy *= p->fontheight; @@ -1603,11 +2203,12 @@ static void fbcon_aty8_bmove(struct display *p, int sy, int sx, int dy, int dx, width *= p->fontwidth; height *= p->fontheight; - aty_rectcopy(sx, sy, dx, dy, width, height); + aty_rectcopy(sx, sy, dx, dy, width, height, + (struct fb_info_aty *)p->fb_info); } -static void fbcon_aty8_clear(struct vc_data *conp, struct display *p, int sy, - int sx, int height, int width) +static void fbcon_aty_clear(struct vc_data *conp, struct display *p, int sy, + int sx, int height, int width) { u32 bgx = attr_bgcol_ec(p, conp); bgx |= (bgx << 8); @@ -1618,38 +2219,85 @@ static void fbcon_aty8_clear(struct vc_data *conp, struct display *p, int sy, width *= p->fontwidth; height *= p->fontheight; - aty_rectfill(sx, sy, width, height, bgx); + aty_rectfill(sx, sy, width, height, bgx, + (struct fb_info_aty *)p->fb_info); } +#ifdef CONFIG_FBCON_CFB8 static void fbcon_aty8_putc(struct vc_data *conp, struct display *p, int c, int yy, int xx) { - aty_waitblit(); + wait_for_idle((struct fb_info_aty *)p->fb_info); fbcon_cfb8_putc(conp, p, c, yy, xx); } static void fbcon_aty8_putcs(struct vc_data *conp, struct display *p, const char *s, int count, int yy, int xx) { - aty_waitblit(); + wait_for_idle((struct fb_info_aty *)p->fb_info); fbcon_cfb8_putcs(conp, p, s, count, yy, xx); } static struct display_switch fbcon_aty8 = { - fbcon_cfb8_setup, fbcon_aty8_bmove, fbcon_aty8_clear, fbcon_aty8_putc, - fbcon_aty8_putcs, fbcon_cfb8_revc + fbcon_cfb8_setup, fbcon_aty_bmove, fbcon_aty_clear, fbcon_aty8_putc, + fbcon_aty8_putcs, fbcon_cfb8_revc, NULL }; +#endif + +#ifdef CONFIG_FBCON_CFB16 +static void fbcon_aty16_putc(struct vc_data *conp, struct display *p, int c, + int yy, int xx) +{ + wait_for_idle((struct fb_info_aty *)p->fb_info); + fbcon_cfb16_putc(conp, p, c, yy, xx); +} + +static void fbcon_aty16_putcs(struct vc_data *conp, struct display *p, + const char *s, int count, int yy, int xx) +{ + wait_for_idle((struct fb_info_aty *)p->fb_info); + fbcon_cfb16_putcs(conp, p, s, count, yy, xx); +} + +static struct display_switch fbcon_aty16 = { + fbcon_cfb16_setup, fbcon_aty_bmove, fbcon_aty_clear, fbcon_aty16_putc, + fbcon_aty16_putcs, fbcon_cfb16_revc, NULL +}; +#endif + +#ifdef CONFIG_FBCON_CFB32 +static void fbcon_aty32_putc(struct vc_data *conp, struct display *p, int c, + int yy, int xx) +{ + wait_for_idle((struct fb_info_aty *)p->fb_info); + fbcon_cfb32_putc(conp, p, c, yy, xx); +} + +static void fbcon_aty32_putcs(struct vc_data *conp, struct display *p, + const char *s, int count, int yy, int xx) +{ + wait_for_idle((struct fb_info_aty *)p->fb_info); + fbcon_cfb32_putcs(conp, p, s, count, yy, xx); +} + +static struct display_switch fbcon_aty32 = { + fbcon_cfb32_setup, fbcon_aty_bmove, fbcon_aty_clear, fbcon_aty32_putc, + fbcon_aty32_putcs, fbcon_cfb32_revc, NULL +}; +#endif #ifdef CONFIG_FB_COMPAT_XPMAC /* * Backward compatibility mode for Xpmac + * + * This should move to offb.c once this driver supports arbitrary video + * modes */ static int atyfb_console_setmode(struct vc_mode *mode, int doit) { - int err; struct fb_var_screeninfo var; struct atyfb_par par; int vmode, cmode; @@ -1674,12 +2322,9 @@ static int atyfb_console_setmode(struct vc_mode *mode, int doit) return -EINVAL; } init_par(&par, vmode, cmode); - encode_var(&var, &par); - if ((err = decode_var(&var, &par))) - return err; - if (doit) - atyfb_set_var(&var, currcon, 0); - return 0; + encode_var(&var, &par, (struct fb_info_aty *)console_fb_info); + var.activate = doit ? FB_ACTIVATE_NOW : FB_ACTIVATE_TEST; + return atyfb_set_var(&var, currcon, console_fb_info); } #endif /* CONFIG_FB_COMPAT_XPMAC */ diff --git a/drivers/video/compatcon.c b/drivers/video/compatcon.c new file mode 100644 index 000000000000..2c7549226857 --- /dev/null +++ b/drivers/video/compatcon.c @@ -0,0 +1,354 @@ +/* + * linux/drivers/video/compatcon.c -- Console wrapper + * + * Created 26 Apr 1998 by Geert Uytterhoeven + * + * This will be removed once there are frame buffer devices for all supported + * graphics hardware + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file COPYING in the main directory of this archive for + * more details. + */ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include + + + /* + * Interface used by the world + */ + +static const char *compatcon_startup(void); +static void compatcon_init(struct vc_data *conp); +static void compatcon_deinit(struct vc_data *conp); +static void compatcon_clear(struct vc_data *conp, int sy, int sx, int height, + int width); +static void compatcon_putc(struct vc_data *conp, int c, int ypos, int xpos); +static void compatcon_putcs(struct vc_data *conp, const char *s, int count, + int ypos, int xpos); +static void compatcon_cursor(struct vc_data *conp, int mode); +static void compatcon_scroll(struct vc_data *conp, int t, int b, int dir, + int count); +static void compatcon_bmove(struct vc_data *conp, int sy, int sx, int dy, + int dx, int height, int width); +static int compatcon_switch(struct vc_data *conp); +static int compatcon_blank(int blank); +static int compatcon_get_font(struct vc_data *conp, int *w, int *h, char *data); +static int compatcon_set_font(struct vc_data *conp, int w, int h, char *data); +static int compatcon_set_palette(struct vc_data *conp, unsigned char *table); +static int compatcon_scrolldelta(struct vc_data *conp, int lines); + + + /* + * Internal routines + */ + +#if 0 +static int compatcon_show_logo(void); +#endif + +unsigned long video_num_columns; +unsigned long video_num_lines; +unsigned long video_size_row; +unsigned char video_type; +unsigned long video_mem_base; +unsigned long video_mem_term; +unsigned long video_screen_size; +int can_do_color; + +extern void set_cursor(int currcons); +extern void hide_cursor(void); +extern int set_get_cmap(unsigned char *arg, int set); +extern void set_palette(void); +extern int set_get_font(unsigned char *arg, int set, int ch512); +extern void set_vesa_blanking(unsigned long arg); +extern void vesa_blank(void); +extern void vesa_powerdown(void); +extern int con_adjust_height(unsigned long fontheight); +extern void con_type_init(const char **); +extern void con_type_init_finish(void); + +#define BLANK 0x0020 + + +__initfunc(static const char *compatcon_startup(void)) +{ + const char *display_desc = "????"; + + video_num_lines = ORIG_VIDEO_LINES; + video_num_columns = ORIG_VIDEO_COLS; + video_size_row = 2*video_num_columns; + video_screen_size = video_num_lines*video_size_row; + + con_type_init(&display_desc); +#if 0 + if (!console_show_logo) + console_show_logo = compatcon_show_logo; +#endif + return display_desc; +} + + +static void compatcon_init(struct vc_data *conp) +{ + static int first = 1; + + conp->vc_cols = video_num_columns; + conp->vc_rows = video_num_lines; + conp->vc_can_do_color = can_do_color; + if (first) { + con_type_init_finish(); + first = 0; + } +} + +static void compatcon_deinit(struct vc_data *conp) +{ +} + + +static void compatcon_clear(struct vc_data *conp, int sy, int sx, int height, + int width) +{ + int rows; + unsigned long dest; + + if (console_blanked) + return; + + dest = video_mem_base+sy*video_size_row+sx*2; + if (sx == 0 && width == video_num_columns) + memsetw((void *)dest, conp->vc_video_erase_char, height*video_size_row); + else + for (rows = height; rows-- ; dest += video_size_row) + memsetw((void *)dest, conp->vc_video_erase_char, width*2); +} + + +static void compatcon_putc(struct vc_data *conp, int c, int ypos, int xpos) +{ + u16 *p; + + if (console_blanked) + return; + + p = (u16 *)(video_mem_base+ypos*video_size_row+xpos*2); + scr_writew(conp->vc_attr << 8 | c, p); +} + + +static void compatcon_putcs(struct vc_data *conp, const char *s, int count, + int ypos, int xpos) +{ + u16 *p; + u16 sattr; + + if (console_blanked) + return; + + p = (u16 *)(video_mem_base+ypos*video_size_row+xpos*2); + sattr = conp->vc_attr << 8; + while (count--) + scr_writew(sattr | ((int) (*s++) & 0xff), p++); +} + + +static void compatcon_cursor(struct vc_data *conp, int mode) +{ + switch (mode) { + case CM_ERASE: + hide_cursor(); + break; + + case CM_MOVE: + case CM_DRAW: + set_cursor(conp->vc_num); + break; + } +} + + +static void compatcon_scroll(struct vc_data *conp, int t, int b, int dir, + int count) +{ + if (console_blanked) + return; + + compatcon_cursor(conp, CM_ERASE); + + switch (dir) { + case SM_UP: + if (count > conp->vc_rows) /* Maximum realistic size */ + count = conp->vc_rows; + compatcon_bmove(conp, t+count, 0, t, 0, b-t-count, conp->vc_cols); + compatcon_clear(conp, b-count, 0, count, conp->vc_cols); + break; + + case SM_DOWN: + if (count > conp->vc_rows) /* Maximum realistic size */ + count = conp->vc_rows; + /* + * Fixed bmove() should end Arno's frustration with copying? + * Confucius says: + * Man who copies in wrong direction, end up with trashed + * data + */ + compatcon_bmove(conp, t, 0, t+count, 0, b-t-count, conp->vc_cols); + compatcon_clear(conp, t, 0, count, conp->vc_cols); + break; + + case SM_LEFT: + compatcon_bmove(conp, 0, t+count, 0, t, conp->vc_rows, b-t-count); + compatcon_clear(conp, 0, b-count, conp->vc_rows, count); + break; + + case SM_RIGHT: + compatcon_bmove(conp, 0, t, 0, t+count, conp->vc_rows, b-t-count); + compatcon_clear(conp, 0, t, conp->vc_rows, count); + break; + } +} + + +static inline void memmovew(u16 *to, u16 *from, unsigned int count) +{ + if ((unsigned long)to < (unsigned long)from) + memcpyw(to, from, count); + else { + count /= 2; + to += count; + from += count; + while (count) { + count--; + scr_writew(scr_readw(--from), --to); + } + } +} + +static void compatcon_bmove(struct vc_data *conp, int sy, int sx, int dy, + int dx, int height, int width) +{ + unsigned long src, dst; + int rows; + + if (console_blanked) + return; + + if (sx == 0 && dx == 0 && width == video_num_columns) { + src = video_mem_base+sy*video_size_row; + dst = video_mem_base+dy*video_size_row; + memmovew((u16 *)dst, (u16 *)src, height*video_size_row); + } else if (dy < sy || (dy == sy && dx < sx)) { + src = video_mem_base+sy*video_size_row+sx*2; + dst = video_mem_base+dy*video_size_row+dx*2; + for (rows = height; rows-- ;) { + memmovew((u16 *)dst, (u16 *)src, width*2); + src += video_size_row; + dst += video_size_row; + } + } else { + src = video_mem_base+(sy+height-1)*video_size_row+sx*2; + dst = video_mem_base+(dy+height-1)*video_size_row+dx*2; + for (rows = height; rows-- ;) { + memmovew((u16 *)dst, (u16 *)src, width*2); + src -= video_size_row; + dst -= video_size_row; + } + } +} + + +static int compatcon_switch(struct vc_data *conp) +{ + return 0; +} + + +static int compatcon_blank(int blank) +{ + if (blank) { + set_vesa_blanking(blank-1); + if (blank-1 == 0) + vesa_blank(); + else + vesa_powerdown(); + return 0; + } else { + /* Tell console.c that it has to restore the screen itself */ + return 1; + } + return 0; +} + + +static int compatcon_get_font(struct vc_data *conp, int *w, int *h, char *data) +{ + /* this is not supported: data already points to a kernel space copy */ + return -ENOSYS; +} + + +static int compatcon_set_font(struct vc_data *conp, int w, int h, char *data) +{ + /* this is not supported: data already points to a kernel space copy */ + return -ENOSYS; +} + +static int compatcon_set_palette(struct vc_data *conp, unsigned char *table) +{ + if (console_blanked || vt_cons[fg_console]->vc_mode == KD_GRAPHICS) + return -EINVAL; + set_palette(); + return 0; +} + +static int compatcon_scrolldelta(struct vc_data *conp, int lines) +{ + /* TODO */ + return -ENOSYS; +} + +#if 0 +__initfunc(static int compatcon_show_logo( void )) +{ + int height = 0; + char *p; + + printk(linux_serial_image); + for (p = linux_serial_image; *p; p++) + if (*p == '\n') + height++; + return height; +} +#endif + + + /* + * The console `switch' structure for the console wrapper + */ + +struct consw compat_con = { + compatcon_startup, compatcon_init, compatcon_deinit, compatcon_clear, + compatcon_putc, compatcon_putcs, compatcon_cursor, compatcon_scroll, + compatcon_bmove, compatcon_switch, compatcon_blank, compatcon_get_font, + compatcon_set_font, compatcon_set_palette, compatcon_scrolldelta +}; diff --git a/drivers/video/cyberfb.c b/drivers/video/cyberfb.c index c0767a0f0c46..51a4f6705cba 100644 --- a/drivers/video/cyberfb.c +++ b/drivers/video/cyberfb.c @@ -20,6 +20,7 @@ * for more details. */ + #include #include #include @@ -61,6 +62,7 @@ struct cyberfb_par { int xres; int yres; int bpp; + int accel; }; static struct cyberfb_par current_par; @@ -133,49 +135,49 @@ static struct fb_videomode cyberfb_predefined[] __initdata = { "640x480-8", { /* Cybervision 8 bpp */ 640, 480, 640, 480, 0, 0, 8, 0, {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0}, - 0, 0, -1, -1, FB_ACCEL_NONE, CYBER8_PIXCLOCK, 64, 96, 35, 12, 112, 2, + 0, 0, -1, -1, FB_ACCELF_TEXT, CYBER8_PIXCLOCK, 64, 96, 35, 12, 112, 2, FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED } }, { "800x600-8", { /* Cybervision 8 bpp */ 800, 600, 800, 600, 0, 0, 8, 0, {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0}, - 0, 0, -1, -1, FB_ACCEL_NONE, CYBER8_PIXCLOCK, 64, 96, 35, 12, 112, 2, + 0, 0, -1, -1, FB_ACCELF_TEXT, CYBER8_PIXCLOCK, 64, 96, 35, 12, 112, 2, FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED } }, { "1024x768-8", { /* Cybervision 8 bpp */ 1024, 768, 1024, 768, 0, 0, 8, 0, {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0}, - 0, 0, -1, -1, FB_ACCEL_NONE, CYBER8_PIXCLOCK, 64, 96, 35, 12, 112, 2, + 0, 0, -1, -1, FB_ACCELF_TEXT, CYBER8_PIXCLOCK, 64, 96, 35, 12, 112, 2, FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED } }, { "1152x886-8", { /* Cybervision 8 bpp */ 1152, 886, 1152, 886, 0, 0, 8, 0, {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0}, - 0, 0, -1, -1, FB_ACCEL_NONE, CYBER8_PIXCLOCK, 64, 96, 35, 12, 112, 2, + 0, 0, -1, -1, FB_ACCELF_TEXT, CYBER8_PIXCLOCK, 64, 96, 35, 12, 112, 2, FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED } }, { "1280x1024-8", { /* Cybervision 8 bpp */ 1280, 1024, 1280, 1024, 0, 0, 8, 0, {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0}, - 0, 0, -1, -1, FB_ACCEL_NONE, CYBER8_PIXCLOCK, 64, 96, 35, 12, 112, 2, + 0, 0, -1, -1, FB_ACCELF_TEXT, CYBER8_PIXCLOCK, 64, 96, 35, 12, 112, 2, FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED } }, { "1600x1200-8", { /* Cybervision 8 bpp */ 1600, 1200, 1600, 1200, 0, 0, 8, 0, {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0}, - 0, 0, -1, -1, FB_ACCEL_NONE, CYBER8_PIXCLOCK, 64, 96, 35, 12, 112, 2, + 0, 0, -1, -1, FB_ACCELF_TEXT, CYBER8_PIXCLOCK, 64, 96, 35, 12, 112, 2, FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED } }, { "800x600-16", { /* Cybervision 16 bpp */ 800, 600, 800, 600, 0, 0, 16, 0, {11, 5, 0}, {5, 6, 0}, {0, 5, 0}, {0, 0, 0}, - 0, 0, -1, -1, FB_ACCEL_NONE, CYBER16_PIXCLOCK, 64, 96, 35, 12, 112, 2, + 0, 0, -1, -1, FB_ACCELF_TEXT, CYBER16_PIXCLOCK, 64, 96, 35, 12, 112, 2, FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED } } @@ -371,12 +373,11 @@ static int Cyber_init(void) static int Cyber_encode_fix(struct fb_fix_screeninfo *fix, struct cyberfb_par *par) { - int i; - + memset(fix, 0, sizeof(struct fb_fix_screeninfo)); strcpy(fix->id, cyberfb_name); - fix->smem_start = (caddr_t)CyberMem; + fix->smem_start = (char *)CyberMem; fix->smem_len = CyberSize; - fix->mmio_start = (unsigned char *)CyberRegs; + fix->mmio_start = (char *)CyberRegs; fix->mmio_len = 0x10000; fix->type = FB_TYPE_PACKED_PIXELS; @@ -390,9 +391,7 @@ static int Cyber_encode_fix(struct fb_fix_screeninfo *fix, fix->ypanstep = 0; fix->ywrapstep = 0; fix->line_length = 0; - - for (i = 0; i < arraysize(fix->reserved); i++) - fix->reserved[i] = 0; + fix->accel = FB_ACCEL_S3_TRIO64; return(0); } @@ -410,6 +409,10 @@ static int Cyber_decode_var(struct fb_var_screeninfo *var, par->xres = var->xres; par->yres = var->yres; par->bpp = var->bits_per_pixel; + if (var->accel_flags & FB_ACCELF_TEXT) + par->accel = FB_ACCELF_TEXT; + else + par->accel = 0; #else if (Cyberfb_Cyber8) { par->xres = CYBER8_WIDTH; @@ -433,8 +436,6 @@ static int Cyber_decode_var(struct fb_var_screeninfo *var, static int Cyber_encode_var(struct fb_var_screeninfo *var, struct cyberfb_par *par) { - int i; - var->xres = par->xres; var->yres = par->yres; var->xres_virtual = par->xres; @@ -471,8 +472,7 @@ static int Cyber_encode_var(struct fb_var_screeninfo *var, var->height = -1; var->width = -1; - var->accel = FB_ACCEL_CYBERVISION; - DPRINTK("accel CV64\n"); + var->accel_flags = (par->accel && par->bpp == 8) ? FB_ACCELF_TEXT : 0; var->vmode = FB_VMODE_NONINTERLACED; @@ -490,9 +490,6 @@ static int Cyber_encode_var(struct fb_var_screeninfo *var, var->hsync_len = 112; var->vsync_len = 2; - for (i = 0; i < arraysize(var->reserved); i++) - var->reserved[i] = 0; - return(0); } @@ -847,7 +844,7 @@ static void cyberfb_set_disp(int con, struct fb_info *info) cyberfb_get_fix(&fix, con, info); if (con == -1) con = 0; - display->screen_base = (u_char *)fix.smem_start; + display->screen_base = fix.smem_start; display->visual = fix.visual; display->type = fix.type; display->type_aux = fix.type_aux; @@ -858,7 +855,11 @@ static void cyberfb_set_disp(int con, struct fb_info *info) switch (display->var.bits_per_pixel) { #ifdef CONFIG_FBCON_CFB8 case 8: - display->dispsw = &fbcon_cyber8; + if (display->var.accel_flags & FB_ACCELF_TEXT) { + display->dispsw = &fbcon_cyber8; +#warning FIXME: We should reinit the graphics engine here + } else + display->dispsw = &fbcon_cfb8; break; #endif #ifdef CONFIG_FBCON_CFB16 @@ -880,7 +881,7 @@ static void cyberfb_set_disp(int con, struct fb_info *info) static int cyberfb_set_var(struct fb_var_screeninfo *var, int con, struct fb_info *info) { - int err, oldxres, oldyres, oldvxres, oldvyres, oldbpp; + int err, oldxres, oldyres, oldvxres, oldvyres, oldbpp, oldaccel; if ((err = do_fb_set_var(var, con == currcon))) return(err); @@ -890,11 +891,13 @@ static int cyberfb_set_var(struct fb_var_screeninfo *var, int con, oldvxres = fb_display[con].var.xres_virtual; oldvyres = fb_display[con].var.yres_virtual; oldbpp = fb_display[con].var.bits_per_pixel; + oldaccel = fb_display[con].var.accel_flags; fb_display[con].var = *var; if (oldxres != var->xres || oldyres != var->yres || oldvxres != var->xres_virtual || oldvyres != var->yres_virtual || - oldbpp != var->bits_per_pixel) { + oldbpp != var->bits_per_pixel || + oldaccel != var->accel_flags) { cyberfb_set_disp(con, info); (*fb_info.changevar)(con); fb_alloc_cmap(&fb_display[con].cmap, 0, 0); @@ -975,7 +978,7 @@ static int cyberfb_ioctl(struct inode *inode, struct file *file, static struct fb_ops cyberfb_ops = { cyberfb_open, cyberfb_release, cyberfb_get_fix, cyberfb_get_var, cyberfb_set_var, cyberfb_get_cmap, cyberfb_set_cmap, - cyberfb_pan_display, NULL, cyberfb_ioctl + cyberfb_pan_display, cyberfb_ioctl }; @@ -1175,7 +1178,7 @@ static void fbcon_cyber8_revc(struct display *p, int xx, int yy) static struct display_switch fbcon_cyber8 = { fbcon_cfb8_setup, fbcon_cyber8_bmove, fbcon_cyber8_clear, fbcon_cyber8_putc, - fbcon_cyber8_putcs, fbcon_cyber8_revc + fbcon_cyber8_putcs, fbcon_cyber8_revc, NULL }; #endif @@ -1183,7 +1186,7 @@ static struct display_switch fbcon_cyber8 = { #ifdef MODULE int init_module(void) { - return(cyberfb_init(NULL)); + return cyberfb_init(NULL); } void cleanup_module(void) diff --git a/drivers/video/dnfb.c b/drivers/video/dnfb.c index db0a6172f0f1..1c7b814f0cc5 100644 --- a/drivers/video/dnfb.c +++ b/drivers/video/dnfb.c @@ -142,7 +142,7 @@ static struct display disp[MAX_NR_CONSOLES]; static struct fb_info fb_info; static struct fb_ops dnfb_ops = { dnfb_open,dnfb_release, dnfb_get_fix, dnfb_get_var, dnfb_set_var, - dnfb_get_cmap, dnfb_set_cmap, dnfb_pan_display, NULL, dnfb_ioctl + dnfb_get_cmap, dnfb_set_cmap, dnfb_pan_display, dnfb_ioctl }; static int currcon=0; @@ -187,6 +187,7 @@ static int dnfb_get_fix(struct fb_fix_screeninfo *fix, int con, static int dnfb_get_var(struct fb_var_screeninfo *var, int con, struct fb_info *info) { + memset(var, 0, sizeof(struct fb_var_screeninfo)); var->xres=1280; var->yres=1024; var->xres_virtual=2048; @@ -206,7 +207,6 @@ static int dnfb_get_var(struct fb_var_screeninfo *var, int con, var->vsync_len=0; var->sync=0; var->vmode=FB_VMODE_NONINTERLACED; - var->accel=FB_ACCEL_NONE; return 0; @@ -249,8 +249,6 @@ static int dnfb_set_var(struct fb_var_screeninfo *var, int con, return -EINVAL; if(var->vmode!=FB_VMODE_NONINTERLACED) return -EINVAL; - if(var->accel!=FB_ACCEL_NONE) - return -EINVAL; return 0; @@ -297,7 +295,7 @@ static void dnfb_set_disp(int con, struct fb_info *info) if(con==-1) con=0; - disp[con].screen_base = (u_char *)fix.smem_start; + disp[con].screen_base = fix.smem_start; disp[con].visual = fix.visual; disp[con].type = fix.type; disp[con].type_aux = fix.type_aux; diff --git a/drivers/video/fbcon-afb.c b/drivers/video/fbcon-afb.c index efe9833cb1ff..5b29db163ff4 100644 --- a/drivers/video/fbcon-afb.c +++ b/drivers/video/fbcon-afb.c @@ -414,7 +414,7 @@ void fbcon_afb_revc(struct display *p, int xx, int yy) struct display_switch fbcon_afb = { fbcon_afb_setup, fbcon_afb_bmove, fbcon_afb_clear, fbcon_afb_putc, - fbcon_afb_putcs, fbcon_afb_revc + fbcon_afb_putcs, fbcon_afb_revc, NULL }; diff --git a/drivers/video/fbcon-cfb16.c b/drivers/video/fbcon-cfb16.c index 475095988264..aeef4ba9724e 100644 --- a/drivers/video/fbcon-cfb16.c +++ b/drivers/video/fbcon-cfb16.c @@ -37,7 +37,7 @@ static u32 tab_cfb16[] = { void fbcon_cfb16_setup(struct display *p) { - p->next_line = p->var.xres_virtual<<1; + p->next_line = p->line_length ? p->line_length : p->var.xres_virtual<<1; p->next_plane = 0; } @@ -181,7 +181,7 @@ void fbcon_cfb16_revc(struct display *p, int xx, int yy) struct display_switch fbcon_cfb16 = { fbcon_cfb16_setup, fbcon_cfb16_bmove, fbcon_cfb16_clear, fbcon_cfb16_putc, - fbcon_cfb16_putcs, fbcon_cfb16_revc + fbcon_cfb16_putcs, fbcon_cfb16_revc, NULL }; diff --git a/drivers/video/fbcon-cfb2.c b/drivers/video/fbcon-cfb2.c index 6ed68e89d545..fd05c8b139f4 100644 --- a/drivers/video/fbcon-cfb2.c +++ b/drivers/video/fbcon-cfb2.c @@ -187,7 +187,7 @@ void fbcon_cfb2_revc(struct display *p, int xx, int yy) struct display_switch fbcon_cfb2 = { fbcon_cfb2_setup, fbcon_cfb2_bmove, fbcon_cfb2_clear, fbcon_cfb2_putc, - fbcon_cfb2_putcs, fbcon_cfb2_revc + fbcon_cfb2_putcs, fbcon_cfb2_revc, NULL }; diff --git a/drivers/video/fbcon-cfb24.c b/drivers/video/fbcon-cfb24.c index 2a95a28cf1ef..6421abdcdd99 100644 --- a/drivers/video/fbcon-cfb24.c +++ b/drivers/video/fbcon-cfb24.c @@ -108,7 +108,9 @@ static inline void store4pixels(u32 d1, u32 d2, u32 d3, u32 d4, u32 *dest) *dest++ = (d2<<16) | (d3>>8); *dest++ = (d3<<24) | d4; #elif defined(__LITTLE_ENDIAN) -#error Please add support for little endian byteorder + *dest++ = (d1<<8) | (d2>>16); + *dest++ = (d2<<16) | (d3>>8); + *dest++ = (d3<<24) | d4; #else #error FIXME: No endianness?? #endif @@ -202,7 +204,7 @@ void fbcon_cfb24_revc(struct display *p, int xx, int yy) struct display_switch fbcon_cfb24 = { fbcon_cfb24_setup, fbcon_cfb24_bmove, fbcon_cfb24_clear, fbcon_cfb24_putc, - fbcon_cfb24_putcs, fbcon_cfb24_revc + fbcon_cfb24_putcs, fbcon_cfb24_revc, NULL }; diff --git a/drivers/video/fbcon-cfb32.c b/drivers/video/fbcon-cfb32.c index cedc0481407c..90e78d4d8868 100644 --- a/drivers/video/fbcon-cfb32.c +++ b/drivers/video/fbcon-cfb32.c @@ -186,7 +186,7 @@ void fbcon_cfb32_revc(struct display *p, int xx, int yy) struct display_switch fbcon_cfb32 = { fbcon_cfb32_setup, fbcon_cfb32_bmove, fbcon_cfb32_clear, fbcon_cfb32_putc, - fbcon_cfb32_putcs, fbcon_cfb32_revc + fbcon_cfb32_putcs, fbcon_cfb32_revc, NULL }; diff --git a/drivers/video/fbcon-cfb4.c b/drivers/video/fbcon-cfb4.c index 8df0656950ec..2d10dae7309f 100644 --- a/drivers/video/fbcon-cfb4.c +++ b/drivers/video/fbcon-cfb4.c @@ -190,7 +190,7 @@ void fbcon_cfb4_revc(struct display *p, int xx, int yy) struct display_switch fbcon_cfb4 = { fbcon_cfb4_setup, fbcon_cfb4_bmove, fbcon_cfb4_clear, fbcon_cfb4_putc, - fbcon_cfb4_putcs, fbcon_cfb4_revc + fbcon_cfb4_putcs, fbcon_cfb4_revc, NULL }; diff --git a/drivers/video/fbcon-cfb8.c b/drivers/video/fbcon-cfb8.c index dcd3ebd97640..40155918e922 100644 --- a/drivers/video/fbcon-cfb8.c +++ b/drivers/video/fbcon-cfb8.c @@ -41,7 +41,7 @@ static u32 nibbletab_cfb8[] = { void fbcon_cfb8_setup(struct display *p) { - p->next_line = p->var.xres_virtual; + p->next_line = p->line_length ? p->line_length : p->var.xres_virtual; p->next_plane = 0; } @@ -178,7 +178,7 @@ void fbcon_cfb8_revc(struct display *p, int xx, int yy) struct display_switch fbcon_cfb8 = { fbcon_cfb8_setup, fbcon_cfb8_bmove, fbcon_cfb8_clear, fbcon_cfb8_putc, - fbcon_cfb8_putcs, fbcon_cfb8_revc + fbcon_cfb8_putcs, fbcon_cfb8_revc, NULL }; diff --git a/drivers/video/fbcon-ilbm.c b/drivers/video/fbcon-ilbm.c index 82f9982f6410..0cba5b92aacc 100644 --- a/drivers/video/fbcon-ilbm.c +++ b/drivers/video/fbcon-ilbm.c @@ -262,7 +262,7 @@ void fbcon_ilbm_revc(struct display *p, int xx, int yy) struct display_switch fbcon_ilbm = { fbcon_ilbm_setup, fbcon_ilbm_bmove, fbcon_ilbm_clear, fbcon_ilbm_putc, - fbcon_ilbm_putcs, fbcon_ilbm_revc + fbcon_ilbm_putcs, fbcon_ilbm_revc, NULL }; diff --git a/drivers/video/fbcon-iplan2p2.c b/drivers/video/fbcon-iplan2p2.c index b287edc4debc..576a8e5a0c41 100644 --- a/drivers/video/fbcon-iplan2p2.c +++ b/drivers/video/fbcon-iplan2p2.c @@ -14,7 +14,6 @@ #include #include #include -#include #include #include @@ -376,7 +375,7 @@ void fbcon_iplan2p2_revc(struct display *p, int xx, int yy) struct display_switch fbcon_iplan2p2 = { fbcon_iplan2p2_setup, fbcon_iplan2p2_bmove, fbcon_iplan2p2_clear, - fbcon_iplan2p2_putc, fbcon_iplan2p2_putcs, fbcon_iplan2p2_revc + fbcon_iplan2p2_putc, fbcon_iplan2p2_putcs, fbcon_iplan2p2_revc, NULL }; diff --git a/drivers/video/fbcon-iplan2p4.c b/drivers/video/fbcon-iplan2p4.c index f05b7d4a153e..5db5178b1fa2 100644 --- a/drivers/video/fbcon-iplan2p4.c +++ b/drivers/video/fbcon-iplan2p4.c @@ -14,7 +14,6 @@ #include #include #include -#include #include #include @@ -396,7 +395,7 @@ void fbcon_iplan2p4_revc(struct display *p, int xx, int yy) struct display_switch fbcon_iplan2p4 = { fbcon_iplan2p4_setup, fbcon_iplan2p4_bmove, fbcon_iplan2p4_clear, - fbcon_iplan2p4_putc, fbcon_iplan2p4_putcs, fbcon_iplan2p4_revc + fbcon_iplan2p4_putc, fbcon_iplan2p4_putcs, fbcon_iplan2p4_revc, NULL }; diff --git a/drivers/video/fbcon-iplan2p8.c b/drivers/video/fbcon-iplan2p8.c index 5ea15c26b3d3..5e177b6d7e98 100644 --- a/drivers/video/fbcon-iplan2p8.c +++ b/drivers/video/fbcon-iplan2p8.c @@ -14,7 +14,6 @@ #include #include #include -#include #include #include @@ -433,7 +432,7 @@ void fbcon_iplan2p8_revc(struct display *p, int xx, int yy) struct display_switch fbcon_iplan2p8 = { fbcon_iplan2p8_setup, fbcon_iplan2p8_bmove, fbcon_iplan2p8_clear, - fbcon_iplan2p8_putc, fbcon_iplan2p8_putcs, fbcon_iplan2p8_revc + fbcon_iplan2p8_putc, fbcon_iplan2p8_putcs, fbcon_iplan2p8_revc, NULL }; diff --git a/drivers/video/fbcon-mac.c b/drivers/video/fbcon-mac.c index 5518e5defcf1..0869f12a1a46 100644 --- a/drivers/video/fbcon-mac.c +++ b/drivers/video/fbcon-mac.c @@ -495,7 +495,7 @@ static int get_pixel_mac(struct display *p, int pixel_x, int pixel_y) struct display_switch fbcon_mac = { fbcon_mac_setup, fbcon_mac_bmove, fbcon_mac_clear, fbcon_mac_putc, - fbcon_mac_putcs, fbcon_mac_revc + fbcon_mac_putcs, fbcon_mac_revc, NULL }; diff --git a/drivers/video/fbcon-mfb.c b/drivers/video/fbcon-mfb.c index 60ef11221eec..66622b8f8cfe 100644 --- a/drivers/video/fbcon-mfb.c +++ b/drivers/video/fbcon-mfb.c @@ -155,7 +155,7 @@ void fbcon_mfb_revc(struct display *p, int xx, int yy) struct display_switch fbcon_mfb = { fbcon_mfb_setup, fbcon_mfb_bmove, fbcon_mfb_clear, fbcon_mfb_putc, - fbcon_mfb_putcs, fbcon_mfb_revc + fbcon_mfb_putcs, fbcon_mfb_revc, NULL }; diff --git a/drivers/video/fbcon-vga.c b/drivers/video/fbcon-vga.c new file mode 100644 index 000000000000..07f55d599bc5 --- /dev/null +++ b/drivers/video/fbcon-vga.c @@ -0,0 +1,190 @@ +/* + * linux/drivers/video/fbcon-vga.c -- Low level frame buffer operations for + * VGA characters/attributes + * + * Created 28 Mar 1998 by Geert Uytterhoeven + * Monochrome attributes added May 1998 by Andrew Apted + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file COPYING in the main directory of this archive for + * more details. + */ + +#include +#include +#include +#include +#include + +#include + +#include "fbcon.h" +#include "fbcon-vga.h" + + + /* + * VGA screen access + */ + +static inline void vga_writew(u16 val, u16 *addr) +{ +#ifdef __powerpc__ + st_le16(addr, val); +#else + writew(val, (unsigned long)addr); +#endif /* !__powerpc__ */ +} + +static inline u16 vga_readw(u16 *addr) +{ +#ifdef __powerpc__ + return ld_le16(addr); +#else + return readw((unsigned long)addr); +#endif /* !__powerpc__ */ +} + +static inline void vga_memsetw(void *s, u16 c, unsigned int count) +{ + u16 *addr = (u16 *)s; + + while (count) { + count--; + vga_writew(c, addr++); + } +} + +static inline void vga_memmovew(u16 *to, u16 *from, unsigned int count) +{ + if (to < from) { + while (count) { + count--; + vga_writew(vga_readw(from++), to++); + } + } else { + from += count; + to += count; + while (count) { + count--; + vga_writew(vga_readw(--from), --to); + } + } +} + + + /* + * VGA characters/attributes + */ + +static inline u16 fbcon_vga_attr(struct display *p, + struct vc_data *conp) +{ + if (conp->vc_can_do_color) { + return conp->vc_attr << 8; + } + + /* Underline and reverse-video are mutually exclusive on MDA. + * Since reverse-video is used for cursors and selected areas, + * it takes precedence. + */ + + return (attr_reverse(p, conp) ? 0x7000 : + (attr_underline(p, conp) ? 0x0100 : 0x0700)) | + (attr_bold(p, conp) ? 0x0800 : 0) | + (attr_blink(p, conp) ? 0x8000 : 0); +} + +void fbcon_vga_setup(struct display *p) +{ + p->next_line = p->line_length; + p->next_plane = 0; +} + +void fbcon_vga_bmove(struct display *p, int sy, int sx, int dy, int dx, + int height, int width) +{ + u16 *src, *dst; + int rows; + + if (sx == 0 && dx == 0 && width == p->next_line/2) { + src = (u16 *)(p->screen_base+sy*p->next_line); + dst = (u16 *)(p->screen_base+dy*p->next_line); + vga_memmovew(dst, src, height*width); + } else if (dy < sy || (dy == sy && dx < sx)) { + src = (u16 *)(p->screen_base+sy*p->next_line+sx*2); + dst = (u16 *)(p->screen_base+dy*p->next_line+dx*2); + for (rows = height; rows-- ;) { + vga_memmovew(dst, src, width); + src += p->next_line/2; + dst += p->next_line/2; + } + } else { + src = (u16 *)(p->screen_base+(sy+height-1)*p->next_line+sx*2); + dst = (u16 *)(p->screen_base+(dy+height-1)*p->next_line+dx*2); + for (rows = height; rows-- ;) { + vga_memmovew(dst, src, width); + src -= p->next_line/2; + dst -= p->next_line/2; + } + } +} + +void fbcon_vga_clear(struct vc_data *conp, struct display *p, int sy, int sx, + int height, int width) +{ + u16 *dest = (u16 *)(p->screen_base+sy*p->next_line+sx*2); + int rows; + + if (sx == 0 && width*2 == p->next_line) + vga_memsetw(dest, conp->vc_video_erase_char, height*width); + else + for (rows = height; rows-- ; dest += p->next_line/2) + vga_memsetw(dest, conp->vc_video_erase_char, width); +} + +void fbcon_vga_putc(struct vc_data *conp, struct display *p, int c, int y, + int x) +{ + u16 *dst = (u16 *)(p->screen_base+y*p->next_line+x*2); + vga_writew(fbcon_vga_attr(p, conp) | (c & 0xff), dst); +} + +void fbcon_vga_putcs(struct vc_data *conp, struct display *p, const char *s, + int count, int y, int x) +{ + u16 *dst = (u16 *)(p->screen_base+y*p->next_line+x*2); + u16 sattr = fbcon_vga_attr(p, conp); + while (count--) + vga_writew(sattr | ((int) (*s++) & 0xff), dst++); +} + +void fbcon_vga_revc(struct display *p, int x, int y) +{ + u16 *dst = (u16 *)(p->screen_base+y*p->next_line+x*2); + u16 val = vga_readw(dst); + val = (val & 0x88ff) | ((val<<4) & 0x7000) | ((val>>4) & 0x0700); + vga_writew(val, dst); +} + + + /* + * `switch' for the low level operations + */ + +struct display_switch fbcon_vga = { + fbcon_vga_setup, fbcon_vga_bmove, fbcon_vga_clear, fbcon_vga_putc, + fbcon_vga_putcs, fbcon_vga_revc, NULL +}; + + + /* + * Visible symbols for modules + */ + +EXPORT_SYMBOL(fbcon_vga); +EXPORT_SYMBOL(fbcon_vga_setup); +EXPORT_SYMBOL(fbcon_vga_bmove); +EXPORT_SYMBOL(fbcon_vga_clear); +EXPORT_SYMBOL(fbcon_vga_putc); +EXPORT_SYMBOL(fbcon_vga_putcs); +EXPORT_SYMBOL(fbcon_vga_revc); diff --git a/drivers/video/fbcon-vga.h b/drivers/video/fbcon-vga.h new file mode 100644 index 000000000000..e7906575a354 --- /dev/null +++ b/drivers/video/fbcon-vga.h @@ -0,0 +1,15 @@ + /* + * VGA characters/attributes + */ + +extern struct display_switch fbcon_vga; +extern void fbcon_vga_setup(struct display *p); +extern void fbcon_vga_bmove(struct display *p, int sy, int sx, int dy, int dx, + int height, int width); +extern void fbcon_vga_clear(struct vc_data *conp, struct display *p, int sy, + int sx, int height, int width); +extern void fbcon_vga_putc(struct vc_data *conp, struct display *p, int c, + int yy, int xx); +extern void fbcon_vga_putcs(struct vc_data *conp, struct display *p, + const char *s, int count, int yy, int xx); +extern void fbcon_vga_revc(struct display *p, int xx, int yy); diff --git a/drivers/video/fbcon.c b/drivers/video/fbcon.c index a41bf081d7bd..e0e0355cc7c8 100644 --- a/drivers/video/fbcon.c +++ b/drivers/video/fbcon.c @@ -24,6 +24,8 @@ * Martin Schaller * Andreas Schwab * + * Hardware cursor support added by Emmanuel Marty (core@ggi-project.org) + * * * The low level operations for the various display memory organizations are * now in separate source files. @@ -39,7 +41,6 @@ * To do: * * - Implement 16 plane mode (iplan2p16) - * - Hardware cursor * * * This file is subject to the terms and conditions of the GNU General Public @@ -82,7 +83,7 @@ #ifdef CONFIG_MAC #include #endif -#ifdef __mc68000__ +#if defined(__mc68000__) || defined(CONFIG_APUS) #include #include #endif @@ -101,8 +102,13 @@ struct display fb_display[MAX_NR_CONSOLES]; -/* ++Geert: Sorry, no hardware cursor support at the moment; - use Atari alike software cursor */ +/* + * Emmanuel: fbcon will now use a hardware cursor if the + * low-level driver provides a non-NULL dispsw->cursor pointer, + * in which case the hardware should do blinking, etc. + * + * if dispsw->cursor is NULL, use Atari alike software cursor + */ #if FLASHING_CURSOR static int cursor_drawn = 0; @@ -164,8 +170,7 @@ static int fbcon_blank(int blank); static int fbcon_get_font(struct vc_data *conp, int *w, int *h, char *data); static int fbcon_set_font(struct vc_data *conp, int w, int h, char *data); static int fbcon_set_palette(struct vc_data *conp, unsigned char *table); -static int fbcon_scrolldelta(int lines); -static int fbcon_set_mode(struct vc_data *conp, int mode); +static int fbcon_scrolldelta(struct vc_data *conp, int lines); /* @@ -527,26 +532,35 @@ static void fbcon_cursor(struct vc_data *conp, int mode) int unit = conp->vc_num; struct display *p = &fb_display[unit]; + /* do we have a hardware cursor ? */ + if (p->dispsw->cursor) { + p->cursor_x = conp->vc_x; + p->cursor_y = conp->vc_y; + p->dispsw->cursor(p, mode, p->cursor_x, real_y(p, p->cursor_y)); + return; + } + /* Avoid flickering if there's no real change. */ if (p->cursor_x == conp->vc_x && p->cursor_y == conp->vc_y && (mode == CM_ERASE) == !cursor_on) return; - if (CURSOR_UNDRAWN ()) - p->dispsw->revc(p, p->cursor_x, real_y(p, p->cursor_y)); - p->cursor_x = conp->vc_x; - p->cursor_y = conp->vc_y; - - switch (mode) { - case CM_ERASE: - cursor_on = 0; - break; - case CM_MOVE: - case CM_DRAW: - vbl_cursor_cnt = CURSOR_DRAW_DELAY; - cursor_on = 1; - break; - } + if (CURSOR_UNDRAWN ()) + p->dispsw->revc(p, p->cursor_x, real_y(p, p->cursor_y)); + p->cursor_x = conp->vc_x; + p->cursor_y = conp->vc_y; + + switch (mode) { + case CM_ERASE: + cursor_on = 0; + break; + + case CM_MOVE: + case CM_DRAW: + vbl_cursor_cnt = CURSOR_DRAW_DELAY; + cursor_on = 1; + break; + } } @@ -642,9 +656,10 @@ static __inline__ void ypan_down(int unit, struct vc_data *conp, { p->yscroll -= count; if (p->yscroll < 0) { - p->yscroll = p->vrows-conp->vc_rows; - p->dispsw->bmove(p, 0, 0, p->yscroll+count, 0, conp->vc_rows-count, - conp->vc_cols); + p->dispsw->bmove(p, p->yscroll + count, 0, + p->vrows - conp->vc_rows + count, 0, + conp->vc_rows - count, conp->vc_cols); + p->yscroll = p->vrows - conp->vc_rows; } p->var.xoffset = 0; p->var.yoffset = p->yscroll*p->fontheight; @@ -1051,13 +1066,14 @@ static int fbcon_set_palette(struct vc_data *conp, unsigned char *table) val = conp->vc_palette[j++]; palette_blue[k] = (val<<8)|val; } - palette_cmap.len = 1<var.bits_per_pixel; - if (palette_cmap.len > 16) + if (p->var.bits_per_pixel <= 4) + palette_cmap.len = 1<var.bits_per_pixel; + else palette_cmap.len = 16; return p->fb_info->fbops->fb_set_cmap(&palette_cmap, 1, unit, p->fb_info); } -static int fbcon_scrolldelta(int lines) +static int fbcon_scrolldelta(struct vc_data *conp, int lines) { #if SUPPORT_SCROLLBACK int unit = fg_console; /* xxx */ @@ -1092,20 +1108,6 @@ static int fbcon_scrolldelta(int lines) } - /* - * Switch between `text' (emulated and accelerated) and `graphics' - * (unaccelerated text) mode - */ - -static int fbcon_set_mode(struct vc_data *conp, int mode) -{ - struct display *p = &fb_display[conp->vc_num]; - struct fb_ops *ops = p->fb_info->fbops; - - return ops->fb_set_mode ? ops->fb_set_mode(mode, p->fb_info) : 0; -} - - #define LOGO_H 80 #define LOGO_W 80 #define LOGO_LINE (LOGO_W/8) @@ -1120,15 +1122,20 @@ __initfunc(static int fbcon_show_logo( void )) unsigned char *dst, *src; int i, j, n, x1, y1; int logo_depth, done = 0; - - /* Set colors if visual is PSEUDOCOLOR and we have enough colors */ - if (p->visual == FB_VISUAL_PSEUDOCOLOR && depth >= 4) { - int first_col = depth >= 8 ? 32 : depth > 4 ? 16 : 0; - int num_cols = depth >= 8 ? LINUX_LOGO_COLORS : 16; + + /* Set colors if visual is PSEUDOCOLOR and we have enough colors, or for + * TRUECOLOR */ + if ((p->visual == FB_VISUAL_PSEUDOCOLOR && depth >= 4) || + p->visual == FB_VISUAL_TRUECOLOR) { + int is_truecolor = (p->visual == FB_VISUAL_TRUECOLOR); + int use_256 = (!is_truecolor && depth >= 8) || + (is_truecolor && depth >= 24); + int first_col = use_256 ? 32 : depth > 4 ? 16 : 0; + int num_cols = use_256 ? LINUX_LOGO_COLORS : 16; unsigned char *red, *green, *blue; int old_cmap_len; - if (depth >= 8) { + if (use_256) { red = linux_logo_red; green = linux_logo_green; blue = linux_logo_blue; @@ -1142,7 +1149,7 @@ __initfunc(static int fbcon_show_logo( void )) /* dirty trick to avoid setcmap calling kmalloc which isn't * initialized yet... */ old_cmap_len = fb_display[fg_console].cmap.len; - fb_display[fg_console].cmap.len = 1 << depth; + fb_display[fg_console].cmap.len = 1 << (depth/(is_truecolor ? 3 : 1)); for( i = 0; i < num_cols; i += n ) { n = num_cols - i; @@ -1161,7 +1168,7 @@ __initfunc(static int fbcon_show_logo( void )) } fb_display[fg_console].cmap.len = old_cmap_len; } - + if (depth >= 8) { logo = linux_logo; logo_depth = 8; @@ -1194,10 +1201,14 @@ __initfunc(static int fbcon_show_logo( void )) for( y1 = 0; y1 < LOGO_H; y1++ ) { dst = fb + y1*line; for( x1 = 0; x1 < LOGO_W; x1++, src++ ) { - val = ((linux_logo_red[*src] & redmask) << redshift) | - ((linux_logo_green[*src] & greenmask) << greenshift) | - ((linux_logo_blue[*src] & bluemask) << blueshift); + val = (*src << redshift) | + (*src << greenshift) | + (*src << blueshift); +#ifdef __LITTLE_ENDIAN + for( i = 0; i < bdepth; ++i ) +#else for( i = bdepth-1; i >= 0; --i ) +#endif *dst++ = val >> (i*8); } } @@ -1251,10 +1262,14 @@ __initfunc(static int fbcon_show_logo( void )) for( y1 = 0; y1 < LOGO_H; y1++ ) { dst = fb + y1*line; for( x1 = 0; x1 < LOGO_W; x1++, src++ ) { - val = ((linux_logo_red[*src] & redmask) << redshift) | - ((linux_logo_green[*src] & greenmask) << greenshift) | - ((linux_logo_blue[*src] & bluemask) << blueshift); + val = ((linux_logo_red[*src-32] & redmask) << redshift) | + ((linux_logo_green[*src-32] & greenmask) << greenshift) | + ((linux_logo_blue[*src-32] & bluemask) << blueshift); +#ifdef __LITTLE_ENDIAN for( i = 0; i < bdepth; ++i ) +#else + for( i = bdepth-1; i >= 0; --i ) +#endif *dst++ = val >> (i*8); } } @@ -1328,7 +1343,9 @@ __initfunc(static int fbcon_show_logo( void )) #endif #if defined(CONFIG_FBCON_MFB) || defined(CONFIG_FBCON_AFB) || \ defined(CONFIG_FBCON_ILBM) - if (depth == 1) { + if (depth == 1 && (p->type == FB_TYPE_PACKED_PIXELS || + p->type == FB_TYPE_PLANES || + p->type == FB_TYPE_INTERLEAVED_PLANES)) { /* monochrome */ unsigned char inverse = p->inverse ? 0x00 : 0xff; @@ -1342,6 +1359,21 @@ __initfunc(static int fbcon_show_logo( void )) done = 1; } +#endif +#ifdef CONFIG_FBCON_VGA + if (depth == 1 && p->type == FB_TYPE_VGA_TEXT) { + + int height = 0; + char *p; + + printk(linux_mda_image); + + for (p = linux_mda_image; *p; p++) + if (*p == '\n') + height++; + + return height; + } #endif /* Modes not yet supported: packed pixels with depth != 8 (does such a * thing exist in reality?) */ @@ -1359,7 +1391,7 @@ struct consw fb_con = { fbcon_startup, fbcon_init, fbcon_deinit, fbcon_clear, fbcon_putc, fbcon_putcs, fbcon_cursor, fbcon_scroll, fbcon_bmove, fbcon_switch, fbcon_blank, fbcon_get_font, fbcon_set_font, fbcon_set_palette, - fbcon_scrolldelta, fbcon_set_mode + fbcon_scrolldelta }; @@ -1376,6 +1408,7 @@ static struct display_switch fbcon_dummy = { (void *)fbcon_dummy_op, /* fbcon_dummy_putc */ (void *)fbcon_dummy_op, /* fbcon_dummy_putcs */ (void *)fbcon_dummy_op, /* fbcon_dummy_revc */ + NULL, /* fbcon_dummy_cursor */ }; diff --git a/drivers/video/fbcon.h b/drivers/video/fbcon.h index 4868b7730da5..84e14ce2181e 100644 --- a/drivers/video/fbcon.h +++ b/drivers/video/fbcon.h @@ -29,6 +29,7 @@ struct display_switch { void (*putcs)(struct vc_data *conp, struct display *p, const char *s, int count, int yy, int xx); void (*revc)(struct display *p, int xx, int yy); + void (*cursor)(struct display *p, int mode, int xx, int yy); }; @@ -45,12 +46,14 @@ struct display_switch { (((conp)->vc_video_erase_char >> ((p)->inverse ? 8 : 12)) & 0x0f) /* Monochrome */ -#define attr_bold(p,conp) \ - (((conp)->vc_attr & 3) == 2) -#define attr_reverse(p,conp) \ +#define attr_bold(p,conp) \ + ((conp)->vc_attr & 2) +#define attr_reverse(p,conp) \ (((conp)->vc_attr & 8) ^ ((p)->inverse ? 8 : 0)) #define attr_underline(p,conp) \ - (((conp)->vc_attr) & 4) + ((conp)->vc_attr & 4) +#define attr_blink(p,conp) \ + ((conp)->vc_attr & 0x80) /* ================================================================= */ @@ -317,6 +320,54 @@ static __inline__ void *mymemset(void *s, size_t count) return(memset(s, 255, count)); } +#ifdef __i386__ +static __inline__ void fast_memmove(void *d, const void *s, size_t count) +{ + if (d < s) { +__asm__ __volatile__ ( + "cld\n\t" + "shrl $1,%%ecx\n\t" + "jnc 1f\n\t" + "movsb\n" + "1:\tshrl $1,%%ecx\n\t" + "jnc 2f\n\t" + "movsw\n" + "2:\trep\n\t" + "movsl" + : /* no output */ + :"c"(count),"D"((long)d),"S"((long)s) + :"cx","di","si","memory"); + } else { +__asm__ __volatile__ ( + "std\n\t" + "shrl $1,%%ecx\n\t" + "jnc 1f\n\t" + "movb 3(%%esi),%%al\n\t" + "movb %%al,3(%%edi)\n\t" + "decl %%esi\n\t" + "decl %%edi\n" + "1:\tshrl $1,%%ecx\n\t" + "jnc 2f\n\t" + "movw 2(%%esi),%%ax\n\t" + "movw %%ax,2(%%edi)\n\t" + "decl %%esi\n\t" + "decl %%edi\n\t" + "decl %%esi\n\t" + "decl %%edi\n" + "2:\trep\n\t" + "movsl" + : /* no output */ + :"c"(count),"D"(count-4+(long)d),"S"(count-4+(long)s) + :"ax","cx","di","si","memory"); + } +} + +static __inline__ void *mymemmove(char *dst, const char *src, size_t size) +{ + fast_memmove(dst, src, size); + return dst; +} +#else static __inline__ void *mymemmove(void *d, const void *s, size_t count) { return(memmove(d, s, count)); @@ -326,6 +377,7 @@ static __inline__ void fast_memmove(char *dst, const char *src, size_t size) { memmove(dst, src, size); } +#endif /* !i386 */ #endif /* !m68k */ diff --git a/drivers/video/fonts.c b/drivers/video/fonts.c index 56a3a33b258a..469c6643fa6f 100644 --- a/drivers/video/fonts.c +++ b/drivers/video/fonts.c @@ -12,7 +12,7 @@ #include #include #include -#ifdef __mc68000__ +#if defined(__mc68000__) || defined(CONFIG_APUS) #include #endif #include "font.h" diff --git a/drivers/video/hpfb.c b/drivers/video/hpfb.c new file mode 100644 index 000000000000..251eb2977037 --- /dev/null +++ b/drivers/video/hpfb.c @@ -0,0 +1,431 @@ +/* + * HP300 Topcat framebuffer support (derived from macfb of all things) + * Phil Blundell 1998 + * + * Should this be moved to drivers/dio/video/ ? -- Peter Maydell + * No! -- Jes + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "fbcon-mfb.h" +#include "fbcon-cfb2.h" +#include "fbcon-cfb4.h" +#include "fbcon-cfb8.h" + +#define arraysize(x) (sizeof(x)/sizeof(*(x))) + +static struct display disp; +static struct fb_info fb_info; + +unsigned long fb_start, fb_size = 1024*768, fb_line_length = 1024; +unsigned long fb_regs; +unsigned char fb_bitmask; + +#define TC_WEN 0x4088 +#define TC_REN 0x408c +#define TC_FBEN 0x4090 +#define TC_NBLANK 0x4080 + +/* blitter regs */ +#define BUSY 0x4044 +#define WMRR 0x40ef +#define SOURCE_X 0x40f2 +#define SOURCE_Y 0x40f6 +#define DEST_X 0x40fa +#define DEST_Y 0x40fe +#define WHEIGHT 0x4106 +#define WWIDTH 0x4102 +#define WMOVE 0x409c + +static struct fb_var_screeninfo hpfb_defined = { + 0,0,0,0, /* W,H, W, H (virtual) load xres,xres_virtual*/ + 0,0, /* virtual -> visible no offset */ + 0, /* depth -> load bits_per_pixel */ + 0, /* greyscale ? */ + {0,2,0}, /* R */ + {0,2,0}, /* G */ + {0,2,0}, /* B */ + {0,0,0}, /* transparency */ + 0, /* standard pixel format */ + FB_ACTIVATE_NOW, + 274,195, /* 14" monitor */ + FB_ACCEL_NONE, + 0L,0L,0L,0L,0L, + 0L,0L,0, /* No sync info */ + FB_VMODE_NONINTERLACED, + {0,0,0,0,0,0} +}; + +struct hpfb_par +{ +}; + +static int currcon = 0; +struct hpfb_par current_par; + +static void hpfb_encode_var(struct fb_var_screeninfo *var, + struct hpfb_par *par) +{ + int i=0; + var->xres=1024; + var->yres=768; + var->xres_virtual=1024; + var->yres_virtual=768; + var->xoffset=0; + var->yoffset=0; + var->bits_per_pixel = 1; + var->grayscale=0; + var->transp.offset=0; + var->transp.length=0; + var->transp.msb_right=0; + var->nonstd=0; + var->activate=0; + var->height= -1; + var->width= -1; + var->vmode=FB_VMODE_NONINTERLACED; + var->pixclock=0; + var->sync=0; + var->left_margin=0; + var->right_margin=0; + var->upper_margin=0; + var->lower_margin=0; + var->hsync_len=0; + var->vsync_len=0; + for(i=0;ireserved);i++) + var->reserved[i]=0; +} + +static void hpfb_get_par(struct hpfb_par *par) +{ + *par=current_par; +} + +static int fb_update_var(int con, struct fb_info *info) +{ + return 0; +} + +static int do_fb_set_var(struct fb_var_screeninfo *var, int isactive) +{ + struct hpfb_par par; + + hpfb_get_par(&par); + hpfb_encode_var(var, &par); + return 0; +} + +static int hpfb_get_cmap(struct fb_cmap *cmap, int kspc, int con, + struct fb_info *info) +{ + return 0; +} + +/* + * Set the palette. This may not work on all boards but only experimentation will tell. + * XXX Doesn't work at all. + */ + +static int hpfb_set_cmap(struct fb_cmap *cmap, int kspc, int con, + struct fb_info *info) +{ + unsigned int i; + for (i = 0; i < cmap->len; i++) + { + while (readw(fb_regs + 0x6002) & 0x4) udelay(1); + writew(0, fb_regs + 0x60f0); + writew(cmap->start + i, fb_regs + 0x60b8); + writew(cmap->red[i], fb_regs + 0x60b2); + writew(cmap->green[i], fb_regs + 0x60b4); + writew(cmap->blue[i], fb_regs + 0x60b6); + writew(0xff, fb_regs + 0x60f0); + udelay(100); + } + writew(0xffff, fb_regs + 0x60ba); + return 0; +} + +static int hpfb_get_var(struct fb_var_screeninfo *var, int con, + struct fb_info *info) +{ + struct hpfb_par par; + if(con==-1) + { + hpfb_get_par(&par); + hpfb_encode_var(var, &par); + } + else + *var=fb_display[con].var; + return 0; +} + +static int hpfb_set_var(struct fb_var_screeninfo *var, int con, + struct fb_info *info) +{ + int err; + + if ((err=do_fb_set_var(var, 1))) + return err; + return 0; +} + +static void hpfb_encode_fix(struct fb_fix_screeninfo *fix, + struct hpfb_par *par) +{ + memset(fix, 0, sizeof(struct fb_fix_screeninfo)); + strcpy(fix->id, "HP300 Topcat"); + + /* + * X works, but screen wraps ... + */ + fix->smem_start=(char *)fb_start; + fix->smem_len=fb_size; + fix->type = FB_TYPE_PACKED_PIXELS; + fix->visual = FB_VISUAL_PSEUDOCOLOR; + fix->xpanstep=0; + fix->ypanstep=0; + fix->ywrapstep=0; + fix->line_length=fb_line_length; +} + +static int hpfb_get_fix(struct fb_fix_screeninfo *fix, int con, + struct fb_info *info) +{ + struct hpfb_par par; + hpfb_get_par(&par); + hpfb_encode_fix(fix, &par); + return 0; +} + +static void topcat_blit(int x0, int y0, int x1, int y1, int w, int h) +{ + while (readb(fb_regs + BUSY) & fb_bitmask); + writeb(0x3, fb_regs + WMRR); + writew(x0, fb_regs + SOURCE_X); + writew(y0, fb_regs + SOURCE_Y); + writew(x1, fb_regs + DEST_X); + writew(y1, fb_regs + DEST_Y); + writew(h, fb_regs + WHEIGHT); + writew(w, fb_regs + WWIDTH); + writeb(fb_bitmask, fb_regs + WMOVE); +} + +static int hpfb_ioctl(struct inode *inode, struct file *file, + unsigned int cmd, unsigned long arg, int con, + struct fb_info *info) +{ + return -EINVAL; +} + +static int hpfb_switch(int con, struct fb_info *info) +{ + do_fb_set_var(&fb_display[con].var,1); + currcon=con; + return 0; +} + +/* 0 unblank, 1 blank, 2 no vsync, 3 no hsync, 4 off */ + +static void hpfb_blank(int blank, struct fb_info *info) +{ + /* Not supported */ +} + +static int hpfb_open(struct fb_info *info) +{ + /* + * Nothing, only a usage count for the moment + */ + MOD_INC_USE_COUNT; + return(0); +} + +static void hpfb_set_disp(int con) +{ + struct fb_fix_screeninfo fix; + struct display *display; + + if (con >= 0) + display = &fb_display[con]; + else + display = &disp; /* used during initialization */ + + hpfb_get_fix(&fix, con, 0); + + display->screen_base = fix.smem_start; + display->visual = fix.visual; + display->type = fix.type; + display->type_aux = fix.type_aux; + display->ypanstep = fix.ypanstep; + display->ywrapstep = fix.ywrapstep; + display->line_length = fix.line_length; + display->next_line = fix.line_length; + display->can_soft_blank = 0; + display->inverse = 0; + + display->dispsw = &fbcon_cfb8; +} + +static int hpfb_release(struct fb_info *info) +{ + MOD_DEC_USE_COUNT; + return(0); +} + +static struct fb_ops hpfb_ops = { + hpfb_open, + hpfb_release, + hpfb_get_fix, + hpfb_get_var, + hpfb_set_var, + hpfb_get_cmap, + hpfb_set_cmap, + NULL, + hpfb_ioctl +}; + +#define TOPCAT_FBOMSB 0x5d +#define TOPCAT_FBOLSB 0x5f + +__initfunc(int hpfb_init_one(unsigned long base)) +{ + unsigned long fboff; + int err; + + fboff = (readb(base + TOPCAT_FBOMSB) << 8) + | readb(base + TOPCAT_FBOLSB); + + fb_start = 0xf0000000 | (readb(base + fboff) << 16); + fb_regs = base; + +#if 0 + /* This is the magic incantation NetBSD uses to make Catseye boards work. */ + writeb(0, base+0x4800); + writeb(0, base+0x4510); + writeb(0, base+0x4512); + writeb(0, base+0x4514); + writeb(0, base+0x4516); + writeb(0x90, base+0x4206); +#endif + + /* + * Fill in the available video resolution + */ + + hpfb_defined.xres = 1024; + hpfb_defined.yres = 768; + hpfb_defined.xres_virtual = 1024; + hpfb_defined.yres_virtual = 768; + hpfb_defined.bits_per_pixel = 8; + + /* + * Give the hardware a bit of a prod and work out how many bits per + * pixel are supported. + */ + + writeb(0xff, base + TC_WEN); + writeb(0xff, base + TC_FBEN); + writeb(0xff, fb_start); + fb_bitmask = readb(fb_start); + + /* + * Enable reading/writing of all the planes. + */ + writeb(fb_bitmask, base + TC_WEN); + writeb(fb_bitmask, base + TC_REN); + writeb(fb_bitmask, base + TC_FBEN); + writeb(0x1, base + TC_NBLANK); + + /* + * Let there be consoles.. + */ + strcpy(fb_info.modename, "Topcat"); + fb_info.changevar = NULL; + fb_info.node = -1; + fb_info.fbops = &hpfb_ops; + fb_info.disp = &disp; + fb_info.switch_con = &hpfb_switch; + fb_info.updatevar = &fb_update_var; + fb_info.blank = &hpfb_blank; + do_fb_set_var(&hpfb_defined, 1); + + err = register_framebuffer(&fb_info); + if (err < 0) + return 1; + + hpfb_get_var(&disp.var, -1, &fb_info); + hpfb_set_disp(-1); + + return 0; +} + +/* + * Check that the secondary ID indicates that we have some hope of working with this + * framebuffer. The catseye boards are pretty much like topcats and we can muddle through. + */ + +#define topcat_sid_ok(x) (((x) == DIO_ID2_LRCATSEYE) || ((x) == DIO_ID2_HRCCATSEYE) \ + || ((x) == DIO_ID2_HRMCATSEYE) || ((x) == DIO_ID2_TOPCAT)) + +/* + * Initialise the framebuffer + */ + +__initfunc(unsigned long hpfb_init(unsigned long mem_start)) +{ + unsigned int sid; + + /* Topcats can be on the internal IO bus or real DIO devices. + * The internal variant sits at 0xf0560000; it has primary + * and secondary ID registers just like the DIO version. + * So we merge the two detection routines. + * + * Perhaps this #define should be in a global header file: + * I believe it's common to all internal fbs, not just topcat. + */ +#define INTFBADDR 0xf0560000 + + if (hwreg_present((void *)INTFBADDR) && (DIO_ID(INTFBADDR) == DIO_ID_FBUFFER) + && topcat_sid_ok(sid = DIO_SECID(INTFBADDR))) + { + printk("Internal Topcat found (secondary id %02x)\n", sid); + hpfb_init_one(INTFBADDR); + } + else + { + int sc = dio_find(DIO_ID_FBUFFER); + if (sc) + { + unsigned long addr = (unsigned long)dio_scodetoviraddr(sc); + unsigned int sid = DIO_SECID(addr); + + if (topcat_sid_ok(sid)) + { + printk("Topcat found at DIO select code %02x " + "(secondary id %02x)\n", sc, sid); + hpfb_init_one(addr); + } + } + } + + return mem_start; +} + +__initfunc(void hpfb_setup(char *options, int *ints)) +{ +} diff --git a/drivers/video/macfb.c b/drivers/video/macfb.c index d346be3914bf..773085a4c585 100644 --- a/drivers/video/macfb.c +++ b/drivers/video/macfb.c @@ -44,7 +44,7 @@ static struct fb_var_screeninfo macfb_defined={ 0, /* standard pixel format */ FB_ACTIVATE_NOW, 274,195, /* 14" monitor *Mikael Nykvist's anyway* */ - FB_ACCEL_NONE, /* The only way to accelerate a mac is .. */ + 0, /* The only way to accelerate a mac is .. */ 0L,0L,0L,0L,0L, 0L,0L,0, /* No sync info */ FB_VMODE_NONINTERLACED, @@ -94,7 +94,7 @@ static int macfb_release(struct fb_info *info) static void macfb_encode_var(struct fb_var_screeninfo *var, struct macfb_par *par) { - int i=0; + memset(var, 0, sizeof(struct fb_var_screeninfo)); var->xres=mac_xres; var->yres=mac_yres; var->xres_virtual=mac_vxres; @@ -110,7 +110,6 @@ static void macfb_encode_var(struct fb_var_screeninfo *var, var->activate=0; var->height= -1; var->width= -1; - var->accel=0; var->vmode=FB_VMODE_NONINTERLACED; var->pixclock=0; var->sync=0; @@ -120,8 +119,6 @@ static void macfb_encode_var(struct fb_var_screeninfo *var, var->lower_margin=0; var->hsync_len=0; var->vsync_len=0; - for(i=0;ireserved);i++) - var->reserved[i]=0; return; } @@ -155,8 +152,6 @@ extern int console_loglevel; static void macfb_encode_fix(struct fb_fix_screeninfo *fix, struct macfb_par *par) { - int i; - memset(fix, 0, sizeof(struct fb_fix_screeninfo)); strcpy(fix->id,"Macintosh"); @@ -210,7 +205,7 @@ static void macfb_set_disp(int con) macfb_get_fix(&fix, con, 0); - display->screen_base = (u_char *)(fix.smem_start+fix.smem_offset); + display->screen_base = fix.smem_start+fix.smem_offset; display->visual = fix.visual; display->type = fix.type; display->type_aux = fix.type_aux; @@ -323,14 +318,12 @@ static struct fb_ops macfb_ops = { macfb_get_cmap, macfb_set_cmap, macfb_pan_display, - NULL, macfb_ioctl }; void macfb_setup(char *options, int *ints) { char *this_opt; - int temp; fb_info.fontname[0] = '\0'; @@ -430,7 +423,7 @@ __initfunc(unsigned long macfb_init(unsigned long mem_start)) if(err<0) { mac_boom(6); - return NULL; + return mem_start; } macfb_get_var(&disp.var, -1, &fb_info); diff --git a/drivers/video/mdafb.c b/drivers/video/mdafb.c new file mode 100644 index 000000000000..312b65d4906b --- /dev/null +++ b/drivers/video/mdafb.c @@ -0,0 +1,485 @@ +/* + * linux/drivers/video/mdafb.c -- MDA frame buffer device + * + * Adapted from vgafb, May 1998 by Andrew Apted + * + * This file is based on vgacon.c and vgafb.c. Read about their + * contributors there. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file COPYING in the main directory of this archive for + * more details. + */ + + +/* KNOWN PROBLEMS/TO DO ==================================================== * + * + * - detecting amount of memory is not yet implemented + * + * ========================================================================= */ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "fbcon.h" +#include "fbcon-vga.h" + + +#ifdef __powerpc__ +#define VGA_OFFSET _ISA_MEM_BASE; +#else +#define VGA_OFFSET 0x0 +#endif + + +static int mda_font_height = 16; /* !!! */ + + +static int currcon = 0; +static struct display disp; +static struct fb_info fb_info; + +static struct fb_fix_screeninfo fb_fix = { { 0, } }; +static struct fb_var_screeninfo fb_var = { 0, }; + + +/* Description of the hardware situation */ +static unsigned char mda_video_type; +static unsigned long mda_video_mem_base; /* Base of video memory */ +static unsigned long mda_video_mem_len; /* End of video memory */ +static u16 mda_video_port_reg; /* Video register select port */ +static u16 mda_video_port_val; /* Video register value port */ +static unsigned long mda_video_num_columns; /* Number of text columns */ +static unsigned long mda_video_num_lines; /* Number of text lines */ + + + /* + * MDA screen access + */ + +static inline void mda_writew(u16 val, u16 *addr) +{ +#ifdef __powerpc__ + st_le16(addr, val); +#else + writew(val, (unsigned long)addr); +#endif /* !__powerpc__ */ +} + +static inline u16 mda_readw(u16 *addr) +{ +#ifdef __powerpc__ + return ld_le16(addr); +#else + return readw((unsigned long)addr); +#endif /* !__powerpc__ */ +} + + +static inline void write_mda(unsigned char reg, unsigned int val) +{ + unsigned long flags; + + save_flags(flags); cli(); + + outb(reg, mda_video_port_reg); + outb(val >> 8, mda_video_port_val); + outb(reg+1, mda_video_port_reg); + outb(val & 0xff, mda_video_port_val); + + restore_flags(flags); +} + +static inline void mda_set_origin(unsigned short offset) +{ + write_mda(12, offset); +} + + /* + * Move hardware mda cursor + */ + +static int mda_write_cursor (int location) +{ + write_mda(14, location >> 1); + return 0; +} + + +void fbcon_mdafb_cursor(struct display *p, int mode, int x, int y) +{ + switch (mode) { + case CM_ERASE: + mda_write_cursor(mda_video_mem_len - 1); + break; + + case CM_MOVE: + case CM_DRAW: + mda_write_cursor(y*p->next_line + (x << 1)); + break; + } +} + + + /* + * Interface to the low level console driver + */ + +void mdafb_setup(char *options, int *ints); +static int mdafbcon_switch(int con, struct fb_info *info); +static int mdafbcon_updatevar(int con, struct fb_info *info); +static void mdafbcon_blank(int blank, struct fb_info *info); + + + /* + * Open/Release the frame buffer device + */ + +static int mdafb_open(struct fb_info *info) +{ + MOD_INC_USE_COUNT; + return 0; +} + +static int mdafb_release(struct fb_info *info) +{ + MOD_DEC_USE_COUNT; + return 0; +} + + + /* + * Get the Fixed Part of the Display + */ + +static int mdafb_get_fix(struct fb_fix_screeninfo *fix, int con, + struct fb_info *info) +{ + memcpy(fix, &fb_fix, sizeof(fb_fix)); + return 0; +} + + + /* + * Get the User Defined Part of the Display + */ + +static int mdafb_get_var(struct fb_var_screeninfo *var, int con, + struct fb_info *info) +{ + memcpy(var, &fb_var, sizeof(fb_var)); + return 0; +} + + + /* + * Set the User Defined Part of the Display + */ + +static int mdafb_set_var(struct fb_var_screeninfo *var, int con, + struct fb_info *info) +{ + struct display *display; + + if (con >= 0) + display = &fb_display[con]; + else + display = &disp; /* used during initialization */ + + if (var->xres > fb_var.xres || var->yres > fb_var.yres || + var->xres_virtual > fb_var.xres_virtual || + var->yres_virtual > fb_var.yres_virtual || + var->bits_per_pixel > fb_var.bits_per_pixel || + var->nonstd || !(var->accel_flags & FB_ACCELF_TEXT) || + (var->vmode & FB_VMODE_MASK) != FB_VMODE_NONINTERLACED) + return -EINVAL; + + memcpy(var, &fb_var, sizeof(fb_var)); + + if ((var->activate & FB_ACTIVATE_MASK) == FB_ACTIVATE_NOW) { + display->var = *var; + mda_set_origin(var->yoffset/mda_font_height*fb_fix.line_length/2); + } + + return 0; +} + + + /* + * Pan or Wrap the Display + * + * This call looks only at xoffset, yoffset and the FB_VMODE_YWRAP flag + */ + +static int mdafb_pan_display(struct fb_var_screeninfo *var, int con, + struct fb_info *info) +{ + if (var->xoffset || var->yoffset+var->yres > var->yres_virtual) + return -EINVAL; + + mda_set_origin(var->yoffset/mda_font_height*fb_fix.line_length/2); + return 0; +} + + + /* + * Get the Colormap + */ + +static int mdafb_get_cmap(struct fb_cmap *cmap, int kspc, int con, + struct fb_info *info) +{ + /* MDA is simply black and white */ + + return 0; +} + + + /* + * Set the Colormap + */ + +static int mdafb_set_cmap(struct fb_cmap *cmap, int kspc, int con, + struct fb_info *info) +{ + /* MDA is simply black and white */ + + return 0; +} + + +static int mdafb_ioctl(struct inode *inode, struct file *file, u_int cmd, + u_long arg, int con, struct fb_info *info) +{ + return -EINVAL; +} + + /* + * Interface used by the world + */ + +static struct fb_ops mdafb_ops = { + mdafb_open, mdafb_release, mdafb_get_fix, mdafb_get_var, + mdafb_set_var, mdafb_get_cmap, mdafb_set_cmap, mdafb_pan_display, + mdafb_ioctl +}; + + /* + * MDA text console with hardware cursor + */ + +static struct display_switch fbcon_mdafb = { + fbcon_vga_setup, fbcon_vga_bmove, fbcon_vga_clear, fbcon_vga_putc, + fbcon_vga_putcs, fbcon_vga_revc, fbcon_mdafb_cursor +}; + + + /* + * Initialisation + */ + +__initfunc(unsigned long mdafb_init(unsigned long mem_start)) +{ + int err; + u16 saved; + u16 *p; + + mda_video_num_lines = 25; + mda_video_num_columns = 80; + mda_video_type = VIDEO_TYPE_MDA; + mda_video_mem_base = 0xb0000 + VGA_OFFSET; + mda_video_mem_len = 0x01000; + mda_video_port_reg = 0x3b4; + mda_video_port_val = 0x3b5; + + strcpy(fb_fix.id, "MDA-Dual-Head"); + request_region(0x3b0, 12, "mda-2"); + request_region(0x3bf, 1, "mda-2"); + + /* + * Find out if there is a graphics card present. + * Are there smarter methods around? + */ + p = (u16 *)mda_video_mem_base; + saved = mda_readw(p); + mda_writew(0xAA55, p); + if (mda_readw(p) != 0xAA55) { + mda_writew(saved, p); + return mem_start; + } + mda_writew(0x55AA, p); + if (mda_readw(p) != 0x55AA) { + mda_writew(saved, p); + return mem_start; + } + mda_writew(saved, p); + + fb_fix.smem_start = (char *) mda_video_mem_base; + fb_fix.smem_len = mda_video_mem_len; + fb_fix.type = FB_TYPE_VGA_TEXT; + fb_fix.type_aux = 0; + fb_fix.visual = FB_VISUAL_PSEUDOCOLOR; + fb_fix.ypanstep = mda_font_height; + fb_fix.xpanstep = 0; + fb_fix.ywrapstep = 0; + fb_fix.line_length = 2 * mda_video_num_columns; + fb_fix.mmio_start = NULL; + fb_fix.mmio_len = 0; + fb_fix.accel = FB_ACCEL_NONE; + + fb_var.xres = mda_video_num_columns*8; + fb_var.yres = mda_video_num_lines * mda_font_height; + fb_var.xres_virtual = fb_var.xres; + /* the cursor is put at the end of the video memory, hence the -2 */ + fb_var.yres_virtual = ((fb_fix.smem_len-2)/fb_fix.line_length)* + mda_font_height; + + fb_var.xoffset = fb_var.yoffset = 0; + fb_var.bits_per_pixel = 1; + fb_var.grayscale = 1; + fb_var.red.offset = 0; + fb_var.red.length = 0; + fb_var.red.msb_right = 0; + fb_var.green.offset = 0; + fb_var.green.length = 0; + fb_var.green.msb_right = 0; + fb_var.blue.offset = 0; + fb_var.blue.length = 0; + fb_var.blue.msb_right = 0; + fb_var.transp.offset = 0; + fb_var.transp.length = 0; + fb_var.transp.msb_right = 0; + fb_var.nonstd = 0; + fb_var.activate = 0; + fb_var.height = fb_var.width = -1; + fb_var.accel_flags = FB_ACCELF_TEXT; + fb_var.pixclock = 39722; /* 25.175 MHz */ + fb_var.left_margin = 40; + fb_var.right_margin = 24; + fb_var.upper_margin = 39; + fb_var.lower_margin = 9; + fb_var.hsync_len = 96; + fb_var.vsync_len = 2; + fb_var.sync = 0; + fb_var.vmode = FB_VMODE_NONINTERLACED; + + disp.var = fb_var; + disp.cmap.start = 0; + disp.cmap.len = 0; + disp.cmap.red = NULL; + disp.cmap.green = NULL; + disp.cmap.blue = NULL; + disp.cmap.transp = NULL; + +#ifdef __i386__ + disp.screen_base = ioremap((unsigned long) fb_fix.smem_start, + fb_fix.smem_len); +#else + disp.screen_base = bus_to_virt((unsigned long) fb_fix.smem_start); +#endif + disp.visual = fb_fix.visual; + disp.type = fb_fix.type; + disp.type_aux = fb_fix.type_aux; + disp.ypanstep = fb_fix.ypanstep; + disp.ywrapstep = fb_fix.ywrapstep; + disp.line_length = fb_fix.line_length; + disp.can_soft_blank = 1; + disp.inverse = 0; + disp.dispsw = &fbcon_mdafb; + + strcpy(fb_info.modename, fb_fix.id); + fb_info.node = -1; + fb_info.fbops = &mdafb_ops; + fb_info.disp = &disp; + fb_info.fontname[0] = '\0'; + fb_info.changevar = NULL; + fb_info.switch_con = &mdafbcon_switch; + fb_info.updatevar = &mdafbcon_updatevar; + fb_info.blank = &mdafbcon_blank; + + err = register_framebuffer(&fb_info); + + if (err < 0) + return mem_start; + + mdafb_set_var(&fb_var, -1, &fb_info); + + printk("fb%d: MDA frame buffer device, using %dK of video memory\n", + GET_FB_IDX(fb_info.node), fb_fix.smem_len>>10); + + return mem_start; +} + +__initfunc(void mdafb_setup(char *options, int *ints)) +{ + /* nothing yet */ +} + + /* + * Update the `var' structure (called by fbcon.c) + */ + +static int mdafbcon_updatevar(int con, struct fb_info *info) +{ + if (con == currcon) { + struct fb_var_screeninfo *var = &fb_display[currcon].var; + + /* hardware scrolling */ + + mda_set_origin(var->yoffset / mda_font_height * + fb_fix.line_length / 2); + } + + return 0; +} + +static int mdafbcon_switch(int con, struct fb_info *info) +{ + currcon = con; + mdafbcon_updatevar(con, info); + return 0; +} + + /* + * Blank the display. + */ + +static void mdafbcon_blank(int blank, struct fb_info *info) +{ + if (blank) { + outb_p(0x00, 0x3b8); /* disable video */ + } else { + outb_p(0x08, 0x3b8); /* enable video */ + } +} + + +#ifdef MODULE +int init_module(void) +{ + mdafb_init(); + return 0; +} + +void cleanup_module(void) +{ + unregister_framebuffer(&fb_info); +} +#endif /* MODULE */ diff --git a/drivers/video/offb.c b/drivers/video/offb.c index 26ab95dfb485..206078645f91 100644 --- a/drivers/video/offb.c +++ b/drivers/video/offb.c @@ -27,7 +27,7 @@ #include #include #ifdef CONFIG_FB_COMPAT_XPMAC -#include +#include #endif #include #include @@ -47,8 +47,6 @@ struct fb_info_offb { volatile unsigned char *cmap_data; }; -static struct fb_info_offb fb_info[FB_MAX]; - #ifdef __powerpc__ #define mach_eieio() eieio() #else @@ -85,6 +83,7 @@ static int offb_ioctl(struct inode *inode, struct file *file, u_int cmd, #ifdef CONFIG_FB_COMPAT_XPMAC int console_getmode(struct vc_mode *); int console_setmode(struct vc_mode *, int); +int console_setcmap(int, unsigned char *, unsigned char *, unsigned char *); int console_powermode(int); struct fb_info *console_fb_info = NULL; int (*console_setmode_ptr)(struct vc_mode *, int) = NULL; @@ -116,7 +115,7 @@ static void do_install_cmap(int con, struct fb_info *info); static struct fb_ops offb_ops = { offb_open, offb_release, offb_get_fix, offb_get_var, offb_set_var, - offb_get_cmap, offb_set_cmap, offb_pan_display, NULL, offb_ioctl + offb_get_cmap, offb_set_cmap, offb_pan_display, offb_ioctl }; @@ -282,9 +281,12 @@ extern unsigned long atyfb_of_init(unsigned long mem_start, static const char *aty_names[] = { "ATY,mach64", "ATY,XCLAIM", "ATY,264VT", "ATY,mach64ii", "ATY,264GT-B", "ATY,mach64_3D_pcc", "ATY,XCLAIM3D", "ATY,XCLAIMVR", "ATY,RAGEII_M", - "ATY,XCLAIMVRPro", "ATY,mach64_3DU" + "ATY,XCLAIMVRPro", "ATY,mach64_3DU", "ATY,XCLAIM3DPro" }; #endif /* CONFIG_FB_ATY */ +#ifdef CONFIG_FB_S3TRIO +extern void s3triofb_init_of(unsigned long mem_start, struct device_node *dp); +#endif /* CONFIG_FB_S3TRIO */ /* @@ -305,11 +307,6 @@ __initfunc(unsigned long offb_init(unsigned long mem_start)) if (!(dp = find_path_device(prom_display_paths[dpy]))) continue; - info = &fb_info[dpy]; - fix = &info->fix; - var = &info->var; - disp = &info->disp; - if (!ofonly) { #ifdef CONFIG_FB_ATY for (i = 0; i < sizeof(aty_names)/sizeof(*aty_names); i++) @@ -320,8 +317,17 @@ __initfunc(unsigned long offb_init(unsigned long mem_start)) continue; } #endif /* CONFIG_FB_ATY */ +#ifdef CONFIG_FB_S3TRIO + if (s3triofb_init_of(dp)) + continue; +#endif /* CONFIG_FB_S3TRIO */ } + info = kmalloc(sizeof(struct fb_info_offb), GFP_ATOMIC); + fix = &info->fix; + var = &info->var; + disp = &info->disp; + strcpy(fix->id, "OFfb "); strncat(fix->id, dp->name, sizeof(fix->id)); fix->id[sizeof(fix->id)-1] = '\0'; @@ -329,6 +335,7 @@ __initfunc(unsigned long offb_init(unsigned long mem_start)) if ((pp = (int *)get_property(dp, "depth", &len)) != NULL && len == sizeof(int) && *pp != 8) { printk("%s: can't use depth = %d\n", dp->full_name, *pp); + kfree(info); continue; } if ((pp = (int *)get_property(dp, "width", &len)) != NULL @@ -352,11 +359,12 @@ __initfunc(unsigned long offb_init(unsigned long mem_start)) break; if (i >= dp->n_addrs) { printk("no framebuffer address found for %s\n", dp->full_name); + kfree(info); continue; } address = (u_long)dp->addrs[i].address; } - fix->smem_start = ioremap(address, fix->smem_len); + fix->smem_start = (char *)address; fix->type = FB_TYPE_PACKED_PIXELS; fix->type_aux = 0; @@ -379,7 +387,6 @@ __initfunc(unsigned long offb_init(unsigned long mem_start)) var->nonstd = 0; var->activate = 0; var->height = var->width = -1; - var->accel = FB_ACCEL_NONE; var->pixclock = 10000; var->left_margin = var->right_margin = 16; var->upper_margin = var->lower_margin = 16; @@ -390,8 +397,11 @@ __initfunc(unsigned long offb_init(unsigned long mem_start)) disp->var = *var; disp->cmap.start = 0; disp->cmap.len = 0; - disp->cmap.red = disp->cmap.green = disp->cmap.blue = disp->cmap.transp = NULL; - disp->screen_base = fix->smem_start; + disp->cmap.red = NULL; + disp->cmap.green = NULL; + disp->cmap.blue = NULL; + disp->cmap.transp = NULL; + disp->screen_base = ioremap(address, fix->smem_len); disp->visual = fix->visual; disp->type = fix->type; disp->type_aux = fix->type_aux; @@ -419,8 +429,10 @@ __initfunc(unsigned long offb_init(unsigned long mem_start)) info->info.blank = &offbcon_blank; err = register_framebuffer(&info->info); - if (err < 0) - continue; + if (err < 0) { + kfree(info); + return mem_start; + } for (i = 0; i < 16; i++) { int j = color_table[i]; @@ -441,15 +453,15 @@ __initfunc(unsigned long offb_init(unsigned long mem_start)) display_info.pitch = fix->line_length; display_info.mode = 0; strncpy(display_info.name, dp->name, sizeof(display_info.name)); - display_info.fb_address = iopa((unsigned long)fix->smem_start); + display_info.fb_address = address; display_info.cmap_adr_address = 0; display_info.cmap_data_address = 0; display_info.disp_reg_address = 0; /* XXX kludge for ati */ if (strncmp(dp->name, "ATY,", 4) == 0) { - display_info.disp_reg_address = iopa(address + 0x7ffc00); - display_info.cmap_adr_address = iopa(address + 0x7ffcc0); - display_info.cmap_data_address = iopa(address + 0x7ffcc1); + display_info.disp_reg_address = address + 0x7ffc00; + display_info.cmap_adr_address = address + 0x7ffcc0; + display_info.cmap_data_address = address + 0x7ffcc1; } console_fb_info = &info->info; console_set_cmap_ptr = offb_set_cmap; @@ -593,6 +605,7 @@ static void do_install_cmap(int con, struct fb_info *info) * - console_setmode() should fill in a struct fb_var_screeninfo (using * the MacOS video mode database) and simply call a decode_var() * function, so console_setmode_ptr is no longer needed. + * console_getmode() should convert in the other direction. * * - instead of using the console_* stuff (filled in by the frame * buffer), we should use the correct struct fb_info for the diff --git a/drivers/video/retz3fb.c b/drivers/video/retz3fb.c index 82dcc2877988..45ca4d4b2222 100644 --- a/drivers/video/retz3fb.c +++ b/drivers/video/retz3fb.c @@ -81,6 +81,8 @@ struct retz3fb_par { int hsync_len; /* length of horizontal sync */ int vsync_len; /* length of vertical sync */ int vmode; + + int accel; }; struct display_data { @@ -196,7 +198,7 @@ static struct fb_videomode retz3fb_predefined[] __initdata = { "640x480", { /* 640x480, 8 bpp */ 640, 480, 640, 480, 0, 0, 8, 0, {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0}, - 0, 0, -1, -1, FB_ACCEL_NCR77C32BLT, 38461, 28, 32, 12, 10, 96, 2, + 0, 0, -1, -1, FB_ACCELF_TEXT, 38461, 28, 32, 12, 10, 96, 2, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED } }, @@ -208,7 +210,7 @@ static struct fb_videomode retz3fb_predefined[] __initdata = { "800x600", { /* 800x600, 8 bpp */ 800, 600, 800, 600, 0, 0, 8, 0, {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0}, - 0, 0, -1, -1, FB_ACCEL_NCR77C32BLT, 27778, 64, 24, 22, 1, 120, 2, + 0, 0, -1, -1, FB_ACCELF_TEXT, 27778, 64, 24, 22, 1, 120, 2, FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED } }, @@ -220,21 +222,21 @@ static struct fb_videomode retz3fb_predefined[] __initdata = { "1024x768i", { /* 1024x768, 8 bpp, interlaced */ 1024, 768, 1024, 768, 0, 0, 8, 0, {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0}, - 0, 0, -1, -1, FB_ACCEL_NCR77C32BLT, 22222, 40, 40, 32, 9, 160, 8, + 0, 0, -1, -1, FB_ACCELF_TEXT, 22222, 40, 40, 32, 9, 160, 8, FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_INTERLACED } }, { "640x480-16", { /* 640x480, 16 bpp */ 640, 480, 640, 480, 0, 0, 16, 0, {11, 5, 0}, {5, 6, 0}, {0, 5, 0}, {0, 0, 0}, - 0, 0, -1, -1, FB_ACCEL_NCR77C32BLT, 38461/2, 28, 32, 12, 10, 96, 2, + 0, 0, -1, -1, 0, 38461/2, 28, 32, 12, 10, 96, 2, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED } }, { "640x480-24", { /* 640x480, 24 bpp */ 640, 480, 640, 480, 0, 0, 24, 0, {8, 8, 8}, {8, 8, 8}, {8, 8, 8}, {0, 0, 0}, - 0, 0, -1, -1, FB_ACCEL_NCR77C32BLT, 38461/3, 28, 32, 12, 10, 96, 2, + 0, 0, -1, -1, 0, 38461/3, 28, 32, 12, 10, 96, 2, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED } }, @@ -834,12 +836,11 @@ static int retz3_init(void) static int retz3_encode_fix(struct fb_fix_screeninfo *fix, struct retz3fb_par *par) { - short i; - + memset(fix, 0, sizeof(struct fb_fix_screeninfo)); strcpy(fix->id, retz3fb_name); fix->smem_start = (char *)z3_fbmem; fix->smem_len = z3_size; - fix->mmio_start = (unsigned char *)z3_regs; + fix->mmio_start = (char *)z3_regs; fix->mmio_len = 0x00c00000; fix->type = FB_TYPE_PACKED_PIXELS; @@ -854,10 +855,7 @@ static int retz3_encode_fix(struct fb_fix_screeninfo *fix, fix->ywrapstep = 0; fix->line_length = 0; - fix->accel = FB_ACCEL_NCR77C32BLT; - - for (i = 0; i < arraysize(fix->reserved); i++) - fix->reserved[i] = 0; + fix->accel = FB_ACCEL_NCR_77C32BLT; return 0; } @@ -891,6 +889,11 @@ static int retz3_decode_var(struct fb_var_screeninfo *var, par->hsync_len = var->hsync_len; par->vsync_len = var->vsync_len; + if (var->accel_flags & FB_ACCELF_TEXT) + par->accel = FB_ACCELF_TEXT; + else + par->accel = 0; + return 0; } @@ -903,8 +906,7 @@ static int retz3_decode_var(struct fb_var_screeninfo *var, static int retz3_encode_var(struct fb_var_screeninfo *var, struct retz3fb_par *par) { - short i; - + memset(var, 0, sizeof(struct fb_var_screeninfo)); var->xres = par->xres; var->yres = par->yres; var->xres_virtual = par->xres_vir; @@ -926,7 +928,7 @@ static int retz3_encode_var(struct fb_var_screeninfo *var, var->height = -1; var->width = -1; - var->accel = FB_ACCEL_NCR77C32BLT; + var->accel_flags = (par->accel && par->bpp == 8) ? FB_ACCELF_TEXT : 0; var->pixclock = par->pixclock; @@ -938,9 +940,6 @@ static int retz3_encode_var(struct fb_var_screeninfo *var, var->hsync_len = par->hsync_len; var->vsync_len = par->vsync_len; - for (i = 0; i < arraysize(var->reserved); i++) - var->reserved[i] = 0; - var->vmode = par->vmode; return 0; } @@ -1272,7 +1271,7 @@ static void retz3fb_set_disp(int con, struct fb_info *info) if (con == -1) con = 0; - display->screen_base = (unsigned char *)fix.smem_start; + display->screen_base = fix.smem_start; display->visual = fix.visual; display->type = fix.type; display->type_aux = fix.type_aux; @@ -1283,7 +1282,11 @@ static void retz3fb_set_disp(int con, struct fb_info *info) switch (display->var.bits_per_pixel) { #ifdef CONFIG_FBCON_CFB8 case 8: - display->dispsw = &fbcon_retz3_8; + if (display->var.accel_flags & FB_ACCELF_TEXT) { + display->dispsw = &fbcon_retz3_8; +#warning FIXME: We should reinit the graphics engine here + } else + display->dispsw = &fbcon_cfb8; break; #endif #ifdef CONFIG_FBCON_CFB16 @@ -1305,7 +1308,7 @@ static void retz3fb_set_disp(int con, struct fb_info *info) static int retz3fb_set_var(struct fb_var_screeninfo *var, int con, struct fb_info *info) { - int err, oldxres, oldyres, oldvxres, oldvyres, oldbpp; + int err, oldxres, oldyres, oldvxres, oldvyres, oldbpp, oldaccel; struct display *display; if (con >= 0) @@ -1326,12 +1329,14 @@ static int retz3fb_set_var(struct fb_var_screeninfo *var, int con, oldvxres = display->var.xres_virtual; oldvyres = display->var.yres_virtual; oldbpp = display->var.bits_per_pixel; + oldaccel = display->var.accel_flags; display->var = *var; if (oldxres != var->xres || oldyres != var->yres || oldvxres != var->xres_virtual || oldvyres != var->yres_virtual || - oldbpp != var->bits_per_pixel) { + oldbpp != var->bits_per_pixel || + oldaccel != var->accel_flags) { struct fb_fix_screeninfo fix; retz3fb_get_fix(&fix, con, info); @@ -1348,7 +1353,11 @@ static int retz3fb_set_var(struct fb_var_screeninfo *var, int con, switch (display->var.bits_per_pixel) { #ifdef CONFIG_FBCON_CFB8 case 8: - display->dispsw = &fbcon_retz3_8; + if (var->accel_flags & FB_ACCELF_TEXT) { + display->dispsw = &fbcon_retz3_8; +#warning FIXME: We should reinit the graphics engine here + } else + display->dispsw = &fbcon_cfb8; break; #endif #ifdef CONFIG_FBCON_CFB16 @@ -1448,7 +1457,7 @@ static int retz3fb_ioctl(struct inode *inode, struct file *file, static struct fb_ops retz3fb_ops = { retz3fb_open, retz3fb_release, retz3fb_get_fix, retz3fb_get_var, retz3fb_set_var, retz3fb_get_cmap, retz3fb_set_cmap, - retz3fb_pan_display, NULL, retz3fb_ioctl + retz3fb_pan_display, retz3fb_ioctl }; diff --git a/drivers/video/skeletonfb.c b/drivers/video/skeletonfb.c index 9b3a453eefaa..0f8fe86df097 100644 --- a/drivers/video/skeletonfb.c +++ b/drivers/video/skeletonfb.c @@ -298,7 +298,7 @@ __initfunc(unsigned long xxxfb_init(unsigned long mem_start)) fbgen_do_set_var(var, 1, &fbinfo.gen); err = register_framebuffer(&fb_info.gen.info); if (err < 0) - return err; + return mem_start; fbgen_set_disp(-1, &fb_info.gen.info); fbgen_install_cmap(0, &fb_info.gen); printk("fb%d: %s frame buffer device\n", GET_FB_IDX(fb_info.node), @@ -365,7 +365,7 @@ static int xxxfb_release(const struct fb_info *info) static struct fb_ops xxxfb_ops = { xxxfb_open, xxxfb_release, fbgen_get_fix, fbgen_get_var, fbgen_set_var, - fbgen_get_cmap, fbgen_set_cmap, fbgen_pan_display, NULL, fbgen_ioctl + fbgen_get_cmap, fbgen_set_cmap, fbgen_pan_display, fbgen_ioctl }; diff --git a/drivers/video/tgafb.c b/drivers/video/tgafb.c index 7e74f74493d9..54fdefff6ff5 100644 --- a/drivers/video/tgafb.c +++ b/drivers/video/tgafb.c @@ -296,7 +296,7 @@ static void do_install_cmap(int con, struct fb_info *info); static struct fb_ops tgafb_ops = { tgafb_open, tgafb_release, tgafb_get_fix, tgafb_get_var, tgafb_set_var, - tgafb_get_cmap, tgafb_set_cmap, tgafb_pan_display, NULL, tgafb_ioctl + tgafb_get_cmap, tgafb_set_cmap, tgafb_pan_display, tgafb_ioctl }; @@ -689,12 +689,13 @@ __initfunc(unsigned long tgafb_init(unsigned long mem_start)) fb_var.xres = fb_var.xres_virtual = 640; fb_var.yres = fb_var.yres_virtual = 480; fb_fix.line_length = 80*fb_var.bits_per_pixel; - fb_fix.smem_start = (char *)(tga_fb_base + LCA_DENSE_MEM); + fb_fix.smem_start = (char *)__pa(tga_fb_base + LCA_DENSE_MEM); fb_fix.smem_len = fb_fix.line_length*fb_var.yres; fb_fix.type = FB_TYPE_PACKED_PIXELS; fb_fix.type_aux = 0; - fb_fix.mmio_start = (unsigned char *)tga_regs_base; + fb_fix.mmio_start = (char *)__pa(tga_regs_base); fb_fix.mmio_len = 0x1000; /* Is this sufficient? */ + fb_fix.accel = FB_ACCEL_DEC_TGA; fb_var.xoffset = fb_var.yoffset = 0; fb_var.grayscale = 0; @@ -714,7 +715,7 @@ __initfunc(unsigned long tgafb_init(unsigned long mem_start)) fb_var.nonstd = 0; fb_var.activate = 0; fb_var.height = fb_var.width = -1; - fb_var.accel = FB_ACCEL_TGA; + fb_var.accel_flags = 0; fb_var.pixclock = 39722; fb_var.left_margin = 40; fb_var.right_margin = 24; @@ -729,7 +730,7 @@ __initfunc(unsigned long tgafb_init(unsigned long mem_start)) disp.cmap.start = 0; disp.cmap.len = 0; disp.cmap.red = disp.cmap.green = disp.cmap.blue = disp.cmap.transp = NULL; - disp.screen_base = fb_fix.smem_start; + disp.screen_base = (char *)tga_fb_base + LCA_DENSE_MEM; disp.visual = fb_fix.visual; disp.type = fb_fix.type; disp.type_aux = fb_fix.type_aux; diff --git a/drivers/video/txtcon.c b/drivers/video/txtcon.c index 83165b49b729..1aa66fdd1389 100644 --- a/drivers/video/txtcon.c +++ b/drivers/video/txtcon.c @@ -18,6 +18,7 @@ #include #include #include +#include /* @@ -43,8 +44,7 @@ static int txtcon_blank(int blank); static int txtcon_get_font(struct vc_data *conp, int *w, int *h, char *data); static int txtcon_set_font(struct vc_data *conp, int w, int h, char *data); static int txtcon_set_palette(struct vc_data *conp, unsigned char *table); -static int txtcon_scrolldelta(int lines); -static int txtcon_set_mode(struct vc_data *conp, int mode); +static int txtcon_scrolldelta(struct vc_data *conp, int lines); static unsigned long txtcon_startup(unsigned long kmem_start, @@ -141,12 +141,7 @@ static int txtcon_set_palette(struct vc_data *conp, unsigned char *table) } -static int txtcon_scrolldelta(int lines) -{ - return -ENOSYS; -} - -static int txtcon_set_mode(struct vc_data *conp, int mode) +static int txtcon_scrolldelta(struct vc_data *conp, int lines) { return -ENOSYS; } @@ -173,6 +168,5 @@ struct consw txt_con = { txtcon_get_font, txtcon_set_font, txtcon_set_palette, - txtcon_scrolldelta, - txtcon_set_mode + txtcon_scrolldelta }; diff --git a/drivers/video/vesafb.c b/drivers/video/vesafb.c new file mode 100644 index 000000000000..f3b1967e9bf8 --- /dev/null +++ b/drivers/video/vesafb.c @@ -0,0 +1,538 @@ +/* + * framebuffer driver for VBE 2.0 compliant graphic boards + * + * switching to graphics mode happens at boot time (while + * running in real mode, see arch/i386/video.S). + * + * (c) 1998 Gerd Knorr + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "fbcon.h" +#include "fbcon-cfb8.h" +#include "fbcon-cfb16.h" +#include "fbcon-cfb32.h" + +#define dac_reg (0x3c8) +#define dac_val (0x3c9) + +/* --------------------------------------------------------------------- */ + +/* + * card parameters + */ + +/* card */ +char *video_base; +int video_size; +char *video_vbase; /* mapped */ + +/* mode */ +int video_bpp; +int video_width; +int video_height; +int video_type = FB_TYPE_PACKED_PIXELS; +int video_visual; +int video_linelength; +int video_cmap_len; + +/* --------------------------------------------------------------------- */ + +static struct fb_var_screeninfo vesafb_defined = { + 0,0,0,0, /* W,H, W, H (virtual) load xres,xres_virtual*/ + 0,0, /* virtual -> visible no offset */ + 8, /* depth -> load bits_per_pixel */ + 0, /* greyscale ? */ + {0,0,0}, /* R */ + {0,0,0}, /* G */ + {0,0,0}, /* B */ + {0,0,0}, /* transparency */ + 0, /* standard pixel format */ + FB_ACTIVATE_NOW, + -1,-1, + 0, + 0L,0L,0L,0L,0L, + 0L,0L,0, /* No sync info */ + FB_VMODE_NONINTERLACED, + {0,0,0,0,0,0} +}; + +#define NUM_TOTAL_MODES 1 +#define NUM_PREDEF_MODES 1 + +static struct display disp; +static struct fb_info fb_info; +static struct { u_char red, green, blue, pad; } palette[256]; + +static int inverse = 0; + +struct vesafb_par +{ + void *unused; +}; + +static int currcon = 0; +static int current_par_valid = 0; +struct vesafb_par current_par; + +/* --------------------------------------------------------------------- */ +/* speed up scrolling */ + +#define USE_REDRAW 1 +#define USE_MEMMOVE 2 + +static vesafb_scroll = USE_REDRAW; +static struct display_switch vesafb_sw; + +void vesafb_bmove(struct display *p, int sy, int sx, int dy, int dx, + int height, int width) +{ + /* + * this is really faster than memmove (at least with my box) + * read access to video memory is slow... + */ + update_screen(currcon); +} + +/* --------------------------------------------------------------------- */ + + /* + * Open/Release the frame buffer device + */ + +static int vesafb_open(struct fb_info *info) +{ + /* + * Nothing, only a usage count for the moment + */ + MOD_INC_USE_COUNT; + return(0); +} + +static int vesafb_release(struct fb_info *info) +{ + MOD_DEC_USE_COUNT; + return(0); +} + +static void vesafb_encode_var(struct fb_var_screeninfo *var, + struct vesafb_par *par) +{ + memcpy(var, &vesafb_defined, sizeof(struct fb_var_screeninfo)); +} + +static void vesafb_get_par(struct vesafb_par *par) +{ + *par=current_par; +} + +static int fb_update_var(int con, struct fb_info *info) +{ + return 0; +} + +static int do_fb_set_var(struct fb_var_screeninfo *var, int isactive) +{ + struct vesafb_par par; + + vesafb_get_par(&par); + vesafb_encode_var(var, &par); + return 0; +} + +static void vesafb_encode_fix(struct fb_fix_screeninfo *fix, + struct vesafb_par *par) +{ + memset(fix, 0, sizeof(struct fb_fix_screeninfo)); + strcpy(fix->id,"VESA VGA"); + + fix->smem_start=(char *) video_base; + fix->smem_len=video_size; + fix->type = video_type; + fix->visual = video_visual; + fix->xpanstep=0; + fix->ypanstep=0; + fix->ywrapstep=0; + fix->line_length=video_linelength; + return; +} + +static int vesafb_get_fix(struct fb_fix_screeninfo *fix, int con, + struct fb_info *info) +{ + struct vesafb_par par; + vesafb_get_par(&par); + vesafb_encode_fix(fix, &par); + return 0; +} + +static int vesafb_get_var(struct fb_var_screeninfo *var, int con, + struct fb_info *info) +{ + struct vesafb_par par; + if(con==-1) + { + vesafb_get_par(&par); + vesafb_encode_var(var, &par); + } + else + *var=fb_display[con].var; + return 0; +} + +static void vesafb_set_disp(int con) +{ + struct fb_fix_screeninfo fix; + struct display *display; + + if (con >= 0) + display = &fb_display[con]; + else + display = &disp; /* used during initialization */ + + vesafb_get_fix(&fix, con, 0); + + display->screen_base = video_vbase; + display->visual = fix.visual; + display->type = fix.type; + display->type_aux = fix.type_aux; + display->ypanstep = fix.ypanstep; + display->ywrapstep = fix.ywrapstep; + display->line_length = fix.line_length; + display->next_line = fix.line_length; + display->can_soft_blank = 0; + display->inverse = inverse; + + switch (video_bpp) { +#ifdef CONFIG_FBCON_CFB8 + case 8: + display->dispsw = &fbcon_cfb8; + break; +#endif +#ifdef CONFIG_FBCON_CFB16 + case 15: + case 16: + display->dispsw = &fbcon_cfb16; + break; +#endif +#ifdef CONFIG_FBCON_CFB32 + case 32: + display->dispsw = &fbcon_cfb32; + break; +#endif + default: + display->dispsw = NULL; + break; + } + if (vesafb_scroll == USE_REDRAW) { + memcpy(&vesafb_sw,display->dispsw,sizeof(vesafb_sw)); + vesafb_sw.bmove = vesafb_bmove; + display->dispsw = &vesafb_sw; + } +} + +static int vesafb_set_var(struct fb_var_screeninfo *var, int con, + struct fb_info *info) +{ + int err; + + if ((err=do_fb_set_var(var, 1))) + return err; + return 0; +} + +static int vesa_getcolreg(unsigned regno, unsigned *red, unsigned *green, + unsigned *blue, unsigned *transp, + struct fb_info *fb_info) +{ + /* + * Read a single color register and split it into colors/transparent. + * Return != 0 for invalid regno. + */ + + if (regno >= video_cmap_len) + return 1; + + *red = palette[regno].red; + *green = palette[regno].green; + *blue = palette[regno].blue; + return 0; +} + +static int vesa_setcolreg(unsigned regno, unsigned red, unsigned green, + unsigned blue, unsigned transp, + struct fb_info *fb_info) +{ + /* + * Set a single color register. The values supplied are + * already rounded down to the hardware's capabilities + * (according to the entries in the `var' structure). Return + * != 0 for invalid regno. + */ + + if (regno >= video_cmap_len) + return 1; + + palette[regno].red = red; + palette[regno].green = green; + palette[regno].blue = blue; + + switch (video_bpp) { +#ifdef CONFIG_FBCON_CFB8 + case 8: + /* Hmm, can we do it _allways_ this way ??? */ + outb_p(regno, dac_reg); + outb_p(red, dac_val); + outb_p(green, dac_val); + outb_p(blue, dac_val); + break; +#endif +#ifdef CONFIG_FBCON_CFB16 + case 15: + case 16: + fbcon_cfb16_cmap[regno] = + (red << vesafb_defined.red.offset) | (green << 5) | blue; + break; +#endif +#ifdef CONFIG_FBCON_CFB24 + case 24: + /* FIXME: todo */ + break; +#endif +#ifdef CONFIG_FBCON_CFB32 + case 32: + fbcon_cfb32_cmap[regno] = + (red << vesafb_defined.red.offset) | + (green << vesafb_defined.green.offset) | + (blue << vesafb_defined.blue.offset); + break; +#endif + } + return 0; +} + +static void do_install_cmap(int con, struct fb_info *info) +{ + if (con != currcon) + return; + if (fb_display[con].cmap.len) + fb_set_cmap(&fb_display[con].cmap, &fb_display[con].var, 1, + vesa_setcolreg, info); + else + fb_set_cmap(fb_default_cmap(video_cmap_len), + &fb_display[con].var, 1, vesa_setcolreg, + info); +} + +static int vesafb_get_cmap(struct fb_cmap *cmap, int kspc, int con, + struct fb_info *info) +{ + if (con == currcon) /* current console? */ + return fb_get_cmap(cmap, &fb_display[con].var, kspc, vesa_getcolreg, info); + else if (fb_display[con].cmap.len) /* non default colormap? */ + fb_copy_cmap(&fb_display[con].cmap, cmap, kspc ? 0 : 2); + else + fb_copy_cmap(fb_default_cmap(video_cmap_len), + cmap, kspc ? 0 : 2); + return 0; +} + +static int vesafb_set_cmap(struct fb_cmap *cmap, int kspc, int con, + struct fb_info *info) +{ + int err; + + if (!fb_display[con].cmap.len) { /* no colormap allocated? */ + err = fb_alloc_cmap(&fb_display[con].cmap,video_cmap_len,0); + if (err) + return err; + } + if (con == currcon) /* current console? */ + return fb_set_cmap(cmap, &fb_display[con].var, kspc, vesa_setcolreg, info); + else + fb_copy_cmap(cmap, &fb_display[con].cmap, kspc ? 0 : 1); + return 0; +} + +static int vesafb_pan_display(struct fb_var_screeninfo *var, int con, + struct fb_info *info) +{ + /* no panning */ + return -EINVAL; +} + +static int vesafb_ioctl(struct inode *inode, struct file *file, + unsigned int cmd, unsigned long arg, int con, + struct fb_info *info) +{ + return -EINVAL; +} + +static struct fb_ops vesafb_ops = { + vesafb_open, + vesafb_release, + vesafb_get_fix, + vesafb_get_var, + vesafb_set_var, + vesafb_get_cmap, + vesafb_set_cmap, + vesafb_pan_display, + vesafb_ioctl +}; + +void vesafb_setup(char *options, int *ints) +{ + char *this_opt; + + fb_info.fontname[0] = '\0'; + + if (!options || !*options) + return; + + for(this_opt=strtok(options,","); this_opt; this_opt=strtok(NULL,",")) { + if (!*this_opt) continue; + + printk("vesafb_setup: option %s\n", this_opt); + + if (! strcmp(this_opt, "inverse")) + inverse=1; + else if (! strcmp(this_opt, "redraw")) + vesafb_scroll = USE_REDRAW; + else if (! strcmp(this_opt, "memmove")) + vesafb_scroll = USE_MEMMOVE; + else if (!strncmp(this_opt, "font:", 5)) + strcpy(fb_info.fontname, this_opt+5); + } +} + +static int vesafb_switch(int con, struct fb_info *info) +{ + /* Do we have to save the colormap? */ + if (fb_display[currcon].cmap.len) + fb_get_cmap(&fb_display[currcon].cmap, &fb_display[currcon].var, 1, + vesa_getcolreg, info); + + currcon = con; + /* Install new colormap */ + do_install_cmap(con, info); + fb_update_var(con, info); + return 0; +} + +/* 0 unblank, 1 blank, 2 no vsync, 3 no hsync, 4 off */ + +static void vesafb_blank(int blank, struct fb_info *info) +{ + /* Not supported */ +} + +__initfunc(unsigned long vesafb_init(unsigned long mem_start)) +{ + int i,j; + + if (screen_info.orig_video_isVGA != VIDEO_TYPE_VLFB) + return mem_start; + + video_base = (char*)screen_info.lfb_base; + video_bpp = screen_info.lfb_depth; + video_width = screen_info.lfb_width; + video_height = screen_info.lfb_height; + video_linelength = screen_info.lfb_linelength; + video_size = video_linelength * video_height /* screen_info.lfb_size */; + video_visual = (video_bpp == 8) ? + FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_DIRECTCOLOR; + video_vbase = ioremap((unsigned long)video_base, video_size); + + printk("vesafb: %dx%dx%d, linelength=%d\n", + video_width, video_height, video_bpp, video_linelength); + printk("vesafb: framebuffer at 0x%p, mapped to 0x%p, size %d\n", + video_base, video_vbase, video_size); + if (vesafb_scroll == USE_REDRAW) printk("vesafb: scrolling=redraw\n"); + if (vesafb_scroll == USE_MEMMOVE) printk("vesafb: scrolling=memmove\n"); + + vesafb_defined.xres=video_width; + vesafb_defined.yres=video_height; + vesafb_defined.xres_virtual=video_width; + vesafb_defined.yres_virtual=video_height; + vesafb_defined.bits_per_pixel=video_bpp; + + if (video_bpp > 8) { + vesafb_defined.red.offset = screen_info.red_pos; + vesafb_defined.red.length = screen_info.red_size; + vesafb_defined.green.offset = screen_info.green_pos; + vesafb_defined.green.length = screen_info.green_size; + vesafb_defined.blue.offset = screen_info.blue_pos; + vesafb_defined.blue.length = screen_info.blue_size; + vesafb_defined.transp.offset = screen_info.rsvd_pos; + vesafb_defined.transp.length = screen_info.rsvd_size; + printk("vesafb: directcolor: " + "size=%d:%d:%d:%d, shift=%d:%d:%d:%d\n", + screen_info.rsvd_size, + screen_info.red_size, + screen_info.green_size, + screen_info.blue_size, + screen_info.rsvd_pos, + screen_info.red_pos, + screen_info.green_pos, + screen_info.blue_pos); + video_cmap_len = 16; + } else { + vesafb_defined.red.length = 6; + vesafb_defined.green.length = 6; + vesafb_defined.blue.length = 6; + for(i = 0; i < 16; i++) { + j = color_table[i]; + palette[i].red = default_red[j]; + palette[i].green = default_grn[j]; + palette[i].blue = default_blu[j]; + } + video_cmap_len = 256; + } + request_region(0x3c0, 32, "vga+"); + + strcpy(fb_info.modename, "VESA VGA"); + fb_info.changevar = NULL; + fb_info.node = -1; + fb_info.fbops = &vesafb_ops; + fb_info.disp=&disp; + fb_info.switch_con=&vesafb_switch; + fb_info.updatevar=&fb_update_var; + fb_info.blank=&vesafb_blank; + do_fb_set_var(&vesafb_defined,1); + + if (register_framebuffer(&fb_info)<0) + return mem_start; + + vesafb_get_var(&disp.var, -1, &fb_info); + vesafb_set_disp(-1); + + printk("fb%d: %s frame buffer device\n", + GET_FB_IDX(fb_info.node), fb_info.modename); + + return mem_start; +} + +/* + * Overrides for Emacs so that we follow Linus's tabbing style. + * --------------------------------------------------------------------------- + * Local variables: + * c-basic-offset: 8 + * End: + */ diff --git a/drivers/video/vfb.c b/drivers/video/vfb.c index eea430ffa1b9..f787a67a59c3 100644 --- a/drivers/video/vfb.c +++ b/drivers/video/vfb.c @@ -56,7 +56,7 @@ static struct fb_var_screeninfo vfb_default = { /* 640x480, 8 bpp */ 640, 480, 640, 480, 0, 0, 8, 0, {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0}, - 0, 0, -1, -1, FB_ACCEL_NONE, 20000, 64, 64, 32, 32, 64, 2, + 0, 0, -1, -1, 0, 20000, 64, 64, 32, 32, 64, 2, 0, FB_VMODE_NONINTERLACED }; @@ -114,7 +114,7 @@ static void do_install_cmap(int con, struct fb_info *info); static struct fb_ops vfb_ops = { vfb_open, vfb_release, vfb_get_fix, vfb_get_var, vfb_set_var, vfb_get_cmap, - vfb_set_cmap, vfb_pan_display, NULL, vfb_ioctl + vfb_set_cmap, vfb_pan_display, vfb_ioctl }; @@ -250,7 +250,7 @@ static int vfb_set_var(struct fb_var_screeninfo *var, int con, struct fb_fix_screeninfo fix; vfb_encode_fix(&fix, var); - display->screen_base = (u_char *)fix.smem_start; + display->screen_base = (char *)videomemory; display->visual = fix.visual; display->type = fix.type; display->type_aux = fix.type_aux; @@ -501,7 +501,7 @@ static void vfb_encode_fix(struct fb_fix_screeninfo *fix, { memset(fix, 0, sizeof(struct fb_fix_screeninfo)); strcpy(fix->id, vfb_name); - fix->smem_start = (caddr_t)videomemory; + fix->smem_start = (char *)videomemory; fix->smem_len = videomemorysize; fix->type = FB_TYPE_PACKED_PIXELS; fix->type_aux = 0; diff --git a/drivers/video/vgacon.c b/drivers/video/vgacon.c index 623ea799db94..b777432b7c80 100644 --- a/drivers/video/vgacon.c +++ b/drivers/video/vgacon.c @@ -40,7 +40,7 @@ * * - speed up scrolling by changing the screen origin * - * - add support for palette, loadable fonts and VESA blanking + * - add support for loadable fonts and VESA blanking * * KNOWN PROBLEMS/TO DO ==================================================== */ @@ -103,8 +103,7 @@ static int vgacon_blank(int blank); static int vgacon_get_font(struct vc_data *conp, int *w, int *h, char *data); static int vgacon_set_font(struct vc_data *conp, int w, int h, char *data); static int vgacon_set_palette(struct vc_data *conp, unsigned char *table); -static int vgacon_scrolldelta(int lines); -static int vgacon_set_mode(struct vc_data *conp, int mode); +static int vgacon_scrolldelta(struct vc_data *conp, int lines); /* @@ -117,8 +116,8 @@ static int vgacon_show_logo(void); /* Description of the hardware situation */ static unsigned long vga_video_mem_base; /* Base of video memory */ static unsigned long vga_video_mem_term; /* End of video memory */ -static unsigned short vga_video_port_reg; /* Video register select port */ -static unsigned short vga_video_port_val; /* Video register value port */ +static u16 vga_video_port_reg; /* Video register select port */ +static u16 vga_video_port_val; /* Video register value port */ static unsigned long vga_video_num_columns; /* Number of text columns */ static unsigned long vga_video_num_lines; /* Number of text lines */ static unsigned long vga_video_size_row; @@ -138,7 +137,7 @@ static unsigned char vga_hardscroll_disabled_by_init = 0; * VGA screen access */ -static inline void vga_writew(unsigned short val, unsigned short * addr) +static inline void vga_writew(u16 val, u16 * addr) { #ifdef __powerpc__ st_le16(addr, val); @@ -147,7 +146,7 @@ static inline void vga_writew(unsigned short val, unsigned short * addr) #endif /* !__powerpc__ */ } -static inline unsigned short vga_readw(unsigned short * addr) +static inline u16 vga_readw(u16 * addr) { #ifdef __powerpc__ return ld_le16(addr); @@ -156,9 +155,9 @@ static inline unsigned short vga_readw(unsigned short * addr) #endif /* !__powerpc__ */ } -static inline void vga_memsetw(void * s, unsigned short c, unsigned int count) +static inline void vga_memsetw(void * s, u16 c, unsigned int count) { - unsigned short * addr = (unsigned short *) s; + u16 * addr = (u16 *) s; while (count) { count--; @@ -166,8 +165,7 @@ static inline void vga_memsetw(void * s, unsigned short c, unsigned int count) } } -static inline void vga_memmovew(unsigned short *to, unsigned short *from, - unsigned int count) +static inline void vga_memmovew(u16 *to, u16 *from, unsigned int count) { if (to < from) { while (count) { @@ -213,8 +211,8 @@ static inline void write_vga(unsigned char reg, unsigned int val) __initfunc(static unsigned long vgacon_startup(unsigned long kmem_start, const char **display_desc)) { - unsigned short saved; - unsigned short *p; + u16 saved; + u16 *p; vga_video_num_lines = ORIG_VIDEO_LINES; vga_video_num_columns = ORIG_VIDEO_COLS; @@ -313,7 +311,7 @@ __initfunc(static unsigned long vgacon_startup(unsigned long kmem_start, * Find out if there is a graphics card present. * Are there smarter methods around? */ - p = (unsigned short *)vga_video_mem_base; + p = (u16 *)vga_video_mem_base; saved = vga_readw(p); vga_writew(0xAA55, p); if (vga_readw(p) != 0xAA55) { @@ -407,7 +405,7 @@ static void vgacon_putcs(struct vc_data *conp, const char *s, int count, p = (u16 *)(vga_video_mem_base+ypos*vga_video_size_row+xpos*2); sattr = conp->vc_attr << 8; while (count--) - vga_writew(sattr | *s++, p++); + vga_writew(sattr | ((int) (*s++) & 0xff), p++); } @@ -480,13 +478,12 @@ static void vgacon_bmove(struct vc_data *conp, int sy, int sx, int dy, int dx, if (sx == 0 && dx == 0 && width == vga_video_num_columns) { src = vga_video_mem_base + sy * vga_video_size_row; dst = vga_video_mem_base + dy * vga_video_size_row; - vga_memmovew((unsigned short *)dst, (unsigned short *)src, - height * width); + vga_memmovew((u16 *)dst, (u16 *)src, height * width); } else if (dy < sy || (dy == sy && dx < sx)) { src = vga_video_mem_base + sy * vga_video_size_row + sx * 2; dst = vga_video_mem_base + dy * vga_video_size_row + dx * 2; for (rows = height; rows-- ;) { - vga_memmovew((unsigned short *)dst, (unsigned short *)src, width); + vga_memmovew((u16 *)dst, (u16 *)src, width); src += vga_video_size_row; dst += vga_video_size_row; } @@ -494,7 +491,7 @@ static void vgacon_bmove(struct vc_data *conp, int sy, int sx, int dy, int dx, src = vga_video_mem_base + (sy+height-1) * vga_video_size_row + sx * 2; dst = vga_video_mem_base + (dy+height-1) * vga_video_size_row + dx * 2; for (rows = height; rows-- ;) { - vga_memmovew((unsigned short *)dst, (unsigned short *)src, width); + vga_memmovew((u16 *)dst, (u16 *)src, width); src -= vga_video_size_row; dst -= vga_video_size_row; } @@ -551,18 +548,12 @@ static int vgacon_set_palette(struct vc_data *conp, unsigned char *table) return 0; } -static int vgacon_scrolldelta(int lines) +static int vgacon_scrolldelta(struct vc_data *conp, int lines) { /* TODO */ return -ENOSYS; } -static int vgacon_set_mode(struct vc_data *conp, int mode) -{ - return -ENOSYS; -} - - __initfunc(static int vgacon_show_logo( void )) { int height = 0; @@ -585,5 +576,5 @@ struct consw vga_con = { vgacon_startup, vgacon_init, vgacon_deinit, vgacon_clear, vgacon_putc, vgacon_putcs, vgacon_cursor, vgacon_scroll, vgacon_bmove, vgacon_switch, vgacon_blank, vgacon_get_font, vgacon_set_font, vgacon_set_palette, - vgacon_scrolldelta, vgacon_set_mode + vgacon_scrolldelta }; diff --git a/drivers/video/vgafb.c b/drivers/video/vgafb.c new file mode 100644 index 000000000000..674a081631dc --- /dev/null +++ b/drivers/video/vgafb.c @@ -0,0 +1,746 @@ +/* + * linux/drivers/video/vgafb.c -- VGA frame buffer device + * + * Created 28 Mar 1998 by Geert Uytterhoeven + * Hardware cursor support added on 14 Apr 1998 by Emmanuel Marty + * + * This file is heavily based on vgacon.c. Read about its contributors there. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file COPYING in the main directory of this archive for + * more details. + */ + + + + +/* KNOWN PROBLEMS/TO DO ===================================================== * + * + * - add support for loadable fonts and VESA blanking + * + * - for now only VGA _text_ mode is supported + * + * KNOWN PROBLEMS/TO DO ==================================================== */ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "fbcon.h" +#include "fbcon-vga.h" + + +#define BLANK 0x0020 + +#define CAN_LOAD_EGA_FONTS /* undefine if the user must not do this */ +#define CAN_LOAD_PALETTE /* undefine if the user must not do this */ + +#define dac_reg (0x3c8) +#define dac_val (0x3c9) + +#ifdef __powerpc__ +#define VGA_OFFSET _ISA_MEM_BASE; +#else +#define VGA_OFFSET 0x0 +#endif + + +static int currcon = 0; +static struct display disp; +static struct fb_info fb_info; +static struct { u_char red, green, blue, pad; } palette[16]; + +static struct fb_fix_screeninfo fb_fix = { { 0, } }; +static struct fb_var_screeninfo fb_var = { 0, }; + + +/* Description of the hardware situation */ +static unsigned char vga_video_type; +static unsigned long vga_video_mem_base; /* Base of video memory */ +static unsigned long vga_video_mem_term; /* End of video memory */ +static u16 vga_video_port_reg; /* Video register select port */ +static u16 vga_video_port_val; /* Video register value port */ +static unsigned long vga_video_num_columns; /* Number of text columns */ +static unsigned long vga_video_num_lines; /* Number of text lines */ +static int vga_can_do_color = 0; + + + /* + * VGA screen access + */ + +static inline void vga_writew(u16 val, u16 *addr) +{ +#ifdef __powerpc__ + st_le16(addr, val); +#else + writew(val, (unsigned long)addr); +#endif /* !__powerpc__ */ +} + +static inline u16 vga_readw(u16 *addr) +{ +#ifdef __powerpc__ + return ld_le16(addr); +#else + return readw((unsigned long)addr); +#endif /* !__powerpc__ */ +} + +static void vga_set_split(unsigned short linenum) +{ + unsigned long flags; + unsigned char overflow, fontsize; + + if (vga_video_type != VIDEO_TYPE_VGAC) { + return; + } + + save_flags(flags); cli(); + + outb_p(0x07, vga_video_port_reg); + overflow = inb_p(vga_video_port_val); + + outb_p(0x09, vga_video_port_reg); + fontsize = inb_p(vga_video_port_val); + + overflow &= ~0x10; overflow |= (linenum & 0x100) ? 0x10 : 0; + fontsize &= ~0x40; fontsize |= (linenum & 0x200) ? 0x40 : 0; + linenum &= 0xff; + + outb_p(0x18, vga_video_port_reg); + outb_p(linenum, vga_video_port_val); + + outb_p(0x07, vga_video_port_reg); + outb_p(overflow, vga_video_port_val); + + outb_p(0x09, vga_video_port_reg); + outb_p(fontsize, vga_video_port_val); + + restore_flags(flags); +} + + +/* + * By replacing the four outb_p with two back to back outw, we can reduce + * the window of opportunity to see text mislocated to the RHS of the + * console during heavy scrolling activity. However there is the remote + * possibility that some pre-dinosaur hardware won't like the back to back + * I/O. Since the Xservers get away with it, we should be able to as well. + */ +static inline void write_vga(unsigned char reg, unsigned int val) +{ +#ifndef SLOW_VGA + unsigned int v1, v2; + + v1 = reg + (val & 0xff00); + v2 = reg + 1 + ((val << 8) & 0xff00); + outw(v1, vga_video_port_reg); + outw(v2, vga_video_port_reg); +#else + outb_p(reg, vga_video_port_reg); + outb_p(val >> 8, vga_video_port_val); + outb_p(reg+1, vga_video_port_reg); + outb_p(val & 0xff, vga_video_port_val); +#endif +} + +static inline void vga_set_origin(unsigned short offset) +{ + write_vga(12, offset); +} + + + /* + * Interface used by the world + */ + +static int vgafb_open(struct fb_info *info); +static int vgafb_release(struct fb_info *info); +static int vgafb_get_fix(struct fb_fix_screeninfo *fix, int con, + struct fb_info *info); +static int vgafb_get_var(struct fb_var_screeninfo *var, int con, + struct fb_info *info); +static int vgafb_set_var(struct fb_var_screeninfo *var, int con, + struct fb_info *info); +static int vgafb_pan_display(struct fb_var_screeninfo *var, int con, + struct fb_info *info); +static int vgafb_get_cmap(struct fb_cmap *cmap, int kspc, int con, + struct fb_info *info); +static int vgafb_set_cmap(struct fb_cmap *cmap, int kspc, int con, + struct fb_info *info); +static int vgafb_ioctl(struct inode *inode, struct file *file, u_int cmd, + u_long arg, int con, struct fb_info *info); + + + /* + * Interface to the low level console driver + */ + +unsigned long vgafb_init(unsigned long mem_start); +void vgafb_setup(char *options, int *ints); +static int vgafbcon_switch(int con, struct fb_info *info); +static int vgafbcon_updatevar(int con, struct fb_info *info); +static void vgafbcon_blank(int blank, struct fb_info *info); + + + /* + * VGA text console with hardware cursor + */ + +static struct display_switch fbcon_vgafb; + + + /* + * Internal routines + */ + +static int vgafb_getcolreg(u_int regno, u_int *red, u_int *green, u_int *blue, + u_int *transp, struct fb_info *info); +static int vgafb_setcolreg(u_int regno, u_int red, u_int green, u_int blue, + u_int transp, struct fb_info *info); +static void do_install_cmap(int con, struct fb_info *info); + + +static struct fb_ops vgafb_ops = { + vgafb_open, vgafb_release, vgafb_get_fix, vgafb_get_var, vgafb_set_var, + vgafb_get_cmap, vgafb_set_cmap, vgafb_pan_display, vgafb_ioctl +}; + + + /* + * Open/Release the frame buffer device + */ + +static int vgafb_open(struct fb_info *info) + +{ + /* + * Nothing, only a usage count for the moment + */ + + MOD_INC_USE_COUNT; + return(0); +} + +static int vgafb_release(struct fb_info *info) +{ + MOD_DEC_USE_COUNT; + return(0); +} + + + /* + * Get the Fixed Part of the Display + */ + +static int vgafb_get_fix(struct fb_fix_screeninfo *fix, int con, + struct fb_info *info) +{ + memcpy(fix, &fb_fix, sizeof(fb_fix)); + return 0; +} + + + /* + * Get the User Defined Part of the Display + */ + +static int vgafb_get_var(struct fb_var_screeninfo *var, int con, + struct fb_info *info) +{ + memcpy(var, &fb_var, sizeof(fb_var)); + return 0; +} + + + /* + * Set the User Defined Part of the Display + */ + +static int vgafb_set_var(struct fb_var_screeninfo *var, int con, + struct fb_info *info) +{ + struct display *display; + int oldbpp = -1, err; + + if (con >= 0) + display = &fb_display[con]; + else + display = &disp; /* used during initialization */ + + if (var->xres > fb_var.xres || var->yres > fb_var.yres || + var->xres_virtual > fb_var.xres_virtual || + var->yres_virtual > fb_var.yres_virtual || + var->bits_per_pixel > fb_var.bits_per_pixel || + var->nonstd || !(var->accel_flags & FB_ACCELF_TEXT) || + (var->vmode & FB_VMODE_MASK) != FB_VMODE_NONINTERLACED) + return -EINVAL; + memcpy(var, &fb_var, sizeof(fb_var)); + + if ((var->activate & FB_ACTIVATE_MASK) == FB_ACTIVATE_NOW) { + oldbpp = display->var.bits_per_pixel; + display->var = *var; + vga_set_origin(var->yoffset/video_font_height*fb_fix.line_length/2); + } + if (oldbpp != var->bits_per_pixel) { + if ((err = fb_alloc_cmap(&display->cmap, 0, 0))) + return err; + do_install_cmap(con, info); + } + return 0; +} + + + /* + * Pan or Wrap the Display + * + * This call looks only at xoffset, yoffset and the FB_VMODE_YWRAP flag + */ + +static int vgafb_pan_display(struct fb_var_screeninfo *var, int con, + struct fb_info *info) +{ + if (var->xoffset || var->yoffset+var->yres > var->yres_virtual) + return -EINVAL; + + vga_set_origin(var->yoffset/video_font_height*fb_fix.line_length/2); + return 0; +} + + + /* + * Get the Colormap + */ + +static int vgafb_get_cmap(struct fb_cmap *cmap, int kspc, int con, + struct fb_info *info) +{ + if (con == currcon) /* current console? */ + return fb_get_cmap(cmap, &fb_display[con].var, kspc, vgafb_getcolreg, + info); + else if (fb_display[con].cmap.len) /* non default colormap? */ + fb_copy_cmap(&fb_display[con].cmap, cmap, kspc ? 0 : 2); + else + fb_copy_cmap(fb_default_cmap(1<> 1); +} + +static void fbcon_vgafb_cursor(struct display *p, int mode, int x, int y) +{ + switch (mode) { + case CM_ERASE: + vga_write_cursor(vga_video_mem_term - vga_video_mem_base - 1); + break; + + case CM_MOVE: + case CM_DRAW: + vga_write_cursor(y*p->next_line + (x << 1)); + break; + } +} + + + /* + * Initialisation + */ + +__initfunc(unsigned long vgafb_init(unsigned long mem_start)) +{ + int err; + u16 saved; + u16 *p; + + if (screen_info.orig_video_isVGA == VIDEO_TYPE_VLFB) + return mem_start; + + vga_video_num_lines = ORIG_VIDEO_LINES; + vga_video_num_columns = ORIG_VIDEO_COLS; + + if (ORIG_VIDEO_MODE == 7) { /* Is this a monochrome display? */ + vga_video_mem_base = 0xb0000 + VGA_OFFSET; + vga_video_port_reg = 0x3b4; + vga_video_port_val = 0x3b5; + if ((ORIG_VIDEO_EGA_BX & 0xff) != 0x10) { + vga_video_type = VIDEO_TYPE_EGAM; + vga_video_mem_term = 0xb8000 + VGA_OFFSET; + strcpy(fb_fix.id, "EGA+"); + request_region(0x3b0, 16, "ega"); + } else { + vga_video_type = VIDEO_TYPE_MDA; + vga_video_mem_term = 0xb1000 + VGA_OFFSET; + strcpy(fb_fix.id, "*MDA"); + request_region(0x3b0, 12, "mda"); + request_region(0x3bf, 1, "mda"); + } + } else { /* If not, it is color. */ + vga_can_do_color = 1; + vga_video_mem_base = 0xb8000 + VGA_OFFSET; + vga_video_port_reg = 0x3d4; + vga_video_port_val = 0x3d5; + if ((ORIG_VIDEO_EGA_BX & 0xff) != 0x10) { + int i; + + vga_video_mem_term = 0xc0000 + VGA_OFFSET; + + if (!ORIG_VIDEO_ISVGA) { + vga_video_type = VIDEO_TYPE_EGAC; + strcpy(fb_fix.id, "EGA"); + request_region(0x3c0, 32, "ega"); + } else { + vga_video_type = VIDEO_TYPE_VGAC; + strcpy(fb_fix.id, "VGA+"); + request_region(0x3c0, 32, "vga+"); + +#ifdef VGA_CAN_DO_64KB + /* + * get 64K rather than 32K of video RAM. + * This doesn't actually work on all "VGA" + * controllers (it seems like setting MM=01 + * and COE=1 isn't necessarily a good idea) + */ + vga_video_mem_base = 0xa0000 + VGA_OFFSET; + vga_video_mem_term = 0xb0000 + VGA_OFFSET; + outb_p(6, 0x3ce); + outb_p(6, 0x3cf); +#endif + + /* + * Normalise the palette registers, to point + * the 16 screen colours to the first 16 + * DAC entries. + */ + + for (i = 0; i < 16; i++) { + inb_p(0x3da); + outb_p(i, 0x3c0); + outb_p(i, 0x3c0); + } + outb_p(0x20, 0x3c0); + + /* now set the DAC registers back to their + * default values */ + + for (i = 0; i < 16; i++) { + outb_p(color_table[i], dac_reg); + outb_p(default_red[i], dac_val); + outb_p(default_grn[i], dac_val); + outb_p(default_blu[i], dac_val); + } + } + } else { + vga_video_type = VIDEO_TYPE_CGA; + vga_video_mem_term = 0xba000 + VGA_OFFSET; + strcpy(fb_fix.id, "*CGA"); + request_region(0x3d4, 2, "cga"); + } + } + + /* + * Find out if there is a graphics card present. + * Are there smarter methods around? + */ + p = (u16 *)vga_video_mem_base; + saved = vga_readw(p); + vga_writew(0xAA55, p); + if (vga_readw(p) != 0xAA55) { + vga_writew(saved, p); + return mem_start; + } + vga_writew(0x55AA, p); + if (vga_readw(p) != 0x55AA) { + vga_writew(saved, p); + return mem_start; + } + vga_writew(saved, p); + + if (vga_video_type == VIDEO_TYPE_VGAC + || vga_video_type == VIDEO_TYPE_EGAC + || vga_video_type == VIDEO_TYPE_EGAM) { + video_font_height = ORIG_VIDEO_POINTS; + } else { + video_font_height = 16; + } + + /* This may be suboptimal but is a safe bet - go with it */ + video_scan_lines = video_font_height * vga_video_num_lines; + + fb_fix.smem_start = (char *) vga_video_mem_base; + fb_fix.smem_len = vga_video_mem_term - vga_video_mem_base; + fb_fix.type = FB_TYPE_VGA_TEXT; + fb_fix.type_aux = 0; + fb_fix.visual = FB_VISUAL_PSEUDOCOLOR; + fb_fix.xpanstep = 0; + fb_fix.ypanstep = video_font_height; + fb_fix.ywrapstep = 0; + fb_fix.line_length = 2*vga_video_num_columns; + fb_fix.mmio_start = NULL; + fb_fix.mmio_len = 0; + fb_fix.accel = FB_ACCEL_NONE; + + fb_var.xres = vga_video_num_columns*8; + fb_var.yres = vga_video_num_lines*video_font_height; + fb_var.xres_virtual = fb_var.xres; + /* the cursor is put at the end of the video memory, hence the -2 */ + fb_var.yres_virtual = ((fb_fix.smem_len-2)/fb_fix.line_length)* + video_font_height; + + fb_var.xoffset = fb_var.yoffset = 0; + fb_var.bits_per_pixel = vga_can_do_color ? 4 : 1; + fb_var.grayscale = !vga_can_do_color; + fb_var.red.offset = 0; + fb_var.red.length = 6; + fb_var.red.msb_right = 0; + fb_var.green.offset = 0; + fb_var.green.length = 6; + fb_var.green.msb_right = 0; + fb_var.blue.offset = 0; + fb_var.blue.length = 6; + fb_var.blue.msb_right = 0; + fb_var.transp.offset = 0; + fb_var.transp.length = 0; + fb_var.transp.msb_right = 0; + fb_var.nonstd = 0; + fb_var.activate = 0; + fb_var.height = fb_var.width = -1; + fb_var.accel_flags = FB_ACCELF_TEXT; + fb_var.pixclock = 39722; /* 25.175 MHz */ + fb_var.left_margin = 40; + fb_var.right_margin = 24; + fb_var.upper_margin = 39; + fb_var.lower_margin = 9; + fb_var.hsync_len = 96; + fb_var.vsync_len = 2; + fb_var.sync = 0; + fb_var.vmode = FB_VMODE_NONINTERLACED; + + disp.var = fb_var; + disp.cmap.start = 0; + disp.cmap.len = 0; + disp.cmap.red = NULL; + disp.cmap.green = NULL; + disp.cmap.blue = NULL; + disp.cmap.transp = NULL; + +#ifdef __i386__ + disp.screen_base = ioremap((unsigned long) fb_fix.smem_start, + fb_fix.smem_len); +#else + disp.screen_base = bus_to_virt((unsigned long) fb_fix.smem_start); +#endif + disp.visual = fb_fix.visual; + disp.type = fb_fix.type; + disp.type_aux = fb_fix.type_aux; + disp.ypanstep = fb_fix.ypanstep; + disp.ywrapstep = fb_fix.ywrapstep; + disp.line_length = fb_fix.line_length; + disp.can_soft_blank = vga_can_do_color; + disp.inverse = 0; + disp.dispsw = &fbcon_vgafb; + + strcpy(fb_info.modename, fb_fix.id); + fb_info.node = -1; + fb_info.fbops = &vgafb_ops; + fb_info.disp = &disp; + fb_info.fontname[0] = '\0'; + fb_info.changevar = NULL; + fb_info.switch_con = &vgafbcon_switch; + fb_info.updatevar = &vgafbcon_updatevar; + fb_info.blank = &vgafbcon_blank; + + err = register_framebuffer(&fb_info); + if (err < 0) + return mem_start; + + vgafb_set_var(&fb_var, -1, &fb_info); + + printk("fb%d: VGA frame buffer device, using %dK of video memory\n", + GET_FB_IDX(fb_info.node), fb_fix.smem_len>>10); + + return mem_start; +} + +__initfunc(void vgafb_setup(char *options, int *ints)) +{ + /* nothing yet */ +} + + /* + * Update the `var' structure (called by fbcon.c) + */ + +static int vgafbcon_updatevar(int con, struct fb_info *info) +{ + if (con == currcon) { + struct fb_var_screeninfo *var = &fb_display[currcon].var; + + /* hardware scrolling */ + + vga_set_origin(var->yoffset / video_font_height * + fb_fix.line_length / 2); + + vga_set_split(var->yres - ((var->vmode & FB_VMODE_YWRAP) ? + var->yoffset+1 : 0)); + } + + return 0; +} + +static int vgafbcon_switch(int con, struct fb_info *info) +{ + /* Do we have to save the colormap? */ + if (fb_display[currcon].cmap.len) + fb_get_cmap(&fb_display[currcon].cmap, &fb_display[currcon].var, 1, + vgafb_getcolreg, info); + + currcon = con; + /* Install new colormap */ + do_install_cmap(con, info); + vgafbcon_updatevar(con, info); + return 0; +} + + /* + * Blank the display. + */ + +static void vgafbcon_blank(int blank, struct fb_info *info) +{ + int i; + + outb_p(0, dac_reg); + if (blank) + for (i = 0; i < 16; i++) { + outb_p(0, dac_val); + outb_p(0, dac_val); + outb_p(0, dac_val); + } + else + for (i = 0; i < 16; i++) { + outb_p(palette[i].blue, dac_val); + outb_p(palette[i].green, dac_val); + outb_p(palette[i].blue, dac_val); + } +} + + + /* + * Read a single color register and split it into + * colors/transparent. Return != 0 for invalid regno. + */ + +static int vgafb_getcolreg(u_int regno, u_int *red, u_int *green, u_int *blue, + u_int *transp, struct fb_info *info) +{ + if (regno > 15) + return 1; + *red = palette[regno].red; + *green = palette[regno].green; + *blue = palette[regno].blue; + return 0; +} + + + /* + * Set a single color register. The values supplied are already + * rounded down to the hardware's capabilities (according to the + * entries in the var structure). Return != 0 for invalid regno. + */ + +static int vgafb_setcolreg(u_int regno, u_int red, u_int green, u_int blue, + u_int transp, struct fb_info *info) +{ + if (regno > 15) + return 1; + palette[regno].red = red; + palette[regno].green = green; + palette[regno].blue = blue; + + outb_p(regno, dac_reg); + outb_p(red, dac_val); + outb_p(green, dac_val); + outb_p(blue, dac_val); + + return 0; +} + +static void do_install_cmap(int con, struct fb_info *info) +{ + if (con != currcon) + return; + if (fb_display[con].cmap.len) + fb_set_cmap(&fb_display[con].cmap, &fb_display[con].var, 1, + vgafb_setcolreg, info); + else + fb_set_cmap(fb_default_cmap(1<id, virgefb_name); - fix->smem_start = (caddr_t)CyberMem; + fix->smem_start = (char *)CyberMem; fix->smem_len = CyberSize; - fix->mmio_start = (unsigned char *)CyberRegs; + fix->mmio_start = (char *)CyberRegs; fix->mmio_len = 0x10000; /* TODO: verify this for the CV64/3D */ fix->type = FB_TYPE_PACKED_PIXELS; @@ -389,10 +389,7 @@ static int Cyber_encode_fix(struct fb_fix_screeninfo *fix, fix->ypanstep = 0; fix->ywrapstep = 0; fix->line_length = 0; - - for (i = 0; i < arraysize(fix->reserved); i++) - fix->reserved[i] = 0; - + fix->accel = FB_ACCEL_S3_VIRGE; return(0); } @@ -409,6 +406,10 @@ static int Cyber_decode_var(struct fb_var_screeninfo *var, par->xres = var->xres; par->yres = var->yres; par->bpp = var->bits_per_pixel; + if (var->accel_flags & FB_ACCELF_TEXT) + par->accel = FB_ACCELF_TEXT; + else + par->accel = 0; #else if (Cyberfb_Cyber8) { par->xres = VIRGE8_WIDTH; @@ -432,8 +433,7 @@ static int Cyber_decode_var(struct fb_var_screeninfo *var, static int Cyber_encode_var(struct fb_var_screeninfo *var, struct virgefb_par *par) { - int i; - + memset(var, 0, sizeof(struct fb_var_screeninfo)); var->xres = par->xres; var->yres = par->yres; var->xres_virtual = par->xres; @@ -470,7 +470,7 @@ static int Cyber_encode_var(struct fb_var_screeninfo *var, var->height = -1; var->width = -1; - var->accel = FB_ACCEL_S3VIRGE; + var->accel_flags = (par->accel && par->bpp == 8) ? FB_ACCELF_TEXT : 0; DPRINTK("accel CV64/3D\n"); var->vmode = FB_VMODE_NONINTERLACED; @@ -489,9 +489,6 @@ static int Cyber_encode_var(struct fb_var_screeninfo *var, var->hsync_len = 112; var->vsync_len = 2; - for (i = 0; i < arraysize(var->reserved); i++) - var->reserved[i] = 0; - return(0); } @@ -841,7 +838,7 @@ static void virgefb_set_disp(int con, struct fb_info *info) virgefb_get_fix(&fix, con, info); if (con == -1) con = 0; - display->screen_base = (u_char *)fix.smem_start; + display->screen_base = fix.smem_start; display->visual = fix.visual; display->type = fix.type; display->type_aux = fix.type_aux; @@ -852,7 +849,11 @@ static void virgefb_set_disp(int con, struct fb_info *info) switch (display->var.bits_per_pixel) { #ifdef CONFIG_FBCON_CFB8 case 8: - display->dispsw = &fbcon_virge8; + if (display->var.accel_flags & FB_ACCELF_TEXT) { + display->dispsw = &fbcon_virge8; +#warning FIXME: We should reinit the graphics engine here + } else + display->dispsw = &fbcon_virge8; break; #endif #ifdef CONFIG_FBCON_CFB16 @@ -874,7 +875,7 @@ static void virgefb_set_disp(int con, struct fb_info *info) static int virgefb_set_var(struct fb_var_screeninfo *var, int con, struct fb_info *info) { - int err, oldxres, oldyres, oldvxres, oldvyres, oldbpp; + int err, oldxres, oldyres, oldvxres, oldvyres, oldbpp, oldaccel; if ((err = do_fb_set_var(var, con == currcon))) return(err); @@ -884,11 +885,13 @@ static int virgefb_set_var(struct fb_var_screeninfo *var, int con, oldvxres = fb_display[con].var.xres_virtual; oldvyres = fb_display[con].var.yres_virtual; oldbpp = fb_display[con].var.bits_per_pixel; + oldaccel = fb_display[con].var.accel_flags; fb_display[con].var = *var; if (oldxres != var->xres || oldyres != var->yres || oldvxres != var->xres_virtual || oldvyres != var->yres_virtual || - oldbpp != var->bits_per_pixel) { + oldbpp != var->bits_per_pixel || + oldaccel != var->accel_flags) { virgefb_set_disp(con, info); (*fb_info.changevar)(con); fb_alloc_cmap(&fb_display[con].cmap, 0, 0); @@ -969,7 +972,7 @@ static int virgefb_ioctl(struct inode *inode, struct file *file, static struct fb_ops virgefb_ops = { virgefb_open, virgefb_release, virgefb_get_fix, virgefb_get_var, virgefb_set_var, virgefb_get_cmap, virgefb_set_cmap, - virgefb_pan_display, NULL, virgefb_ioctl + virgefb_pan_display, virgefb_ioctl }; @@ -1030,7 +1033,7 @@ __initfunc(unsigned long virgefb_init(unsigned long mem_start)) CyberMem = ZTWO_VADDR(board_addr); printk("CV3D detected running in Z2 mode ... not yet supported!\n"); - return -ENODEV; + return mem_start; } else { @@ -1169,7 +1172,7 @@ static void fbcon_virge8_clear(struct vc_data *conp, struct display *p, int sy, static struct display_switch fbcon_virge8 = { fbcon_cfb8_setup, fbcon_virge8_bmove, fbcon_virge8_clear, fbcon_cfb8_putc, - fbcon_cfb8_putcs, fbcon_cfb8_revc + fbcon_cfb8_putcs, fbcon_cfb8_revc, NULL }; #endif diff --git a/fs/Config.in b/fs/Config.in index 3db04b2a6afd..49db98c50b35 100644 --- a/fs/Config.in +++ b/fs/Config.in @@ -9,15 +9,15 @@ bool 'Quota support' CONFIG_QUOTA tristate 'Minix fs support' CONFIG_MINIX_FS tristate 'Second extended fs support' CONFIG_EXT2_FS -tristate 'ISO9660 cdrom filesystem support' CONFIG_ISO9660_FS +tristate 'ISO 9660 CDROM filesystem support' CONFIG_ISO9660_FS if [ "$CONFIG_ISO9660_FS" != "n" ]; then - bool 'Microsoft Joliet cdrom extensions' CONFIG_JOLIET + bool 'Microsoft Joliet CDROM extensions' CONFIG_JOLIET fi # msdos filesystems tristate 'DOS FAT fs support' CONFIG_FAT_FS dep_tristate 'MSDOS fs support' CONFIG_MSDOS_FS $CONFIG_FAT_FS -dep_tristate 'umsdos: Unix like fs on top of std MSDOS FAT fs' CONFIG_UMSDOS_FS $CONFIG_MSDOS_FS +dep_tristate 'UMSDOS: Unix-like filesystem on top of standard MSDOS filesystem' CONFIG_UMSDOS_FS $CONFIG_MSDOS_FS dep_tristate 'VFAT (Windows-95) fs support' CONFIG_VFAT_FS $CONFIG_FAT_FS bool '/proc filesystem support' CONFIG_PROC_FS @@ -40,7 +40,7 @@ if [ "$CONFIG_INET" = "y" ]; then fi fi tristate 'Coda filesystem support (advanced network fs)' CONFIG_CODA_FS - tristate 'SMB filesystem support (to mount WfW shares etc..)' CONFIG_SMB_FS + tristate 'SMB filesystem support (to mount WfW shares etc.)' CONFIG_SMB_FS if [ "$CONFIG_SMB_FS" != "n" ]; then bool 'SMB Win95 bug work-around' CONFIG_SMB_WIN95 fi @@ -53,7 +53,7 @@ if [ "$CONFIG_IPX" != "n" ]; then fi tristate 'OS/2 HPFS filesystem support (read only)' CONFIG_HPFS_FS -tristate 'NTFS filesystem support (read only)' CONFIG_NTFS_FS +tristate 'NTFS filesystem support (read only)' CONFIG_NTFS_FS if [ "$CONFIG_NTFS_FS" != "n" -a "$CONFIG_EXPERIMENTAL" = "y" ]; then bool ' NTFS read-write support (experimental)' CONFIG_NTFS_RW fi @@ -78,4 +78,3 @@ if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then fi bool 'Macintosh partition map support' CONFIG_MAC_PARTITION endmenu - diff --git a/fs/Makefile b/fs/Makefile index b9fbdf82afff..ae3a870fb81a 100644 --- a/fs/Makefile +++ b/fs/Makefile @@ -1,11 +1,11 @@ # -# Makefile for the linux filesystem. +# Makefile for the Linux filesystems. # # Note! Dependencies are done automagically by 'make dep', which also # removes any old dependencies. DON'T put your own dependencies here -# unless it's something special (ie not a .c file). +# unless it's something special (not a .c file). # -# Note 2! The CFLAGS definitions are now in the main makefile... +# Note 2! The CFLAGS definitions are now in the main makefile. L_TARGET := filesystems.a L_OBJS = $(join $(SUB_DIRS),$(SUB_DIRS:%=/%.o)) diff --git a/fs/adfs/Makefile b/fs/adfs/Makefile index e630221265d6..0764629fe494 100644 --- a/fs/adfs/Makefile +++ b/fs/adfs/Makefile @@ -1,11 +1,11 @@ # -# Makefile for the linux adfs-filesystem routines. +# Makefile for the linux adfs filesystem routines. # # Note! Dependencies are done automagically by 'make dep', which also # removes any old dependencies. DON'T put your own dependencies here -# unless it's something special (ie not a .c file). +# unless it's something special (not a .c file). # -# Note 2! The CFLAGS definitions are now in the main makefile... +# Note 2! The CFLAGS definitions are now in the main makefile. O_TARGET := adfs.o O_OBJS := dir.o file.o inode.o map.o namei.o super.o diff --git a/fs/adfs/file.c b/fs/adfs/file.c index 209f558c9fba..5627c7db4a4c 100644 --- a/fs/adfs/file.c +++ b/fs/adfs/file.c @@ -28,7 +28,7 @@ #include /* - * We have mostly NULL's here: the current defaults are ok for + * We have mostly NULLs here: the current defaults are OK for * the adfs filesystem. */ static struct file_operations adfs_file_operations = { diff --git a/fs/affs/Changes b/fs/affs/Changes index be1e1fb2cf98..0432bdd0dfa7 100644 --- a/fs/affs/Changes +++ b/fs/affs/Changes @@ -37,7 +37,7 @@ Version 3.9 - truncate() zeroes the unused remainder of a partially used last block when a file is truncated. It also marks the inode dirty now (which is not - really neccessary as notify_change() will do + really necessary as notify_change() will do it anyway). - Added a few comments, fixed some typos (and @@ -54,7 +54,7 @@ Bill Hawes kindly reviewed the affs and sent me the patches he did. They're marked (BH). Thanks, Bill! - Cleanup of error handling in read_super(). - Didn't release all ressources in case of an + Didn't release all resources in case of an error. (BH) - put_inode() releases the ext cache only if it's @@ -72,7 +72,7 @@ patches he did. They're marked (BH). Thanks, Bill! - getblock() did not invalidate the key cache when it allocated a new block. -- Removed some unneccessary locks as Bill +- Removed some unnecessary locks as Bill suggested. - Simplified match_name(), changed all hashing @@ -129,7 +129,7 @@ Version 3.6 directory changes). - Handling of hard links rewritten. To the VFS - they appear now as normal unix links. They are + they appear now as normal Unix links. They are now resolved only once in lookup(). The backside is that unlink(), rename() and rmdir() have to be smart about them, but the result is worth the @@ -165,7 +165,7 @@ Version 3.6 - Argument to volume option could overflow the name buffer. It is now silently truncated to - 30 characters. (Damnit! This kind of bug + 30 characters. (Damn it! This kind of bug is too embarrassing.) - Split inode.c into 2 files, the superblock diff --git a/fs/affs/Makefile b/fs/affs/Makefile index 1dba61b41fb8..c0def3c92f1e 100644 --- a/fs/affs/Makefile +++ b/fs/affs/Makefile @@ -1,11 +1,11 @@ # -# Makefile for the linux affs-filesystem routines. +# Makefile for the Linux affs filesystem routines. # # Note! Dependencies are done automagically by 'make dep', which also # removes any old dependencies. DON'T put your own dependencies here -# unless it's something special (ie not a .c file). +# unless it's something special (not a .c file). # -# Note 2! The CFLAGS definitions are now in the main makefile... +# Note 2! The CFLAGS definitions are now in the main makefile. O_TARGET := affs.o O_OBJS := super.o namei.o inode.o file.o dir.o amigaffs.o bitmap.o symlink.o diff --git a/fs/affs/amigaffs.c b/fs/affs/amigaffs.c index b57119782173..d01f618c832d 100644 --- a/fs/affs/amigaffs.c +++ b/fs/affs/amigaffs.c @@ -213,7 +213,7 @@ affs_remove_header(struct buffer_head *bh, struct inode *inode) /* Mark directory as changed. We do this before anything else, * as it must be done anyway and doesn't hurt even if an - * error occures later. + * error occurs later. */ dir = iget(inode->i_sb,be32_to_cpu(FILE_END(bh->b_data,inode)->parent)); if (!dir) diff --git a/fs/affs/dir.c b/fs/affs/dir.c index d98ab280d9b0..4cc742179495 100644 --- a/fs/affs/dir.c +++ b/fs/affs/dir.c @@ -5,7 +5,7 @@ * * (C) 1993 Ray Burr - Modified for Amiga FFS filesystem. * - * (C) 1992 Eric Youngdale Modified for ISO9660 filesystem. + * (C) 1992 Eric Youngdale Modified for ISO 9660 filesystem. * * (C) 1991 Linus Torvalds - minix filesystem * diff --git a/fs/affs/file.c b/fs/affs/file.c index 486a0cb196de..6f0db87fd6c0 100644 --- a/fs/affs/file.c +++ b/fs/affs/file.c @@ -5,7 +5,7 @@ * * (C) 1993 Ray Burr - Modified for Amiga FFS filesystem. * - * (C) 1992 Eric Youngdale Modified for ISO9660 filesystem. + * (C) 1992 Eric Youngdale Modified for ISO 9660 filesystem. * * (C) 1991 Linus Torvalds - minix filesystem * @@ -134,7 +134,7 @@ struct inode_operations affs_file_inode_operations_ofs = { /* The keys of the extension blocks are stored in a 512-entry * deep cache. In order to save memory, not every key of later * extension blocks is stored - the larger the file gets, the - * bigger the holes inbetween. + * bigger the holes in between. */ static int @@ -349,8 +349,8 @@ affs_bmap(struct inode *inode, int block) /* With the affs, getting a random block from a file is not * a simple business. Since this fs does not allow holes, - * it may be neccessary to allocate all the missing blocks - * inbetween, as well as some new extension blocks. The OFS + * it may be necessary to allocate all the missing blocks + * in between, as well as some new extension blocks. The OFS * is even worse: All data blocks contain pointers to the * next ones, so you have to fix [n-1] after allocating [n]. * What a mess. diff --git a/fs/affs/super.c b/fs/affs/super.c index 9399dd4b9dee..464b6df8aea3 100644 --- a/fs/affs/super.c +++ b/fs/affs/super.c @@ -5,7 +5,7 @@ * * (C) 1993 Ray Burr - Modified for Amiga FFS filesystem. * - * (C) 1992 Eric Youngdale Modified for ISO9660 filesystem. + * (C) 1992 Eric Youngdale Modified for ISO 9660 filesystem. * * (C) 1991 Linus Torvalds - minix filesystem */ diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c index 35b8dc46bde1..0428d9e774a9 100644 --- a/fs/binfmt_elf.c +++ b/fs/binfmt_elf.c @@ -324,8 +324,8 @@ static unsigned long load_elf_interp(struct elfhdr * interp_elf_ex, /* * Now fill out the bss section. First pad the last page up * to the page boundary, and then perform a mmap to make sure - * that there are zeromapped pages up to and including the last - * bss page. + * that there are zero-mapped pages up to and including the + * last bss page. */ padzero(elf_bss); elf_bss = ELF_PAGESTART(elf_bss + ELF_EXEC_PAGESIZE - 1); /* What we have mapped so far */ @@ -1222,7 +1222,7 @@ static int elf_core_dump(long signr, struct pt_regs * regs) notes[2].datasz = sizeof(*current); notes[2].data = current; - /* Try to dump the fpu. */ + /* Try to dump the FPU. */ prstatus.pr_fpvalid = dump_fpu (regs, &fpu); if (!prstatus.pr_fpvalid) { diff --git a/fs/buffer.c b/fs/buffer.c index c039b7792b36..7bf6e2824c9f 100644 --- a/fs/buffer.c +++ b/fs/buffer.c @@ -1311,7 +1311,7 @@ no_grow: if (!async) return NULL; - /* Uhhuh. We're _really_ low on memory. Now we just + /* We're _really_ low on memory. Now we just * wait for old buffer heads to become free due to * finishing IO. Since this is an async request and * the reserve list is empty, we're sure there are diff --git a/fs/coda/Makefile b/fs/coda/Makefile index 4e6c40dcea08..8dd3fa6d17da 100644 --- a/fs/coda/Makefile +++ b/fs/coda/Makefile @@ -1,5 +1,5 @@ # -# Makefile for the linux Coda-filesystem routines. +# Makefile for the Linux Coda filesystem routines. # O_TARGET := coda.o @@ -7,7 +7,7 @@ O_OBJS := psdev.o cache.o cnode.o inode.o dir.o file.o upcall.o coda_linux.o\ symlink.o pioctl.o sysctl.o stats.o M_OBJS := $(O_TARGET) -# If you want debugging output, please uncomment the following line +# If you want debugging output, please uncomment the following line. # EXTRA_CFLAGS += -DDEBUG -DDEBUG_SMB_MALLOC=1 diff --git a/fs/coda/dir.c b/fs/coda/dir.c index 564484dd0f15..a96efd20b8f5 100644 --- a/fs/coda/dir.c +++ b/fs/coda/dir.c @@ -100,7 +100,7 @@ struct file_operations coda_dir_operations = { /* inode operations for directories */ -/* acces routines: lookup, readlink, permission */ +/* access routines: lookup, readlink, permission */ static int coda_lookup(struct inode *dir, struct dentry *entry) { struct coda_inode_info *dircnp; diff --git a/fs/devpts/Makefile b/fs/devpts/Makefile index b8be35a4ff98..2e0c75d749f4 100644 --- a/fs/devpts/Makefile +++ b/fs/devpts/Makefile @@ -1,5 +1,5 @@ # -# Makefile for the linux /dev/pts virtual filesystem. +# Makefile for the Linux /dev/pts virtual filesystem. # O_TARGET := devpts.o diff --git a/fs/dquot.c b/fs/dquot.c index 513df0b9474b..50f8e2a35ad8 100644 --- a/fs/dquot.c +++ b/fs/dquot.c @@ -1,9 +1,9 @@ /* * Implementation of the diskquota system for the LINUX operating - * system. QUOTA is implemented using the BSD systemcall interface as + * system. QUOTA is implemented using the BSD system call interface as * the means of communication with the user level. Currently only the - * ext2-filesystem has support for diskquotas. Other filesystems may - * be added in future time. This file contains the generic routines + * ext2 filesystem has support for disk quotas. Other filesystems may + * be added in the future. This file contains the generic routines * called by the different filesystems on allocation of an inode or * block. These routines take care of the administration needed to * have a consistent diskquota tracking system. The ideas of both @@ -713,7 +713,7 @@ static int check_bdq(struct dquot *dquot, short type, u_long blocks, uid_t initi /* * Initialize a dquot-struct with new quota info. This is used by the - * systemcall interface functions. + * system call interface functions. */ static int set_dqblk(kdev_t dev, int id, short type, int flags, struct dqblk *dqblk) { @@ -970,7 +970,7 @@ int dquot_transfer(struct inode *inode, struct iattr *iattr, char direction, uid short cnt, disc; /* - * Find out if this filesystems uses i_blocks. + * Find out if this filesystem uses i_blocks. */ if (inode->i_blksize == 0) blocks = isize_to_blocks(inode->i_size, BLOCK_SIZE); @@ -1214,10 +1214,10 @@ int quota_on(kdev_t dev, short type, char *path) } /* - * Ok this is the systemcall interface, this communicates with - * the userlevel programs. Currently this only supports diskquota - * calls. Maybe we need to add the process quotas etc in the future. - * But we probably better use rlimits for that. + * This is the system call interface. This communicates with + * the user-level programs. Currently this only supports diskquota + * calls. Maybe we need to add the process quotas etc. in the future, + * but we probably should use rlimits for that. */ asmlinkage int sys_quotactl(int cmd, const char *special, int id, caddr_t addr) { diff --git a/fs/fat/Makefile b/fs/fat/Makefile index 0cbe93fb9fb8..8e8064c281c1 100644 --- a/fs/fat/Makefile +++ b/fs/fat/Makefile @@ -1,11 +1,11 @@ # -# Makefile for the linux fat-filesystem support. +# Makefile for the Linux fat filesystem support. # # Note! Dependencies are done automagically by 'make dep', which also # removes any old dependencies. DON'T put your own dependencies here -# unless it's something special (ie not a .c file). +# unless it's something special (not a .c file). # -# Note 2! The CFLAGS definitions are now in the main makefile... +# Note 2! The CFLAGS definitions are now in the main makefile. O_TARGET := fat.o O_OBJS := buffer.o cache.o dir.o file.o inode.o misc.o mmap.o tables.o cvf.o diff --git a/fs/fat/buffer.c b/fs/fat/buffer.c index 86b3a2f5a6df..4460e94d8c51 100644 --- a/fs/fat/buffer.c +++ b/fs/fat/buffer.c @@ -53,7 +53,7 @@ struct buffer_head *fat_bread ( * larger hardware sector size. This allows for higher * capacity. - * Most of the time, the MsDOS file system that sit + * Most of the time, the MS-DOS filesystem that sits * on this device is totally unaligned. It use logically * 512 bytes sector size, with logical sector starting * in the middle of a hardware block. The bad news is diff --git a/fs/fat/dir.c b/fs/fat/dir.c index 7ba11ec2d858..00ad26330375 100644 --- a/fs/fat/dir.c +++ b/fs/fat/dir.c @@ -51,7 +51,7 @@ struct file_operations fat_dir_operations = { }; /* - * Convert Unicode 16 to UTF8, translated unicode, or ascii. + * Convert Unicode 16 to UTF8, translated Unicode, or ASCII. * If uni_xlate is enabled and we * can't get a 1:1 conversion, use a colon as an escape character since * it is normally invalid on the vfat filesystem. The following three diff --git a/fs/fat/file.c b/fs/fat/file.c index 9052042f403b..2495400f4726 100644 --- a/fs/fat/file.c +++ b/fs/fat/file.c @@ -86,7 +86,7 @@ static struct file_operations fat_file_operations_1024 = { /* #Specification: msdos / special devices / swap file Swap file can't work on special devices with a large sector size (1024 bytes hard sector). Those devices have a weird - MsDOS filesystem layout. Generally a single hardware sector + MS-DOS filesystem layout. Generally a single hardware sector may contain 2 unrelated logical sector. This mean that there is no easy way to do a mapping between disk sector of a file and virtual memory. So swap file is difficult (not available right now) @@ -236,8 +236,8 @@ static ssize_t fat_file_read_text( to_reada = count_max / SECTOR_SIZE; if (count_max & (SECTOR_SIZE-1)) to_reada++; if (filp->f_reada || !MSDOS_I(inode)->i_binary){ - /* Doing a read ahead on ascii file make sure we always */ - /* pre read enough, since we don't know how many blocks */ + /* Doing a read ahead on ASCII file make sure we always */ + /* read enough, since we don't know how many blocks */ /* we really need */ int ahead = read_ahead[MAJOR(inode->i_dev)]; PRINTK (("to_reada %d ahead %d\n",to_reada,ahead)); diff --git a/fs/hfs/ChangeLog b/fs/hfs/ChangeLog index 8109f6eb2108..423f86e67510 100644 --- a/fs/hfs/ChangeLog +++ b/fs/hfs/ChangeLog @@ -376,7 +376,7 @@ Fri Feb 14 10:50:14 1997 Paul H. Hargrove dir.c, brec.c, btree.c, bitmap.c, bnode.c, bdelete.c, bins_del.c, binsert.c, Makefile, TODO, balloc.c: First shot at portability to the DEC Alpha and non-gcc compilers. - This invloved a significant overhaul of the type system. + This involved a significant overhaul of the type system. Tue Feb 4 04:26:54 1997 Paul H. Hargrove @@ -2346,7 +2346,7 @@ Feb 28, 1995: version 0.4 hargrove@sccm.stanford.edu (Paul H. Hargrove) More code reorganization to abstract the btree operations. Added the fork= mount option. Added AppleDouble support. Executor, from ARDI, can now run programs - from HFS filesystems mounted w/ the HFS module. + from HFS filesystems mounted with the HFS module. Jan 28, 1995: version 0.3 hargrove@sccm.stanford.edu (Paul H. Hargrove) Major code reorganization. diff --git a/fs/hfs/FAQ.txt b/fs/hfs/FAQ.txt index 1d2a7caaf9d9..de76e8d23807 100644 --- a/fs/hfs/FAQ.txt +++ b/fs/hfs/FAQ.txt @@ -42,7 +42,7 @@ 14. In what ways can I write to HFS filesystems? - 15. Does the HFS filesystem work with 400k or 800k Macintosh + 15. Does the HFS filesystem work with 400 kB or 800 kB Macintosh diskettes? 16. How can I format an HFS filesystem? diff --git a/fs/hfs/Makefile b/fs/hfs/Makefile index 7ea8e656005f..238bbba81a7f 100644 --- a/fs/hfs/Makefile +++ b/fs/hfs/Makefile @@ -1,11 +1,11 @@ # -# Makefile for the linux hfs-filesystem routines. +# Makefile for the Linux hfs filesystem routines. # # Note! Dependencies are done automagically by 'make dep', which also # removes any old dependencies. DON'T put your own dependencies here -# unless it's something special (ie not a .c file). +# unless it's something special (not a .c file). # -# Note 2! The CFLAGS definitions are now in the main makefile... +# Note 2! The CFLAGS definitions are now in the main makefile. O_TARGET := hfs.o O_OBJS := balloc.o bdelete.o bfind.o bins_del.o binsert.o bitmap.o bitops.o \ diff --git a/fs/hpfs/Makefile b/fs/hpfs/Makefile index 9c36d2c0f0b7..b4170046d70f 100644 --- a/fs/hpfs/Makefile +++ b/fs/hpfs/Makefile @@ -1,11 +1,11 @@ # -# Makefile for the linux HPFS filesystem routines. +# Makefile for the Linux HPFS filesystem routines. # # Note! Dependencies are done automagically by 'make dep', which also # removes any old dependencies. DON'T put your own dependencies here -# unless it's something special (ie not a .c file). +# unless it's something special (not a .c file). # -# Note 2! The CFLAGS definitions are now in the main makefile... +# Note 2! The CFLAGS definitions are now in the main makefile. O_TARGET := hpfs.o O_OBJS := hpfs_fs.o hpfs_caps.o diff --git a/fs/hpfs/hpfs.h b/fs/hpfs/hpfs.h index 53d1ab2d5995..fe07a3094aa7 100644 --- a/fs/hpfs/hpfs.h +++ b/fs/hpfs/hpfs.h @@ -348,11 +348,11 @@ struct bplus_header } u; }; -/* fnode: root of allocation b+ tree, and EA's */ +/* fnode: root of allocation b+ tree, and EAs */ /* Every file and every directory has one fnode, pointed to by the directory - entry and pointing to the file's sectors or directory's root dnode. EA's - are also stored here, and there are said to be ACL's somewhere here too. */ + entry and pointing to the file's sectors or directory's root dnode. EAs + are also stored here, and there are said to be ACLs somewhere here too. */ #define FNODE_MAGIC 0xf7e40aae @@ -392,12 +392,12 @@ struct fnode } u; unsigned file_size; /* file length, bytes */ - unsigned n_needea; /* number of EA's with NEEDEA set */ + unsigned n_needea; /* number of EAs with NEEDEA set */ unsigned zero4[4]; unsigned ea_offs; /* offset from start of fnode to first fnode-resident ea */ unsigned zero5[2]; - unsigned char ea[316]; /* zero or more EA's, packed together + unsigned char ea[316]; /* zero or more EAs, packed together with no alignment padding. (Do not use this name, get here via fnode + ea_offs. I think.) */ @@ -454,7 +454,7 @@ struct extended_attribute unsigned char namelen; /* length of name, bytes */ unsigned short valuelen; /* length of value, bytes */ /* - unsigned char name[namelen]; ascii attrib name + unsigned char name[namelen]; ASCII attrib name unsigned char nul; terminating '\0', not counted unsigned char value[valuelen]; value, arbitrary if this.indirect, valuelen is 8 and the value is diff --git a/fs/inode.c b/fs/inode.c index 046547bbb100..8607da74a957 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -596,9 +596,9 @@ add_new_inode: } /* - * Uhhuh.. We need to expand. Note that "grow_inodes()" will - * release the spinlock, but will return with the lock held - * again if the allocation succeeded. + * We need to expand. Note that "grow_inodes()" will + * release the spinlock, but will return with the lock + * held again if the allocation succeeded. */ inode = grow_inodes(); if (inode) { diff --git a/fs/ioctl.c b/fs/ioctl.c index cb5c3d6841b5..59429ba16b10 100644 --- a/fs/ioctl.c +++ b/fs/ioctl.c @@ -71,7 +71,7 @@ asmlinkage int sys_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg) break; flag = O_NONBLOCK; #ifdef __sparc__ - /* SunOS compatability item. */ + /* SunOS compatibility item. */ if(O_NONBLOCK != O_NDELAY) flag |= O_NDELAY; #endif diff --git a/fs/isofs/Makefile b/fs/isofs/Makefile index 10a4404f8899..11c3402846b4 100644 --- a/fs/isofs/Makefile +++ b/fs/isofs/Makefile @@ -1,11 +1,11 @@ # -# Makefile for the linux isofs-filesystem routines. +# Makefile for the Linux isofs filesystem routines. # # Note! Dependencies are done automagically by 'make dep', which also # removes any old dependencies. DON'T put your own dependencies here -# unless it's something special (ie not a .c file). +# unless it's something special (not a .c file). # -# Note 2! The CFLAGS definitions are now in the main makefile... +# Note 2! The CFLAGS definitions are now in the main makefile. O_TARGET := isofs.o O_OBJS := namei.o inode.o file.o dir.o util.o rock.o symlink.o diff --git a/fs/isofs/dir.c b/fs/isofs/dir.c index d1904bf9f423..524624572d01 100644 --- a/fs/isofs/dir.c +++ b/fs/isofs/dir.c @@ -1,7 +1,7 @@ /* * linux/fs/isofs/dir.c * - * (C) 1992, 1993, 1994 Eric Youngdale Modified for ISO9660 filesystem. + * (C) 1992, 1993, 1994 Eric Youngdale Modified for ISO 9660 filesystem. * * (C) 1991 Linus Torvalds - minix filesystem * @@ -74,7 +74,7 @@ static int isofs_name_translate(char * old, int len, char * new) if (c >= 'A' && c <= 'Z') c |= 0x20; /* lower case */ - /* Drop trailing '.;1' (ISO9660:1988 7.5.1 requires period) */ + /* Drop trailing '.;1' (ISO 9660:1988 7.5.1 requires period) */ if (c == '.' && i == len - 3 && old[i + 1] == ';' && old[i + 2] == '1') break; diff --git a/fs/isofs/file.c b/fs/isofs/file.c index d14a558a0475..0f230e0d270c 100644 --- a/fs/isofs/file.c +++ b/fs/isofs/file.c @@ -1,7 +1,7 @@ /* * linux/fs/isofs/file.c * - * (C) 1992, 1993, 1994 Eric Youngdale Modified for ISO9660 filesystem. + * (C) 1992, 1993, 1994 Eric Youngdale Modified for ISO 9660 filesystem. * * (C) 1991 Linus Torvalds - minix filesystem * @@ -19,7 +19,7 @@ #include /* - * We have mostly NULL's here: the current defaults are ok for + * We have mostly NULLs here: the current defaults are OK for * the isofs filesystem. */ static struct file_operations isofs_file_operations = { diff --git a/fs/isofs/inode.c b/fs/isofs/inode.c index 6bcdc4d834cd..62557f29c7a1 100644 --- a/fs/isofs/inode.c +++ b/fs/isofs/inode.c @@ -2,11 +2,11 @@ * linux/fs/isofs/inode.c * * (C) 1991 Linus Torvalds - minix filesystem - * 1992, 1993, 1994 Eric Youngdale Modified for ISO9660 filesystem. + * 1992, 1993, 1994 Eric Youngdale Modified for ISO 9660 filesystem. * 1994 Eberhard Moenkeberg - multi session handling. * 1995 Mark Dobie - allow mounting of some weird VideoCDs and PhotoCDs. * 1997 Gordon Chaffee - Joliet CDs - * 1998 Eric Lammerts - ISO9660 Level 3 + * 1998 Eric Lammerts - ISO 9660 Level 3 */ #include @@ -374,7 +374,7 @@ struct super_block *isofs_read_super(struct super_block *s, void *data, } else if (sec->escape[2] == 0x45) { joliet_level = 3; } - printk("ISO9660 Extensions: Microsoft Joliet Level %d\n", + printk("ISO 9660 Extensions: Microsoft Joliet Level %d\n", joliet_level); } goto root_found; @@ -993,7 +993,7 @@ void isofs_read_inode(struct inode * inode) enough error checking on the drive itself, but an open ended search makes me a little nervous. - The bsd iso filesystem uses the extent number for an inode, and this + The BSD iso filesystem uses the extent number for an inode, and this would work really nicely for us except that the read_inode function would not have any clean way of finding the actual directory record that goes with the file. If we had such info, then it would pay diff --git a/fs/isofs/joliet.c b/fs/isofs/joliet.c index c34bfef7603a..b620e4144d73 100644 --- a/fs/isofs/joliet.c +++ b/fs/isofs/joliet.c @@ -12,7 +12,7 @@ #include /* - * Convert Unicode 16 to UTF8 or ascii. + * Convert Unicode 16 to UTF8 or ASCII. */ static int uni16_to_x8(unsigned char *ascii, unsigned char *uni, int len, diff --git a/fs/isofs/namei.c b/fs/isofs/namei.c index 0876f0ae8d92..a59f15ad8f96 100644 --- a/fs/isofs/namei.c +++ b/fs/isofs/namei.c @@ -1,7 +1,7 @@ /* * linux/fs/isofs/namei.c * - * (C) 1992 Eric Youngdale Modified for ISO9660 filesystem. + * (C) 1992 Eric Youngdale Modified for ISO 9660 filesystem. * * (C) 1991 Linus Torvalds - minix filesystem */ diff --git a/fs/isofs/rock.c b/fs/isofs/rock.c index 7d943d0feba4..f3069c2c3eb7 100644 --- a/fs/isofs/rock.c +++ b/fs/isofs/rock.c @@ -266,7 +266,7 @@ int parse_rock_ridge_inode(struct iso_directory_record * de, break; case SIG('E','R'): inode->i_sb->u.isofs_sb.s_rock = 1; - printk(KERN_DEBUG"ISO9660 Extensions: "); + printk(KERN_DEBUG"ISO 9660 Extensions: "); { int p; for(p=0;pu.ER.len_id;p++) printk("%c",rr->u.ER.data[p]); }; diff --git a/fs/isofs/symlink.c b/fs/isofs/symlink.c index fe4abb98795b..c85510b53f9c 100644 --- a/fs/isofs/symlink.c +++ b/fs/isofs/symlink.c @@ -1,7 +1,7 @@ /* * linux/fs/isofs/symlink.c * - * (C) 1992 Eric Youngdale Modified for ISO9660 filesystem. + * (C) 1992 Eric Youngdale Modified for ISO 9660 filesystem. * * Copyright (C) 1991, 1992 Linus Torvalds * diff --git a/fs/isofs/util.c b/fs/isofs/util.c index 2d578fb8b345..a8962fc76081 100644 --- a/fs/isofs/util.c +++ b/fs/isofs/util.c @@ -6,7 +6,7 @@ * convert numbers according to section 7.3.3, etc. * * isofs special functions. This file was lifted in its entirety from - * the 386bsd iso9660 filesystem, by Pace Willisson . + * the 386BSD iso9660 filesystem, by Pace Willisson . */ #include @@ -87,7 +87,7 @@ isonum_733 (char * p) } /* - * We have to convert from a MM/DD/YY format to the unix ctime format. + * We have to convert from a MM/DD/YY format to the Unix ctime format. * We have to take into account leap years and all of that good stuff. * Unfortunately, the kernel does not have the information on hand to * take into account daylight savings time, but it shouldn't matter. diff --git a/fs/minix/Makefile b/fs/minix/Makefile index 60bb07d97d6e..537127b2d9fe 100644 --- a/fs/minix/Makefile +++ b/fs/minix/Makefile @@ -1,11 +1,11 @@ # -# Makefile for the linux minix-filesystem routines. +# Makefile for the Linux minix filesystem routines. # # Note! Dependencies are done automagically by 'make dep', which also # removes any old dependencies. DON'T put your own dependencies here -# unless it's something special (ie not a .c file). +# unless it's something special (not a .c file). # -# Note 2! The CFLAGS definitions are now in the main makefile... +# Note 2! The CFLAGS definitions are now in the main makefile. O_TARGET := minix.o O_OBJS := bitmap.o truncate.o namei.o inode.o file.o dir.o symlink.o fsync.o diff --git a/fs/minix/file.c b/fs/minix/file.c index 5aaef83b2039..a44a635b0be8 100644 --- a/fs/minix/file.c +++ b/fs/minix/file.c @@ -30,7 +30,7 @@ static ssize_t minix_file_write(struct file *, const char *, size_t, loff_t *); /* - * We have mostly NULL's here: the current defaults are ok for + * We have mostly NULLs here: the current defaults are OK for * the minix filesystem. */ static struct file_operations minix_file_operations = { diff --git a/fs/minix/inode.c b/fs/minix/inode.c index 8aa3c4b7d125..46ae5c11c024 100644 --- a/fs/minix/inode.c +++ b/fs/minix/inode.c @@ -122,7 +122,7 @@ int minix_remount (struct super_block * sb, int * flags, char * data) /* * Check the root directory of the filesystem to make sure - * it really _is_ a minix filesystem, and to check the size + * it really _is_ a Minix filesystem, and to check the size * of the directory entry. */ static const char * minix_checkroot(struct super_block *s, struct inode *dir) @@ -311,7 +311,7 @@ out_no_map: out_no_fs: if (!silent) - printk("VFS: Can't find a minix or minix V2 filesystem on dev " + printk("VFS: Can't find a Minix or Minix V2 filesystem on device " "%s.\n", kdevname(dev)); out_release: brelse(bh); diff --git a/fs/minix/truncate.c b/fs/minix/truncate.c index 56b490841287..0f0afa604429 100644 --- a/fs/minix/truncate.c +++ b/fs/minix/truncate.c @@ -21,7 +21,7 @@ /* * Truncate has the most races in the whole filesystem: coding it is - * a pain in the a**. Especially as I don't do any locking... + * a pain in the a**, especially as I don't do any locking. * * The code may look a bit weird, but that's just because I've tried to * handle things like file-size changes in a somewhat graceful manner. diff --git a/fs/msdos/Makefile b/fs/msdos/Makefile index 7d55464963de..01a5ebdc1855 100644 --- a/fs/msdos/Makefile +++ b/fs/msdos/Makefile @@ -1,11 +1,11 @@ # -# Makefile for the linux msdos-filesystem routines. +# Makefile for the Linux msdos filesystem routines. # # Note! Dependencies are done automagically by 'make dep', which also # removes any old dependencies. DON'T put your own dependencies here # unless it's something special (ie not a .c file). # -# Note 2! The CFLAGS definitions are now in the main makefile... +# Note 2! The CFLAGS definitions are now in the main makefile. O_TARGET := msdos.o O_OBJS := namei.o diff --git a/fs/namei.c b/fs/namei.c index 2b10cb7117ce..d031af14a76e 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -70,7 +70,7 @@ * and the name already exists in form of a symlink, try to create the new * name indicated by the symlink. The old code always complained that the * name already exists, due to not following the symlink even if its target - * is non-existant. The new semantics affects also mknod() and link() when + * is nonexistent. The new semantics affects also mknod() and link() when * the name is a symlink pointing to a non-existant name. * * I don't know which semantics is the right one, since I have no access diff --git a/fs/nfs/Makefile b/fs/nfs/Makefile index df7fe151d6f5..3171e8adcd6c 100644 --- a/fs/nfs/Makefile +++ b/fs/nfs/Makefile @@ -1,11 +1,11 @@ # -# Makefile for the linux nfs-filesystem routines. +# Makefile for the Linux nfs filesystem routines. # # Note! Dependencies are done automagically by 'make dep', which also # removes any old dependencies. DON'T put your own dependencies here -# unless it's something special (ie not a .c file). +# unless it's something special (not a .c file). # -# Note 2! The CFLAGS definitions are now in the main makefile... +# Note 2! The CFLAGS definitions are now in the main makefile. O_TARGET := nfs.o O_OBJS := inode.o file.o read.o write.o dir.o symlink.o proc.o \ diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c index 8d75f3b85d44..66b33161f898 100644 --- a/fs/nfs/dir.c +++ b/fs/nfs/dir.c @@ -1106,7 +1106,7 @@ nfs_link(struct dentry *old_dentry, struct inode *dir, struct dentry *dentry) /* * Drop the dentry in advance to force a new lookup. - * Since nfs_proc_link doesn't return a filehandle, + * Since nfs_proc_link doesn't return a file handle, * we can't use the existing dentry. */ d_drop(dentry); diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c index d56e4e7e61c8..98c2da4efc44 100644 --- a/fs/nfs/inode.c +++ b/fs/nfs/inode.c @@ -448,7 +448,7 @@ nfs_fhget(struct dentry *dentry, struct nfs_fh *fhandle, dentry->d_parent->d_name.name, dentry->d_name.name, fattr->fileid); - /* Install the filehandle in the dentry */ + /* Install the file handle in the dentry */ *((struct nfs_fh *) dentry->d_fsdata) = *fhandle; #ifdef CONFIG_NFS_SNAPSHOT diff --git a/fs/nfs/write.c b/fs/nfs/write.c index 71bdcf6451fc..c317f330bbd3 100644 --- a/fs/nfs/write.c +++ b/fs/nfs/write.c @@ -19,10 +19,10 @@ * from the writeback list to the writelock list. * * Note: we must make sure never to confuse the inode passed in the - * write_page request with the one in page->inode. As far as I understant + * write_page request with the one in page->inode. As far as I understand * it, these are different when doing a swap-out. * - * To understand everything that goes one here and in the nfs read code, + * To understand everything that goes on here and in the NFS read code, * one should be aware that a page is locked in exactly one of the following * cases: * diff --git a/fs/nfsd/Makefile b/fs/nfsd/Makefile index 111adfbf0587..a8d65fc7a39c 100644 --- a/fs/nfsd/Makefile +++ b/fs/nfsd/Makefile @@ -1,11 +1,11 @@ # -# Makefile for the linux nfs-filesystem routines. +# Makefile for the Linux nfs filesystem routines. # # Note! Dependencies are done automagically by 'make dep', which also # removes any old dependencies. DON'T put your own dependencies here -# unless it's something special (ie not a .c file). +# unless it's something special (not a .c file). # -# Note 2! The CFLAGS definitions are now in the main makefile... +# Note 2! The CFLAGS definitions are now in the main makefile. O_TARGET := nfsd.o O_OBJS := nfssvc.o nfsctl.o nfsproc.o nfsfh.o vfs.o \ diff --git a/fs/nfsd/nfsfh.c b/fs/nfsd/nfsfh.c index 2d5b5c45d73b..f201718240ed 100644 --- a/fs/nfsd/nfsfh.c +++ b/fs/nfsd/nfsfh.c @@ -1,7 +1,7 @@ /* * linux/fs/nfsd/nfsfh.c * - * NFS server filehandle treatment. + * NFS server file handle treatment. * * Copyright (C) 1995, 1996 Olaf Kirch */ @@ -182,7 +182,7 @@ static int add_to_path_cache(struct dentry *dentry) int len, result = 0; #ifdef NFSD_DEBUG_VERBOSE -printk("add_to_path_cache: cacheing %s/%s\n", +printk("add_to_path_cache: caching %s/%s\n", dentry->d_parent->d_name.name, dentry->d_name.name); #endif /* @@ -222,7 +222,7 @@ printk("add_to_path_cache: added %s, paths=%d\n", new->name, nfsd_nr_paths); return result; /* - * If the dentry's path length changed, just try again ... + * If the dentry's path length changed, just try again. */ retry: kfree(new); @@ -374,7 +374,7 @@ out: /* * Look up a dentry given inode and parent inode numbers. * - * This relies on the ability of a unix-like filesystem to return + * This relies on the ability of a Unix-like filesystem to return * the parent inode of a directory as the ".." (second) entry. * * This could be further optimized if we had an efficient way of @@ -610,7 +610,7 @@ printk("expire_old: expiring %s older than %d\n", /* * Add a dentry to the file or dir cache. * - * Note: As NFS filehandles must have an inode, we don't accept + * Note: As NFS file handles must have an inode, we don't accept * negative dentries. */ static int add_to_fhcache(struct dentry *dentry, int cache) @@ -846,18 +846,18 @@ static struct dentry *nfsd_cached_lookup(struct knfs_fh *fh) } /* - * The is the basic lookup mechanism for turning an NFS filehandle + * The is the basic lookup mechanism for turning an NFS file handle * into a dentry. There are several levels to the search: * (1) Look for the dentry pointer the short-term fhcache, * and verify that it has the correct inode number. * - * (2) Try to validate the dentry pointer in the filehandle, + * (2) Try to validate the dentry pointer in the file handle, * and verify that it has the correct inode number. If this * fails, check for a cached lookup in the fix-up list and * repeat step (2) using the new dentry pointer. * * (3) Look up the dentry by using the inode and parent inode numbers - * to build the name string. This should succeed for any unix-like + * to build the name string. This should succeed for any Unix-like * filesystem. * * (4) Search for the parent dentry in the dir cache, and then @@ -886,7 +886,7 @@ find_fh_dentry(struct knfs_fh *fh) } /* - * Stage 2: Attempt to validate the dentry in the filehandle. + * Stage 2: Attempt to validate the dentry in the file handle. */ dentry = fh->fh_dcookie; recheck: @@ -896,7 +896,7 @@ recheck: if (dir->i_ino == fh->fh_dirino && dir->i_dev == fh->fh_dev) { struct inode * inode = dentry->d_inode; /* - * NFS filehandles must always have an inode, + * NFS file handles must always have an inode, * so we won't accept a negative dentry. */ if (inode && inode->i_ino == fh->fh_ino) { @@ -929,7 +929,7 @@ printk("find_fh_dentry: retried validation successful\n"); /* * Stage 3: Look up the dentry based on the inode and parent inode - * numbers. This should work for all unix-like filesystems ... + * numbers. This should work for all Unix-like filesystems. */ looked_up = 1; dentry = lookup_inode(fh->fh_dev, fh->fh_dirino, fh->fh_ino); @@ -994,7 +994,7 @@ out: /* * Perform sanity checks on the dentry in a client's file handle. * - * Note that the filehandle dentry may need to be freed even after + * Note that the file handle dentry may need to be freed even after * an error return. */ u32 @@ -1033,17 +1033,17 @@ fh_verify(struct svc_rqst *rqstp, struct svc_fh *fhp, int type, int access) nfsd_setuser(rqstp, exp); /* - * Look up the dentry using the NFS fh. + * Look up the dentry using the NFS file handle. */ error = nfserr_stale; dentry = find_fh_dentry(fh); if (!dentry) goto out; /* - * Note: it's possible that the returned dentry won't be the - * one in the filehandle. We can correct the FH for our use, - * but unfortunately the client will keep sending the broken - * one. Hopefully the lookup will keep patching things up.. + * Note: it's possible the returned dentry won't be the one in the + * file handle. We can correct the file handle for our use, but + * unfortunately the client will keep sending the broken one. Let's + * hope the lookup will keep patching things up. */ fhp->fh_dentry = dentry; fhp->fh_export = exp; @@ -1081,7 +1081,7 @@ out: } /* - * Compose a filehandle for an NFS reply. + * Compose a file handle for an NFS reply. * * Note that when first composed, the dentry may not yet have * an inode. In this case a call to fh_update should be made @@ -1121,7 +1121,7 @@ fh_compose(struct svc_fh *fhp, struct svc_export *exp, struct dentry *dentry) } /* - * Update filehandle information after changing a dentry. + * Update file handle information after changing a dentry. */ void fh_update(struct svc_fh *fhp) @@ -1147,7 +1147,7 @@ out: } /* - * Release a filehandle. If the filehandle carries a dentry count, + * Release a file handle. If the file handle carries a dentry count, * we add the dentry to the short-term cache rather than release it. */ void diff --git a/fs/nfsd/nfsproc.c b/fs/nfsd/nfsproc.c index 220ae0bd26a6..677ca3054ae6 100644 --- a/fs/nfsd/nfsproc.c +++ b/fs/nfsd/nfsproc.c @@ -198,7 +198,7 @@ nfsd_proc_create(struct svc_rqst *rqstp, struct nfsd_createargs *argp, dprintk("nfsd: CREATE %d/%ld %s\n", SVCFH_DEV(dirfhp), SVCFH_INO(dirfhp), argp->name); - /* First verify the parent filehandle */ + /* First verify the parent file handle */ nfserr = fh_verify(rqstp, dirfhp, S_IFDIR, MAY_EXEC); if (nfserr) goto done; /* must fh_put dirfhp even on error */ @@ -212,20 +212,20 @@ nfsd_proc_create(struct svc_rqst *rqstp, struct nfsd_createargs *argp, goto done; /* - * Do a lookup to verify the new filehandle. + * Do a lookup to verify the new file handle. */ nfserr = nfsd_lookup(rqstp, dirfhp, argp->name, argp->len, newfhp); if (nfserr) { if (nfserr != nfserr_noent) goto done; /* - * If the new filehandle wasn't verified, we can't tell + * If the new file handle wasn't verified, we can't tell * whether the file exists or not. Time to bail ... */ nfserr = nfserr_acces; if (!newfhp->fh_dverified) { printk(KERN_WARNING - "nfsd_proc_create: filehandle not verified\n"); + "nfsd_proc_create: file handle not verified\n"); goto done; } } diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c index 514316b04b35..82f42c22c739 100644 --- a/fs/nfsd/vfs.c +++ b/fs/nfsd/vfs.c @@ -121,7 +121,7 @@ fs_off_limits(struct super_block *sb) } /* - * Check whether directory is a mount point, but it is alright if + * Check whether directory is a mount point, but it is all right if * this is precisely the local mount point being exported. */ static inline int @@ -178,7 +178,7 @@ printk("nfsd_lookup: %s/%s crossed mount point!\n", dparent->d_name.name, name); } /* - * Note: we compose the filehandle now, but as the + * Note: we compose the file handle now, but as the * dentry may be negative, it may need to be updated. */ fh_compose(resfh, exp, dchild); @@ -611,7 +611,7 @@ nfsd_create(struct svc_rqst *rqstp, struct svc_fh *fhp, if(!dirp->i_op || !dirp->i_op->lookup) goto out; /* - * Check whether the response filehandle has been verified yet. + * Check whether the response file handle has been verified yet. * If it has, the parent directory should already be locked. */ if (!resfhp->fh_dverified) { @@ -679,7 +679,7 @@ nfsd_create(struct svc_rqst *rqstp, struct svc_fh *fhp, write_inode_now(dirp); /* - * Update the filehandle to get the new inode info. + * Update the file handle to get the new inode info. */ fh_update(resfhp); diff --git a/fs/ntfs/attr.c b/fs/ntfs/attr.c index a796f136c9ce..f94dd9dd7e89 100644 --- a/fs/ntfs/attr.c +++ b/fs/ntfs/attr.c @@ -399,7 +399,7 @@ int ntfs_read_compressed(ntfs_inode *ino, ntfs_attribute *attr, int offset, clustersize=ino->vol->clustersize; /* starting cluster of potential chunk there are three situations: - a) in a large uncompressable or sparse chunk, + a) in a large uncompressible or sparse chunk, s_vcn is in the middle of a run b) s_vcn is right on a run border c) when several runs make a chunk, s_vcn is before the chunks diff --git a/fs/ntfs/dir.c b/fs/ntfs/dir.c index 838e5ea5da25..c626035aa478 100644 --- a/fs/ntfs/dir.c +++ b/fs/ntfs/dir.c @@ -419,7 +419,7 @@ static int ntfs_descend(ntfs_iterate_s *walk, ntfs_u8 *start, ntfs_u8 *entry) error=ntfs_getdir_record(walk,nextblock); if(!error && walk->type==DIR_INSERT && (walk->u.flags & ITERATE_SPLIT_DONE)){ - /* split has occured. adjust entry, insert new_entry */ + /* split has occurred. adjust entry, insert new_entry */ NTFS_PUTU32(entry+length-8,walk->newblock); /* reset flags, as the current block might be split again */ walk->u.flags &= ~ITERATE_SPLIT_DONE; diff --git a/fs/ntfs/inode.c b/fs/ntfs/inode.c index d44f9d1de2f4..05c5a047bbc6 100644 --- a/fs/ntfs/inode.c +++ b/fs/ntfs/inode.c @@ -733,7 +733,7 @@ layout_attr(ntfs_attribute* attr,char*buf, int size,int *psize) /* Try to layout ino into store. Return 0 on success, E2BIG if it does not fit, ENOMEM if memory allocation problem, - EOPNOTSUP if beyound our capabilities + EOPNOTSUP if beyond our capabilities */ int layout_inode(ntfs_inode *ino,ntfs_disk_inode *store) diff --git a/fs/ntfs/support.c b/fs/ntfs/support.c index 3361a0cc8d77..1dfe62d5029e 100644 --- a/fs/ntfs/support.c +++ b/fs/ntfs/support.c @@ -96,7 +96,7 @@ void *ntfs_memmove(void *dest, const void *src, ntfs_size_t n) return memmove(dest, src, n); } -/* Warn that an error occured */ +/* Warn that an error occurred. */ void ntfs_error(const char *fmt,...) { va_list ap; diff --git a/fs/pipe.c b/fs/pipe.c index 62ff29c87cc1..0e3c2ff39329 100644 --- a/fs/pipe.c +++ b/fs/pipe.c @@ -188,8 +188,8 @@ static unsigned int pipe_poll(struct file * filp, poll_table * wait) #ifdef FIFO_SUNOS_BRAINDAMAGE /* - * Arggh. Why does SunOS have to have different select() behaviour - * for pipes and fifos? Hate-Hate-Hate. SunOS lacks POLLHUP.. + * Argh! Why does SunOS have to have different select() behaviour + * for pipes and FIFOs? Hate, hate, hate! SunOS lacks POLLHUP. */ static unsigned int fifo_poll(struct file * filp, poll_table * wait) { @@ -293,7 +293,7 @@ static int pipe_rdwr_open(struct inode * inode, struct file * filp) /* * The file_operations structs are not static because they - * are also used in linux/fs/fifo.c to do operations on fifo's. + * are also used in linux/fs/fifo.c to do operations on FIFOs. */ struct file_operations connecting_fifo_fops = { pipe_lseek, diff --git a/fs/proc/Makefile b/fs/proc/Makefile index d01072a4b150..cd488e3289ee 100644 --- a/fs/proc/Makefile +++ b/fs/proc/Makefile @@ -1,11 +1,11 @@ # -# Makefile for the linux proc-filesystem routines. +# Makefile for the Linux proc filesystem routines. # # Note! Dependencies are done automagically by 'make dep', which also # removes any old dependencies. DON'T put your own dependencies here -# unless it's something special (ie not a .c file). +# unless it's something special (not a .c file). # -# Note 2! The CFLAGS definitions are now in the main makefile... +# Note 2! The CFLAGS definitions are now in the main makefile. O_TARGET := proc.o O_OBJS := inode.o root.o base.o generic.o mem.o link.o fd.o array.o \ diff --git a/fs/proc/array.c b/fs/proc/array.c index b6e667426590..0b4ba9b4c52b 100644 --- a/fs/proc/array.c +++ b/fs/proc/array.c @@ -29,7 +29,7 @@ * Yves Arrouye : remove removal of trailing spaces in get_array. * - * Jerome Forissier : added per-cpu time information to /proc/stat + * Jerome Forissier : added per-CPU time information to /proc/stat * and /proc//cpu extension * * - Incorporation and non-SMP safe operation @@ -232,7 +232,7 @@ static int get_kstat(char * buffer) #ifdef __SMP__ len = sprintf(buffer, - "cpu %u %u %u %lu\n", + "CPU %u %u %u %lu\n", kstat.cpu_user, kstat.cpu_nice, kstat.cpu_system, @@ -842,7 +842,7 @@ static int get_stat(int pid, char * buffer) tty_pgrp = -1; /* scale priority and nice values from timeslices to -20..20 */ - /* to make it look like a "normal" unix priority/nice value */ + /* to make it look like a "normal" Unix priority/nice value */ priority = tsk->counter; priority = 20 - (priority * 10 + DEF_PRIORITY / 2) / DEF_PRIORITY; nice = tsk->priority; diff --git a/fs/proc/net.c b/fs/proc/net.c index 2574875697a9..408c8e0d4370 100644 --- a/fs/proc/net.c +++ b/fs/proc/net.c @@ -20,7 +20,7 @@ * Erik Schoenfelder (schoenfr@ibr.cs.tu-bs.de) * /proc/net/snmp. * Alan Cox (gw4pts@gw4pts.ampr.org) 1/95 - * Added Appletalk slots + * Added AppleTalk slots * * proc net directory handling functions */ diff --git a/fs/romfs/Makefile b/fs/romfs/Makefile index 70fd45a4ee8a..80579f8b8c0c 100644 --- a/fs/romfs/Makefile +++ b/fs/romfs/Makefile @@ -1,11 +1,11 @@ # -# Makefile for the linux romfs-filesystem routines. +# Makefile for the linux romfs filesystem routines. # # Note! Dependencies are done automagically by 'make dep', which also # removes any old dependencies. DON'T put your own dependencies here -# unless it's something special (ie not a .c file). +# unless it's something special (not a .c file). # -# Note 2! The CFLAGS definitions are now in the main makefile... +# Note 2! The CFLAGS definitions are now in the main makefile. O_TARGET := romfs.o O_OBJS := inode.o diff --git a/fs/romfs/inode.c b/fs/romfs/inode.c index 7ff34acb16fa..86c9208ad4d6 100644 --- a/fs/romfs/inode.c +++ b/fs/romfs/inode.c @@ -334,7 +334,7 @@ romfs_lookup(struct inode *dir, struct dentry *dentry) maxoff = dir->i_sb->u.romfs_sb.s_maxsize; offset = ntohl(ri.spec) & ROMFH_MASK; - /* ok, now find the file, whose name is in "dentry", in the + /* OK, now find the file whose name is in "dentry" in the * directory specified by "dir". */ name = dentry->d_name.name; diff --git a/fs/stat.c b/fs/stat.c index 94b07c1aa4e4..b552aa68c2b7 100644 --- a/fs/stat.c +++ b/fs/stat.c @@ -92,7 +92,7 @@ static int cp_new_stat(struct inode * inode, struct stat * statbuf) /* * Use minix fs values for the number of direct and indirect blocks. The * count is now exact for the minix fs except that it counts zero blocks. - * Everything is in BLOCK_SIZE'd units until the assignment to + * Everything is in units of BLOCK_SIZE until the assignment to * tmp.st_blksize. */ #define D_B 7 diff --git a/fs/super.c b/fs/super.c index edb850a402be..92b65a04a50f 100644 --- a/fs/super.c +++ b/fs/super.c @@ -5,8 +5,8 @@ * * super.c contains code to handle: - mount structures * - super-block tables. - * - mount systemcall - * - umount systemcall + * - mount system call + * - umount system call * * Added options to /proc/mounts * Torbjörn Lindh (torbjorn.lindh@gopta.se), April 14, 1996. @@ -645,9 +645,9 @@ static int do_umount(kdev_t dev, int unmount_root) /* * Before checking whether the filesystem is still busy, - * make sure the kernel doesn't hold any quotafiles open + * make sure the kernel doesn't hold any quota files open * on the device. If the umount fails, too bad -- there - * are no quotas running anymore. Just turn them on again. + * are no quotas running any more. Just turn them on again. */ DQUOT_OFF(dev); @@ -810,12 +810,12 @@ int fs_may_mount(kdev_t dev) * [21-Mar-97] T.Schoebel-Theuer: Now this can be overridden when * supplying a leading "!" before the dir_name, allowing "stacks" of * mounted filesystems. The stacking will only influence any pathname lookups - * _after_ the mount, but open filedescriptors or working directories that + * _after_ the mount, but open file descriptors or working directories that * are now covered remain valid. For example, when you overmount /home, any * process with old cwd /home/joe will continue to use the old versions, * as long as relative paths are used, but absolute paths like /home/joe/xxx * will go to the new "top of stack" version. In general, crossing a - * mountpoint will always go to the top of stack element. + * mount point will always go to the top of stack element. * Anyone using this new feature must know what he/she is doing. */ diff --git a/fs/ufs/Makefile b/fs/ufs/Makefile index 0a74c36c7ef6..4895c1eebbd3 100644 --- a/fs/ufs/Makefile +++ b/fs/ufs/Makefile @@ -1,11 +1,11 @@ # -# Makefile for the linux ufs-filesystem routines. +# Makefile for the Linux ufs filesystem routines. # # Note! Dependencies are done automagically by 'make dep', which also # removes any old dependencies. DON'T put your own dependencies here -# unless it's something special (ie not a .c file). +# unless it's something special (not a .c file). # -# Note 2! The CFLAGS definitions are now in the main makefile... +# Note 2! The CFLAGS definitions are now in the main makefile. O_TARGET := ufs.o O_OBJS := ufs_dir.o ufs_file.o ufs_inode.o ufs_namei.o \ diff --git a/fs/ufs/ufs_inode.c b/fs/ufs/ufs_inode.c index 2011a0be8e2d..88e260e9f2af 100644 --- a/fs/ufs/ufs_inode.c +++ b/fs/ufs/ufs_inode.c @@ -249,6 +249,8 @@ void ufs_read_inode(struct inode * inode) inode->i_op = &blkdev_inode_operations; } else if (S_ISFIFO(inode->i_mode)) { init_fifo(inode); + } else if (S_ISSOCK(inode->i_mode)) { + /* nothing */ } else { printk("ufs_read_inode: unknown file type 0%o ino %lu dev %d/%d\n", inode->i_mode, inode->i_ino, MAJOR(inode->i_dev), diff --git a/include/asm-alpha/apecs.h b/include/asm-alpha/apecs.h index 8f68e0c95ef1..e65cdc763a8b 100644 --- a/include/asm-alpha/apecs.h +++ b/include/asm-alpha/apecs.h @@ -42,7 +42,7 @@ we can't just use that here, because of header file looping... :-( Window 1 will be used for all DMA from the ISA bus; yes, that does - limit what memory an ISA floppy or soundcard or Ethernet can touch, but + limit what memory an ISA floppy or sound card or Ethernet can touch, but it's also a known limitation on other platforms as well. We use the same technique that is used on INTEL platforms with similar limitation: set MAX_DMA_ADDRESS and clear some pages' DMAable flags during mem_init(). diff --git a/include/asm-alpha/elf.h b/include/asm-alpha/elf.h index 89657ba78f26..8d614e38fdd0 100644 --- a/include/asm-alpha/elf.h +++ b/include/asm-alpha/elf.h @@ -99,7 +99,7 @@ typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG]; } /* This yields a mask that user programs can use to figure out what - instruction set this cpu supports. This is trivial on Alpha, + instruction set this CPU supports. This is trivial on Alpha, but not so on other machines. */ #define ELF_HWCAP \ diff --git a/include/asm-alpha/io.h b/include/asm-alpha/io.h index 3d2eae144e95..176af8744f22 100644 --- a/include/asm-alpha/io.h +++ b/include/asm-alpha/io.h @@ -5,7 +5,7 @@ #include -/* We don't use IO slowdowns on the alpha, but.. */ +/* We don't use IO slowdowns on the Alpha, but.. */ #define __SLOW_DOWN_IO do { } while (0) #define SLOW_DOWN_IO do { } while (0) @@ -242,7 +242,7 @@ extern void outsl (unsigned long port, const void *src, unsigned long count); /* * XXX - We don't have csum_partial_copy_fromio() yet, so we cheat here and * just copy it. The net code will then do the checksum later. Presently - * only used by some shared memory 8390 ethernet cards anyway. + * only used by some shared memory 8390 Ethernet cards anyway. */ #define eth_io_copy_and_sum(skb,src,len,unused) memcpy_fromio((skb)->data,(src),(len)) diff --git a/include/asm-alpha/linux_logo.h b/include/asm-alpha/linux_logo.h new file mode 100644 index 000000000000..f0d015a6f108 --- /dev/null +++ b/include/asm-alpha/linux_logo.h @@ -0,0 +1,69 @@ +/* $Id: linux_logo.h,v 1.2 1998/05/04 14:20:47 jj Exp $ + * include/asm-alpha/linux_logo.h: This is a linux logo + * to be displayed on boot. + * + * Copyright (C) 1996 Larry Ewing (lewing@isc.tamu.edu) + * Copyright (C) 1996 Jakub Jelinek (jj@sunsite.mff.cuni.cz) + * + * You can put anything here, but: + * LINUX_LOGO_COLORS has to be less than 224 + * image size has to be 80x80 + * values have to start from 0x20 + * (i.e. RGB(linux_logo_red[0], + * linux_logo_green[0], + * linux_logo_blue[0]) is color 0x20) + * BW image has to be 80x80 as well, with MS bit + * on the left + * Serial_console ascii image can be any size, + * but should contain %s to display the version + */ + +#include +#include + +#define linux_logo_banner "Linux/AXP version " UTS_RELEASE + +#define LINUX_LOGO_COLORS 221 + +#ifdef INCLUDE_LINUX_LOGO_DATA + +#define INCLUDE_LINUX_LOGO16 +#include + +/* Painted by Johnny Stenback */ + +unsigned char *linux_serial_image __initdata = "\n" +" .u$e.\n" +" .$$$$$:S\n" +" $\"*$/\"*$$\n" +" $.`$ . ^F\n" +" 4k+#+T.$F\n" +" 4P+++\"$\"$\n" +" :R\"+ t$$B\n" +" ___# $$$\n" +" | | R$$k\n" +" dd. | Linux $!$\n" +" ddd | AXP $9$F\n" +" '!!!!!$ !!#!`\n" +" !!!!!* .!!!!!`\n" +"'!!!!!!!W..e$$!!!!!!` %s\n" +" \"~^^~ ^~~^\n" +"\n"; + +#else + +/* prototypes only */ +extern unsigned char linux_logo_red[]; +extern unsigned char linux_logo_green[]; +extern unsigned char linux_logo_blue[]; +extern unsigned char linux_logo[]; +extern unsigned char linux_logo_bw[]; +extern unsigned char linux_logo16_red[]; +extern unsigned char linux_logo16_green[]; +extern unsigned char linux_logo16_blue[]; +extern unsigned char linux_logo16[]; +extern unsigned char *linux_serial_image; + +extern int (*console_show_logo)(void); + +#endif diff --git a/include/asm-alpha/pgtable.h b/include/asm-alpha/pgtable.h index e275fd98039e..96eccb99e73d 100644 --- a/include/asm-alpha/pgtable.h +++ b/include/asm-alpha/pgtable.h @@ -3,9 +3,9 @@ /* * This file contains the functions and defines necessary to modify and use - * the alpha page table tree. + * the Alpha page table tree. * - * This hopefully works with any standard alpha page-size, as defined + * This hopefully works with any standard Alpha page-size, as defined * in (currently 8192). */ #include @@ -14,7 +14,7 @@ #include /* For TASK_SIZE */ #include -/* Caches aren't brain-dead on the alpha. */ +/* Caches aren't brain-dead on the Alpha. */ #define flush_cache_all() do { } while (0) #define flush_cache_mm(mm) do { } while (0) #define flush_cache_range(mm, start, end) do { } while (0) @@ -42,7 +42,7 @@ static inline void reload_context(struct task_struct *task) /* * Use a few helper functions to hide the ugly broken ASN - * numbers on early alpha's (ev4 and ev45) + * numbers on early Alphas (ev4 and ev45) */ #ifdef BROKEN_ASN @@ -126,8 +126,8 @@ static inline void flush_tlb_page(struct vm_area_struct *vma, } /* - * Flush a specified range of user mapping: on the - * alpha we flush the whole user tlb + * Flush a specified range of user mapping: on the + * Alpha we flush the whole user tlb. */ static inline void flush_tlb_range(struct mm_struct *mm, unsigned long start, unsigned long end) @@ -157,7 +157,7 @@ extern void flush_tlb_range(struct mm_struct *, unsigned long, unsigned long); #endif /* __SMP__ */ -/* Certain architectures need to do special things when pte's +/* Certain architectures need to do special things when PTEs * within a page table are directly modified. Thus, the following * hook is made available. */ @@ -174,17 +174,17 @@ extern void flush_tlb_range(struct mm_struct *, unsigned long, unsigned long); #define PGDIR_MASK (~(PGDIR_SIZE-1)) /* - * entries per page directory level: the alpha is three-level, with + * Entries per page directory level: the Alpha is three-level, with * all levels having a one-page page table. * - * The PGD is special: the last entry is reserved for self-mapping. + * The PGD is special: the last entry is reserved for self-mapping. */ #define PTRS_PER_PTE (1UL << (PAGE_SHIFT-3)) #define PTRS_PER_PMD (1UL << (PAGE_SHIFT-3)) #define PTRS_PER_PGD ((1UL << (PAGE_SHIFT-3))-1) #define USER_PTRS_PER_PGD (TASK_SIZE / PGDIR_SIZE) -/* the no. of pointers that fit on a page: this will go away */ +/* Number of pointers that fit on a page: this will go away. */ #define PTRS_PER_PAGE (1UL << (PAGE_SHIFT-3)) #define VMALLOC_START 0xFFFFFE0000000000 @@ -208,7 +208,7 @@ extern void flush_tlb_range(struct mm_struct *, unsigned long, unsigned long); #define _PAGE_ACCESSED 0x40000 /* - * NOTE! The "accessed" bit isn't necessarily exact: it can be kept exactly + * NOTE! The "accessed" bit isn't necessarily exact: it can be kept exactly * by software (use the KRE/URE/KWE/UWE bits appropriately), but I'll fake it. * Under Linux/AXP, the "accessed" bit just means "read", and I'll just use * the KRE/URE bits to watch for it. That way we don't need to overload the @@ -242,7 +242,7 @@ extern void flush_tlb_range(struct mm_struct *, unsigned long, unsigned long); #define _PAGE_S(x) _PAGE_NORMAL(x) /* - * The hardware can handle write-only mappings, but as the alpha + * The hardware can handle write-only mappings, but as the Alpha * architecture does byte-wide writes with a read-modify-write * sequence, it's not practical to have write-without-read privs. * Thus the "-w- -> rw-" and "-wx -> rwx" mapping here (and in @@ -271,7 +271,7 @@ extern void flush_tlb_range(struct mm_struct *, unsigned long, unsigned long); * BAD_PAGETABLE is used when we need a bogus page-table, while * BAD_PAGE is used for a bogus page. * - * ZERO_PAGE is a global shared page that is always zero: used + * ZERO_PAGE is a global shared page that is always zero: used * for zero-mapped memory areas etc.. */ extern pte_t __bad_page(void); @@ -297,7 +297,7 @@ extern unsigned long __zero_page(void); ((unsigned long)(address)>>(PAGE_SHIFT-SIZEOF_PTR_LOG2)&PTR_MASK&~PAGE_MASK) /* - * Conversion functions: convert a page and protection to a page entry, + * Conversion functions: convert a page and protection to a page entry, * and a page entry and page directory to the page they refer to. */ extern inline pte_t mk_pte(unsigned long page, pgprot_t pgprot) @@ -576,7 +576,7 @@ extern inline void set_pgdir(unsigned long address, pgd_t entry) extern pgd_t swapper_pg_dir[1024]; /* - * The alpha doesn't have any external MMU info: the kernel page + * The Alpha doesn't have any external MMU info: the kernel page * tables contain all the necessary information. */ extern inline void update_mmu_cache(struct vm_area_struct * vma, @@ -585,8 +585,8 @@ extern inline void update_mmu_cache(struct vm_area_struct * vma, } /* - * Non-present pages: high 24 bits are offset, next 8 bits type, - * low 32 bits zero.. + * Non-present pages: high 24 bits are offset, next 8 bits type, + * low 32 bits zero. */ extern inline pte_t mk_swap_pte(unsigned long type, unsigned long offset) { pte_t pte; pte_val(pte) = (type << 32) | (offset << 40); return pte; } diff --git a/include/asm-alpha/signal.h b/include/asm-alpha/signal.h index 7c67490607aa..501f35ea5c17 100644 --- a/include/asm-alpha/signal.h +++ b/include/asm-alpha/signal.h @@ -176,7 +176,7 @@ typedef struct sigaltstack { /* sigstack(2) is deprecated, and will be withdrawn in a future version of the X/Open CAE Specification. Use sigaltstack instead. It is only - implemented here for OSF/1 compatability. */ + implemented here for OSF/1 compatibility. */ struct sigstack { void *ss_sp; diff --git a/include/asm-alpha/t2.h b/include/asm-alpha/t2.h index 02ff0deb2e26..09face466687 100644 --- a/include/asm-alpha/t2.h +++ b/include/asm-alpha/t2.h @@ -554,7 +554,7 @@ struct el_t2_data_memory { /* - * Sable other cpu error frame - sable pfms section 3.43 + * Sable other CPU error frame - sable pfms section 3.43 */ struct el_t2_data_other_cpu { short elco_cpuid; /* CPU ID */ @@ -578,7 +578,7 @@ struct el_t2_data_other_cpu { }; /* - * Sable other cpu error frame - sable pfms section 3.44 + * Sable other CPU error frame - sable pfms section 3.44 */ struct el_t2_data_t2{ struct el_t2_frame_header elct_hdr; /* ID$T2-FRAME */ diff --git a/include/asm-alpha/uaccess.h b/include/asm-alpha/uaccess.h index 5ab23c062ebf..665acc31363c 100644 --- a/include/asm-alpha/uaccess.h +++ b/include/asm-alpha/uaccess.h @@ -161,7 +161,7 @@ struct __large_struct { unsigned long buf[100]; }; : "m"(__m(addr)), "1"(__gu_err)) #ifdef __HAVE_CPU_BWX -/* Those lucky bastards with ev56 and later cpus can do byte/word moves. */ +/* Those lucky bastards with ev56 and later CPUs can do byte/word moves. */ #define __get_user_16(addr) \ __asm__("1: ldwu %0,%2\n" \ @@ -275,7 +275,7 @@ __asm__ __volatile__("1: stl %r2,%1\n" \ : "m"(__m(addr)), "rJ"(x), "0"(__pu_err)) #ifdef __HAVE_CPU_BWX -/* Those lucky bastards with ev56 and later cpus can do byte/word moves. */ +/* Those lucky bastards with ev56 and later CPUs can do byte/word moves. */ #define __put_user_16(x,addr) \ __asm__ __volatile__("1: stw %r2,%1\n" \ diff --git a/include/asm-i386/bugs.h b/include/asm-i386/bugs.h index af144354f6d7..fbaab052ac3b 100644 --- a/include/asm-i386/bugs.h +++ b/include/asm-i386/bugs.h @@ -83,7 +83,7 @@ __initfunc(static void check_fpu(void)) if (fpu_error) return; if (!ignore_irq13) { - printk("Ok, fpu using old IRQ13 error reporting\n"); + printk("OK, FPU using old IRQ 13 error reporting\n"); return; } __asm__("fninit\n\t" @@ -98,9 +98,9 @@ __initfunc(static void check_fpu(void)) : "=m" (*&boot_cpu_data.fdiv_bug) : "m" (*&x), "m" (*&y)); if (!boot_cpu_data.fdiv_bug) - printk("Ok, fpu using exception 16 error reporting.\n"); + printk("OK, FPU using exception 16 error reporting.\n"); else - printk("Hmm, fpu using exception 16 error reporting with FDIV bug.\n"); + printk("Hmm, FPU using exception 16 error reporting with FDIV bug.\n"); } __initfunc(static void check_hlt(void)) @@ -111,7 +111,7 @@ __initfunc(static void check_hlt(void)) return; } __asm__ __volatile__("hlt ; hlt ; hlt ; hlt"); - printk("Ok.\n"); + printk("OK.\n"); } __initfunc(static void check_tlb(void)) @@ -145,9 +145,9 @@ __initfunc(static void check_popad(void)) : "=eax" (res) : "edx" (inp) : "eax", "ecx", "edx", "edi" ); - /* If this fails, it means that any user program may lock CPU hard. Too bad. */ + /* If this fails, it means that any user program may lock the CPU hard. Too bad. */ if (res != 12345678) printk( "Buggy.\n" ); - else printk( "Ok.\n" ); + else printk( "OK.\n" ); #endif } diff --git a/include/asm-i386/elf.h b/include/asm-i386/elf.h index 700bb823344e..65a74c5cb038 100644 --- a/include/asm-i386/elf.h +++ b/include/asm-i386/elf.h @@ -71,7 +71,7 @@ typedef struct user_i387_struct elf_fpregset_t; pr_reg[16] = regs->xss; /* This yields a mask that user programs can use to figure out what - instruction set this cpu supports. This could be done in userspace, + instruction set this CPU supports. This could be done in user space, but it's not easy, and we've already done it here. */ #define ELF_HWCAP (boot_cpu_data.x86_capability) diff --git a/include/asm-i386/linux_logo.h b/include/asm-i386/linux_logo.h new file mode 100644 index 000000000000..83a0b502bc44 --- /dev/null +++ b/include/asm-i386/linux_logo.h @@ -0,0 +1,92 @@ +/* $Id: linux_logo.h,v 1.3 1998/06/07 21:49:54 geert Exp $ + * include/asm-i386/linux_logo.h: This is a linux logo + * to be displayed on boot. + * + * Copyright (C) 1996 Larry Ewing (lewing@isc.tamu.edu) + * Copyright (C) 1996 Jakub Jelinek (jj@sunsite.mff.cuni.cz) + * + * You can put anything here, but: + * LINUX_LOGO_COLORS has to be less than 224 + * image size has to be 80x80 + * values have to start from 0x20 + * (i.e. RGB(linux_logo_red[0], + * linux_logo_green[0], + * linux_logo_blue[0]) is color 0x20) + * BW image has to be 80x80 as well, with MS bit + * on the left + * Serial_console ascii image can be any size, + * but should contain %s to display the version + */ + +#include +#include + +#define linux_logo_banner "Linux/ia32 version " UTS_RELEASE + +#define LINUX_LOGO_COLORS 221 + +#ifdef INCLUDE_LINUX_LOGO_DATA + +#define INCLUDE_LINUX_LOGO16 +#include + +/* Painted by Johnny Stenback */ + +unsigned char *linux_serial_image __initdata = "\n" +" .u$e.\n" +" .$$$$$:S\n" +" $\"*$/\"*$$\n" +" $.`$ . ^F\n" +" 4k+#+T.$F\n" +" 4P+++\"$\"$\n" +" :R\"+ t$$B\n" +" ___# $$$\n" +" | | R$$k\n" +" dd. | Linux $!$\n" +" ddd | ia32 $9$F\n" +" '!!!!!$ !!#!`\n" +" !!!!!* .!!!!!`\n" +"'!!!!!!!W..e$$!!!!!!`\n" +" \"~^^~ ^~~^\n" +"\n"; + +/* The following created by Andrew Apted, May 1998 */ + +unsigned char *linux_mda_image __initdata = "\n" +"LINUX/IA32..........................\n" +":::::::::::::: ::::::::::::::\n" +":::::::::::: :::::::::::\n" +":::::::::::: ## ## :::::::::::\n" +":::::::::::: # xxxx ## :::::::::::\n" +":::::::::::: xxxxxxxxx ::::::::::\n" +":::::::::::: ##xxx#### :::::::::\n" +"::::::::::: ########### ::::::::\n" +"::::::::: ############# ::::::\n" +":::::::: ############### :::::\n" +":::::: ################# ::::\n" +":::::: ################## ::::\n" +":::::xxx################## ::::\n" +":::xxxxxx #############xxx xxx:::\n" +"xxxxxxxxxxx ##########xxxxxxxxxx::\n" +"xxxxxxxxxxxx ########## xxxxxxxxxxxx\n" +"xxxxxxxxxxxxx####### xxxxxxxxxxx:\n" +":::::xxxxxxxx:::::::::::xxxxxx::::::\n\n"; + +#else + +/* prototypes only */ +extern unsigned char linux_logo_red[]; +extern unsigned char linux_logo_green[]; +extern unsigned char linux_logo_blue[]; +extern unsigned char linux_logo[]; +extern unsigned char linux_logo_bw[]; +extern unsigned char linux_logo16_red[]; +extern unsigned char linux_logo16_green[]; +extern unsigned char linux_logo16_blue[]; +extern unsigned char linux_logo16[]; +extern unsigned char *linux_serial_image; +extern unsigned char *linux_mda_image; + +extern int (*console_show_logo)(void); + +#endif diff --git a/include/asm-i386/pgtable.h b/include/asm-i386/pgtable.h index e7bca0700f7e..d2387b6f8f43 100644 --- a/include/asm-i386/pgtable.h +++ b/include/asm-i386/pgtable.h @@ -161,7 +161,7 @@ static inline void flush_tlb_range(struct mm_struct *mm, #endif /* !__ASSEMBLY__ */ -/* Certain architectures need to do special things when pte's +/* Certain architectures need to do special things when PTEs * within a page table are directly modified. Thus, the following * hook is made available. */ diff --git a/include/asm-i386/smp.h b/include/asm-i386/smp.h index aeef2ba558e2..0006d497eb96 100644 --- a/include/asm-i386/smp.h +++ b/include/asm-i386/smp.h @@ -183,7 +183,7 @@ extern inline int cpu_logical_map(int cpu) extern void smp_callin(void); extern void smp_boot_cpus(void); -extern void smp_store_cpu_info(int id); /* Store per cpu info (like the initial udelay numbers */ +extern void smp_store_cpu_info(int id); /* Store per CPU info (like the initial udelay numbers */ extern void smp_message_pass(int target, int msg, unsigned long data, int wait); extern volatile unsigned long smp_proc_in_lock[NR_CPUS]; /* for computing process time */ diff --git a/include/asm-i386/softirq.h b/include/asm-i386/softirq.h index 008edf305e9b..f77cce80a743 100644 --- a/include/asm-i386/softirq.h +++ b/include/asm-i386/softirq.h @@ -50,7 +50,7 @@ static inline void end_bh_atomic(void) atomic_dec(&global_bh_lock); } -/* These are for the irq's testing the lock */ +/* These are for the IRQs testing the lock */ static inline int softirq_trylock(int cpu) { if (!test_and_set_bit(0,&global_bh_count)) { diff --git a/include/asm-i386/string.h b/include/asm-i386/string.h index df02f7809d2e..65d72fabfbea 100644 --- a/include/asm-i386/string.h +++ b/include/asm-i386/string.h @@ -403,7 +403,7 @@ extern inline void * __constant_memcpy(void * to, const void * from, size_t n) case 4: *(unsigned long *)to = *(const unsigned long *)from; return to; - case 6: /* for ethernet addresses */ + case 6: /* for Ethernet addresses */ *(unsigned long *)to = *(const unsigned long *)from; *(2+(unsigned short *)to) = *(2+(const unsigned short *)from); return to; diff --git a/include/asm-i386/vm86.h b/include/asm-i386/vm86.h index c541bb01efa7..40ec82c6914d 100644 --- a/include/asm-i386/vm86.h +++ b/include/asm-i386/vm86.h @@ -60,7 +60,7 @@ #define VM86_GET_AND_RESET_IRQ 6 /* - * This is the stack-layout seen by the user space programm when we have + * This is the stack-layout seen by the user space program when we have * done a translation of "SAVE_ALL" from vm86 mode. The real kernel layout * is 'kernel_vm86_regs' (see below). */ diff --git a/include/linux/atalk.h b/include/linux/atalk.h index 4981ed2eb4d5..ad922882f0d5 100644 --- a/include/linux/atalk.h +++ b/include/linux/atalk.h @@ -1,5 +1,5 @@ /* - * Appletalk networking structures + * AppleTalk networking structures * * The following are directly referenced from the University Of Michigan * netatalk for compatibility reasons. @@ -108,7 +108,7 @@ struct ddpshdr /* And netatalk apps expect to stick the type in themselves */ }; -/* Appletalk AARP headers */ +/* AppleTalk AARP headers */ struct elapaarp { diff --git a/include/linux/blk.h b/include/linux/blk.h index c4a31be95a6b..e069791f2b22 100644 --- a/include/linux/blk.h +++ b/include/linux/blk.h @@ -137,8 +137,8 @@ static void floppy_off(unsigned int nr); #elif (MAJOR_NR == HD_MAJOR) -/* harddisk: timeout is 6 seconds.. */ -#define DEVICE_NAME "harddisk" +/* Hard disk: timeout is 6 seconds. */ +#define DEVICE_NAME "hard disk" #define DEVICE_INTR do_hd #define DEVICE_TIMEOUT HD_TIMER #define TIMEOUT_VALUE (6*HZ) @@ -292,7 +292,7 @@ static void floppy_off(unsigned int nr); #define DEVICE_OFF(device) #elif (MAJOR_NR == CM206_CDROM_MAJOR) -#define DEVICE_NAME "Philips/LMS cd-rom cm206" +#define DEVICE_NAME "Philips/LMS CD-ROM cm206" #define DEVICE_REQUEST do_cm206_request #define DEVICE_NR(device) (MINOR(device)) #define DEVICE_ON(device) diff --git a/include/linux/bpqether.h b/include/linux/bpqether.h index cc7d35831687..a6c35e1a89ad 100644 --- a/include/linux/bpqether.h +++ b/include/linux/bpqether.h @@ -20,7 +20,7 @@ struct bpq_ethaddr { /* * For SIOCSBPQETHOPT - this is compatible with PI2/PacketTwin card drivers, * currently not implemented, though. If someone wants to hook a radio - * to his ethernet card he may find this useful... ;-) + * to his Ethernet card he may find this useful. ;-) */ #define SIOCGBPQETHPARAM 0x5000 /* get Level 1 parameters */ diff --git a/include/linux/byteorder/generic.h b/include/linux/byteorder/generic.h index 633f7b90ae61..5200dc1ad7ba 100644 --- a/include/linux/byteorder/generic.h +++ b/include/linux/byteorder/generic.h @@ -55,7 +55,7 @@ * __constant_htons(__u16 x) * * Conversion of XX-bit integers (16- 32- or 64-) - * between native cpu format and little/big endian format + * between native CPU format and little/big endian format * 64-bit stuff only defined for proper architectures * cpu_to_[bl]eXX(__uXX x) * [bl]eXX_to_cpu(__uXX x) diff --git a/include/linux/byteorder/swab.h b/include/linux/byteorder/swab.h index 8110bfb85bee..7c1f5c985ba2 100644 --- a/include/linux/byteorder/swab.h +++ b/include/linux/byteorder/swab.h @@ -3,7 +3,7 @@ /* * linux/byteorder/swab.h - * Byteswapping, independently from cpu endianness + * Byte-swapping, independently from CPU endianness * swabXX[ps]?(foo) * * Francois-Rene Rideau 19971205 diff --git a/include/linux/coda.h b/include/linux/coda.h index 9cdf0d04b8cb..8b9a7ec286d1 100644 --- a/include/linux/coda.h +++ b/include/linux/coda.h @@ -1,4 +1,3 @@ - /* * * Based on cfs.h from Mach, but revamped for increased simplicity. diff --git a/include/linux/console.h b/include/linux/console.h index e287e64d5fe9..f2fc423cf306 100644 --- a/include/linux/console.h +++ b/include/linux/console.h @@ -27,24 +27,29 @@ struct vc_data; /* DPC: 1994-04-13 !!! con_putcs is new entry !!! */ struct consw { - unsigned long (*con_startup)(unsigned long, const char **); - void (*con_init)(struct vc_data *); - int (*con_deinit)(struct vc_data *); - int (*con_clear)(struct vc_data *, int, int, int, int); - int (*con_putc)(struct vc_data *, int, int, int); - int (*con_putcs)(struct vc_data *, const char *, int, int, int); - int (*con_cursor)(struct vc_data *, int); - int (*con_scroll)(struct vc_data *, int, int, int, int); - int (*con_bmove)(struct vc_data *, int, int, int, int, int, int); - int (*con_switch)(struct vc_data *); - int (*con_blank)(int); - int (*con_get_font)(struct vc_data *, int *, int *, char *); - int (*con_set_font)(struct vc_data *, int, int, char *); - int (*con_set_palette)(struct vc_data *, unsigned char *); + unsigned long (*con_startup)(unsigned long, const char **); + void (*con_init)(struct vc_data *); + void (*con_deinit)(struct vc_data *); + void (*con_clear)(struct vc_data *, int, int, int, int); + void (*con_putc)(struct vc_data *, int, int, int); + void (*con_putcs)(struct vc_data *, const char *, int, int, int); + void (*con_cursor)(struct vc_data *, int); + void (*con_scroll)(struct vc_data *, int, int, int, int); + void (*con_bmove)(struct vc_data *, int, int, int, int, int, int); + int (*con_switch)(struct vc_data *); + int (*con_blank)(int); + int (*con_get_font)(struct vc_data *, int *, int *, char *); + int (*con_set_font)(struct vc_data *, int, int, char *); + int (*con_set_palette)(struct vc_data *, unsigned char *); + int (*con_scrolldelta)(struct vc_data *, int); }; extern struct consw *conswitchp; +extern struct consw fb_con; /* frame buffer based console */ +extern struct consw vga_con; /* VGA text console */ +extern struct consw compat_con; /* console wrapper */ + /* flag bits */ #define CON_INITED (1) @@ -102,4 +107,10 @@ extern void register_console(struct console *); extern int unregister_console(struct console *); extern struct console *console_drivers; +/* VEA Blanking Levels */ +#define VESA_NO_BLANKING 0 +#define VESA_VSYNC_SUSPEND 1 +#define VESA_HSYNC_SUSPEND 2 +#define VESA_POWERDOWN 3 + #endif /* linux/console.h */ diff --git a/include/linux/console_compat.h b/include/linux/console_compat.h new file mode 100644 index 000000000000..a28fed4f321b --- /dev/null +++ b/include/linux/console_compat.h @@ -0,0 +1,163 @@ +/* + * linux/include/linux/console_compat.h -- Abstract console wrapper + * + * Copyright (C) 1998 Geert Uytterhoeven + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file COPYING in the main directory of this archive + * for more details. + */ + +#ifndef _LINUX_CONSOLE_COMPAT_H_ +#define _LINUX_CONSOLE_COMPAT_H_ + +#undef video_num_columns +#undef video_num_lines +#undef video_size_row +#undef video_type +#undef video_mem_base +#undef video_mem_term +#undef video_screen_size +#undef can_do_color +#undef scr_writew +#undef scr_readw +#undef memsetw +#undef memcpyw +#undef set_cursor +#undef hide_cursor +#undef set_get_cmap +#undef set_palette +#undef set_get_font +#undef set_vesa_blanking +#undef vesa_blank +#undef vesa_powerdown +#undef con_adjust_height +#undef con_type_init +#undef con_type_init_finish + +#define video_num_columns compat_video_num_columns +#define video_num_lines compat_video_num_lines +#define video_size_row compat_video_size_row +#define video_type compat_video_type +#define video_mem_base compat_video_mem_base +#define video_mem_term compat_video_mem_term +#define video_screen_size compat_video_screen_size +#define can_do_color compat_can_do_color +#define scr_writew compat_scr_writew +#define scr_readw compat_scr_readw +#define memsetw compat_memsetw +#define memcpyw compat_memcpyw +#define set_cursor compat_set_cursor +#define hide_cursor compat_hide_cursor +#define set_get_cmap compat_set_get_cmap +#define set_palette compat_set_palette +#define set_get_font compat_set_get_font +#define set_vesa_blanking compat_set_vesa_blanking +#define vesa_blank compat_vesa_blank +#define vesa_powerdown compat_vesa_powerdown +#define con_adjust_height compat_con_adjust_height +#define con_type_init compat_con_type_init +#define con_type_init_finish compat_con_type_init_finish + +extern unsigned long compat_video_num_columns; +extern unsigned long compat_video_num_lines; +extern unsigned long compat_video_size_row; +extern unsigned char compat_video_type; +extern unsigned long compat_video_mem_base; +extern unsigned long compat_video_mem_term; +extern unsigned long compat_video_screen_size; +extern int compat_can_do_color; +extern void compat_set_cursor(int currcons); +extern void compat_hide_cursor(void); +extern int compat_set_get_cmap(unsigned char *arg, int set); +extern void compat_set_palette(void); +extern int compat_set_get_font(unsigned char * arg, int set, int ch512); +extern void compat_set_vesa_blanking(unsigned long arg); +extern void compat_vesa_blank(void); +extern void compat_vesa_powerdown(void); +extern int compat_con_adjust_height(unsigned long fontheight); +extern void compat_con_type_init(const char **); +extern void compat_con_type_init_finish(void); + +#if defined(CONFIG_SUN_CONSOLE) + void (*memsetw)(void *, unsigned short, unsigned int); + void (*memcpyw)(unsigned short *, unsigned short *, unsigned int); + void (*scr_writew)(unsigned short, unsigned short *); + unsigned short (*scr_readw)(unsigned short *); + void (*get_scrmem)(int); + void (*set_scrmem)(int, long); + void (*set_origin)(unsigned short); + void (*hide_cursor)(void); + void (*set_cursor)(int); + int (*set_get_font)(char *, int, int); + int (*con_adjust_height)(unsigned long); + int (*set_get_cmap)(unsigned char *, int); + void (*set_palette)(void); + void (*set_other_palette)(int); + void (*console_restore_palette)(void); + void (*con_type_init)(const char **); + void (*con_type_init_finish)(void); + + /* VESA powerdown methods */ + void (*vesa_blank)(void); + void (*vesa_unblank)(void); + void (*set_vesa_blanking)(const unsigned long); + void (*vesa_powerdown)(void); + + void (*clear_screen)(void); + void (*render_screen)(void); + void (*clear_margin)(void); +}; + +#define compat_memsetw(s,c,count) suncons_ops.memsetw((s),(c),(count)) +#define compat_memcpyw(to,from,count) suncons_ops.memcpyw((to),(from),(count)) +#define compat_scr_writew(val,addr) suncons_ops.scr_writew((val),(addr)) +#define compat_scr_readw(addr) suncons_ops.scr_readw((addr)) + +#elif defined(CONFIG_PMAC_CONSOLE) +extern void pmac_blitc(unsigned, unsigned long); +extern void compat_memsetw(unsigned short *p, unsigned short c, unsigned count); +extern void compat_memcpyw(unsigned short *to, unsigned short *from, unsigned count); + +static inline void compat_scr_writew(unsigned short val, unsigned short * addr) +{ + if ((unsigned long)addr < video_mem_term && + (unsigned long)addr >= video_mem_base) { + if (*addr != val) { + *addr = val; + pmac_blitc(val, (unsigned long) addr); + } + } else + *addr = val; +} + +static inline unsigned short compat_scr_readw(unsigned short * addr) +{ + return *addr; +} +#endif + +#if !defined(CONFIG_SUN_CONSOLE) && !defined(CONFIG_PMAC_CONSOLE) +static inline void compat_memsetw(void * s, unsigned short c, unsigned int count) +{ + unsigned short * addr = (unsigned short *) s; + + count /= 2; + while (count) { + count--; + scr_writew(c, addr++); + } +} + +static inline void compat_memcpyw(unsigned short *to, unsigned short *from, + unsigned int count) +{ + count /= 2; + while (count) { + count--; + scr_writew(scr_readw(from++), to++); + } +} +#endif + +#endif /* _LINUX_CONSOLE_COMPAT_H_ */ diff --git a/include/linux/console_struct.h b/include/linux/console_struct.h index 99ed0e347ee3..5eb9928dc11a 100644 --- a/include/linux/console_struct.h +++ b/include/linux/console_struct.h @@ -4,11 +4,22 @@ * Data structure and defines shared between console.c, vga.c and tga.c */ +/* + * You can set here how should the cursor look by default. + * In case you set CONFIG_SOFTCURSOR, this might be really interesting. + */ +#define CUR_DEFAULT CUR_UNDERLINE + #include #define NPAR 16 struct vc_data { + unsigned short vc_num; /* Console number */ + unsigned long vc_cols; + unsigned long vc_rows; + unsigned long vc_size_row; + struct consw *vc_sw; unsigned long vc_screenbuf_size; unsigned short vc_video_erase_char; /* Background erase character */ unsigned char vc_attr; /* Current attributes */ @@ -23,13 +34,8 @@ struct vc_data { unsigned long vc_top,vc_bottom; unsigned long vc_state; unsigned long vc_npar,vc_par[NPAR]; -#ifdef CONFIG_FB_CONSOLE - unsigned short *vc_video_mem_start; /* Start of video RAM */ - unsigned short *vc_pos; -#else unsigned long vc_pos; unsigned long vc_video_mem_start; /* Start of video RAM */ -#endif unsigned long vc_video_mem_end; /* End of video RAM (sort of) */ unsigned long vc_saved_x; unsigned long vc_saved_y; @@ -72,6 +78,7 @@ struct vc_data { unsigned char vc_saved_G1; unsigned int vc_bell_pitch; /* Console bell pitch */ unsigned int vc_bell_duration; /* Console bell duration */ + unsigned int vc_cursor_type; /* additional information is in vt_kern.h */ }; @@ -85,65 +92,12 @@ struct vc { extern struct vc vc_cons [MAX_NR_CONSOLES]; -#define screenbuf_size (vc_cons[currcons].d->vc_screenbuf_size) -#define origin (vc_cons[currcons].d->vc_origin) -#define scr_end (vc_cons[currcons].d->vc_scr_end) -#define pos (vc_cons[currcons].d->vc_pos) -#define top (vc_cons[currcons].d->vc_top) -#define bottom (vc_cons[currcons].d->vc_bottom) -#define x (vc_cons[currcons].d->vc_x) -#define y (vc_cons[currcons].d->vc_y) -#define vc_state (vc_cons[currcons].d->vc_state) -#define npar (vc_cons[currcons].d->vc_npar) -#define par (vc_cons[currcons].d->vc_par) -#define ques (vc_cons[currcons].d->vc_ques) -#define attr (vc_cons[currcons].d->vc_attr) -#define saved_x (vc_cons[currcons].d->vc_saved_x) -#define saved_y (vc_cons[currcons].d->vc_saved_y) -#define translate (vc_cons[currcons].d->vc_translate) -#define G0_charset (vc_cons[currcons].d->vc_G0_charset) -#define G1_charset (vc_cons[currcons].d->vc_G1_charset) -#define saved_G0 (vc_cons[currcons].d->vc_saved_G0) -#define saved_G1 (vc_cons[currcons].d->vc_saved_G1) -#define utf (vc_cons[currcons].d->vc_utf) -#define utf_count (vc_cons[currcons].d->vc_utf_count) -#define utf_char (vc_cons[currcons].d->vc_utf_char) -#define video_mem_start (vc_cons[currcons].d->vc_video_mem_start) -#define video_mem_end (vc_cons[currcons].d->vc_video_mem_end) -#define video_erase_char (vc_cons[currcons].d->vc_video_erase_char) -#define disp_ctrl (vc_cons[currcons].d->vc_disp_ctrl) -#define toggle_meta (vc_cons[currcons].d->vc_toggle_meta) -#define decscnm (vc_cons[currcons].d->vc_decscnm) -#define decom (vc_cons[currcons].d->vc_decom) -#define decawm (vc_cons[currcons].d->vc_decawm) -#define deccm (vc_cons[currcons].d->vc_deccm) -#define decim (vc_cons[currcons].d->vc_decim) -#define deccolm (vc_cons[currcons].d->vc_deccolm) -#define need_wrap (vc_cons[currcons].d->vc_need_wrap) -#define has_scrolled (vc_cons[currcons].d->vc_has_scrolled) -#define kmalloced (vc_cons[currcons].d->vc_kmalloced) -#define report_mouse (vc_cons[currcons].d->vc_report_mouse) -#define color (vc_cons[currcons].d->vc_color) -#define s_color (vc_cons[currcons].d->vc_s_color) -#define def_color (vc_cons[currcons].d->vc_def_color) -#define foreground (color & 0x0f) -#define background (color & 0xf0) -#define charset (vc_cons[currcons].d->vc_charset) -#define s_charset (vc_cons[currcons].d->vc_s_charset) -#define intensity (vc_cons[currcons].d->vc_intensity) -#define underline (vc_cons[currcons].d->vc_underline) -#define blink (vc_cons[currcons].d->vc_blink) -#define reverse (vc_cons[currcons].d->vc_reverse) -#define s_intensity (vc_cons[currcons].d->vc_s_intensity) -#define s_underline (vc_cons[currcons].d->vc_s_underline) -#define s_blink (vc_cons[currcons].d->vc_s_blink) -#define s_reverse (vc_cons[currcons].d->vc_s_reverse) -#define ulcolor (vc_cons[currcons].d->vc_ulcolor) -#define halfcolor (vc_cons[currcons].d->vc_halfcolor) -#define tab_stop (vc_cons[currcons].d->vc_tab_stop) -#define palette (vc_cons[currcons].d->vc_palette) -#define bell_pitch (vc_cons[currcons].d->vc_bell_pitch) -#define bell_duration (vc_cons[currcons].d->vc_bell_duration) - -#define vcmode (vt_cons[currcons]->vc_mode) -#define structsize (sizeof(struct vc_data) + sizeof(struct vt_struct)) +#define CUR_DEF 0 +#define CUR_NONE 1 +#define CUR_UNDERLINE 2 +#define CUR_LOWER_THIRD 3 +#define CUR_LOWER_HALF 4 +#define CUR_TWO_THIRDS 5 +#define CUR_BLOCK 6 +#define CUR_HWMASK 0x0f +#define CUR_SWMASK 0xfff0 diff --git a/include/linux/elf.h b/include/linux/elf.h index af8ecfca027c..7c0c6542fd52 100644 --- a/include/linux/elf.h +++ b/include/linux/elf.h @@ -127,8 +127,8 @@ typedef __u64 Elf64_Word; #define AT_EUID 12 /* effective uid */ #define AT_GID 13 /* real gid */ #define AT_EGID 14 /* effective gid */ -#define AT_PLATFORM 15 /* string identifying cpu for optimizations */ -#define AT_HWCAP 16 /* arch dependent hints at cpu capabilities */ +#define AT_PLATFORM 15 /* string identifying CPU for optimizations */ +#define AT_HWCAP 16 /* arch dependent hints at CPU capabilities */ typedef struct dynamic{ Elf32_Sword d_tag; @@ -206,7 +206,7 @@ typedef struct { /* Bits present in AT_HWCAP, primarily for Sparc32. */ -#define HWCAP_SPARC_FLUSH 1 /* The cpu supports flush insn. */ +#define HWCAP_SPARC_FLUSH 1 /* CPU supports flush instruction. */ #define HWCAP_SPARC_STBAR 2 #define HWCAP_SPARC_SWAP 4 #define HWCAP_SPARC_MULDIV 8 diff --git a/include/linux/fb.h b/include/linux/fb.h index 60b6b77279cd..b4fa65de372d 100644 --- a/include/linux/fb.h +++ b/include/linux/fb.h @@ -30,6 +30,8 @@ #define FB_TYPE_PACKED_PIXELS 0 /* Packed Pixels */ #define FB_TYPE_PLANES 1 /* Non interleaved planes */ #define FB_TYPE_INTERLEAVED_PLANES 2 /* Interleaved planes */ +#define FB_TYPE_VGA_TEXT 3 /* VGA text/attributes */ +#define FB_TYPE_S3_MMIO_TEXT 4 /* S3 MMIO text */ #define FB_VISUAL_MONO01 0 /* Monochr. 1=Black 0=White */ #define FB_VISUAL_MONO10 1 /* Monochr. 1=White 0=Black */ @@ -37,11 +39,23 @@ #define FB_VISUAL_PSEUDOCOLOR 3 /* Pseudo color (like atari) */ #define FB_VISUAL_DIRECTCOLOR 4 /* Direct color */ #define FB_VISUAL_STATIC_PSEUDOCOLOR 5 /* Pseudo color readonly */ -#define FB_VISUAL_STATIC_DIRECTCOLOR 6 /* Direct color readonly */ + +#define FB_ACCEL_NONE 0 /* no hardware accelerator */ +#define FB_ACCEL_ATARIBLITT 1 /* Atari Blitter */ +#define FB_ACCEL_AMIGABLITT 2 /* Amiga Blitter */ +#define FB_ACCEL_S3_TRIO64 3 /* Cybervision64 (S3 Trio64) */ +#define FB_ACCEL_NCR_77C32BLT 4 /* RetinaZ3 (NCR 77C32BLT) */ +#define FB_ACCEL_S3_VIRGE 5 /* Cybervision64/3D (S3 ViRGE) */ +#define FB_ACCEL_ATI_MACH64GX 6 /* ATI Mach 64GX family */ +#define FB_ACCEL_DEC_TGA 7 /* DEC 21030 TGA */ +#define FB_ACCEL_ATI_MACH64CT 8 /* ATI Mach 64CT family */ +#define FB_ACCEL_ATI_MACH64VT 9 /* ATI Mach 64CT family VT class */ +#define FB_ACCEL_ATI_MACH64GT 10 /* ATI Mach 64CT family GT class */ struct fb_fix_screeninfo { char id[16]; /* identification string eg "TT Builtin" */ char *smem_start; /* Start of frame buffer mem */ + /* (physical address) */ __u32 smem_len; /* Length of frame buffer mem */ __u32 type; /* see FB_TYPE_* */ __u32 type_aux; /* Interleave for interleaved Planes */ @@ -50,12 +64,19 @@ struct fb_fix_screeninfo { __u16 ypanstep; /* zero if no hardware panning */ __u16 ywrapstep; /* zero if no hardware ywrap */ __u32 line_length; /* length of a line in bytes */ - unsigned char *mmio_start; /* Start of Memory Mapped I/O */ + char *mmio_start; /* Start of Memory Mapped I/O */ + /* (physical address) */ __u32 mmio_len; /* Length of Memory Mapped I/O */ __u32 accel; /* Type of acceleration available */ __u16 reserved[3]; /* Reserved for future compatibility */ }; +/* Interpretation of offset for color fields: All offsets are from the right, + * inside a "pixel" value, which is exactly 'bits_per_pixel' wide (means: you + * can use the offset as right argument to <<). A pixel afterwards is a bit + * stream and is written to video memory as that unmodified. This implies + * big-endian byte order if bits_per_pixel is greater than 8. + */ struct fb_bitfield { __u32 offset; /* beginning of bitfield */ __u32 length; /* length of bitfield */ @@ -73,15 +94,7 @@ struct fb_bitfield { #define FB_ACTIVATE_VBL 16 /* activate values on next vbl */ #define FB_CHANGE_CMAP_VBL 32 /* change colormap on vbl */ -#define FB_ACCEL_NONE 0 /* no hardware accelerator */ -#define FB_ACCEL_ATARIBLITT 1 /* Atari Blitter */ -#define FB_ACCEL_AMIGABLITT 2 /* Amiga Blitter */ -#define FB_ACCEL_S3TRIO64 3 /* Cybervision64 (S3 Trio64) */ -#define FB_ACCEL_NCR77C32BLT 4 /* RetinaZ3 (NCR77C32BLT) */ -#define FB_ACCEL_S3VIRGE 5 /* Cybervision64/3D (S3 ViRGE) */ -#define FB_ACCEL_MACH64 6 /* ATI Mach 64 */ -#define FB_ACCEL_TGA 7 /* DEC 21030 TGA */ -#define FB_ACCEL_ATY 8 /* atyfb (ATI Mach64) */ +#define FB_ACCELF_TEXT 1 /* text mode acceleration */ #define FB_SYNC_HOR_HIGH_ACT 1 /* horizontal sync high active */ #define FB_SYNC_VERT_HIGH_ACT 2 /* vertical sync high active */ @@ -124,7 +137,7 @@ struct fb_var_screeninfo { __u32 height; /* height of picture in mm */ __u32 width; /* width of picture in mm */ - __u32 accel; /* see FB_ACCEL_* */ + __u32 accel_flags; /* acceleration flags (hints) */ /* Timing: All values in pixclocks, except pixclock (of course) */ __u32 pixclock; /* pixel clock in ps (pico seconds) */ @@ -154,10 +167,10 @@ struct fb_con2fbmap { }; struct fb_monspecs { - unsigned hfmin : 20; /* hfreq lower limit (Hz) */ - unsigned hfmax : 20; /* hfreq upper limit (Hz) */ - unsigned vfmin : 10; /* vfreq lower limit (Hz) */ - unsigned vfmax : 10; /* vfreq upper limit (Hz) */ + __u32 hfmin; /* hfreq lower limit (Hz) */ + __u32 hfmax; /* hfreq upper limit (Hz) */ + __u16 vfmin; /* vfreq lower limit (Hz) */ + __u16 vfmax; /* vfreq upper limit (Hz) */ unsigned dpms : 1; /* supports DPMS */ }; @@ -196,8 +209,6 @@ struct fb_ops { /* pan display */ int (*fb_pan_display)(struct fb_var_screeninfo *var, int con, struct fb_info *info); - /* switch between text and graphics mode */ - int (*fb_set_mode)(int mode, struct fb_info *info); /* perform fb specific ioctl */ int (*fb_ioctl)(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg, int con, struct fb_info *info); @@ -216,6 +227,7 @@ struct display { /* are updated by fbcon.c */ struct fb_cmap cmap; /* colormap */ char *screen_base; /* pointer to top of virtual screen */ + /* (virtual address) */ int visual; int type; /* see FB_TYPE_* */ int type_aux; /* Interleave for interleaved Planes */ @@ -265,6 +277,8 @@ struct fb_info { int (*updatevar)(int, struct fb_info*); /* tell fb to update the vars */ void (*blank)(int, struct fb_info*); /* tell fb to (un)blank the screen */ + /* arg = 0: unblank */ + /* arg > 0: VESA level (arg-1) */ /* From here on everything is device dependent */ }; @@ -350,6 +364,12 @@ extern int fb_set_cmap(struct fb_cmap *cmap, struct fb_var_screeninfo *var, extern struct fb_cmap *fb_default_cmap(int len); extern void fb_invert_cmaps(void); +/* VESA Blanking Levels */ +#define VESA_NO_BLANKING 0 +#define VESA_VSYNC_SUSPEND 1 +#define VESA_HSYNC_SUSPEND 2 +#define VESA_POWERDOWN 3 + #endif /* __KERNEL__ */ #if 1 diff --git a/include/linux/fd.h b/include/linux/fd.h index d87d8504b8f6..dc8439540e40 100644 --- a/include/linux/fd.h +++ b/include/linux/fd.h @@ -116,7 +116,7 @@ typedef char floppy_drive_name[16]; * Drive parameters (user modifiable) */ struct floppy_drive_params { - signed char cmos; /* cmos type */ + signed char cmos; /* CMOS type */ /* Spec2 is (HLD<<1 | ND), where HLD is head load time (1=2ms, 2=4 ms * etc) and ND is set means no DMA. Hardcoded to 6 (HLD=6ms, use DMA). diff --git a/include/linux/kernel_stat.h b/include/linux/kernel_stat.h index 6bf0d79cb4f8..89d1ee388d7b 100644 --- a/include/linux/kernel_stat.h +++ b/include/linux/kernel_stat.h @@ -8,7 +8,7 @@ /* * 'kernel_stat.h' contains the definitions needed for doing - * some kernel statistics (cpu usage, context switches ...), + * some kernel statistics (CPU usage, context switches ...), * used by rstatd/perfmeter */ diff --git a/include/linux/linux_logo.h b/include/linux/linux_logo.h new file mode 100644 index 000000000000..25e4647215b6 --- /dev/null +++ b/include/linux/linux_logo.h @@ -0,0 +1,1444 @@ +/* $Id: linux_logo.h,v 1.1 1998/05/04 14:21:03 jj Exp $ + * include/linux/linux_logo.h: This is a linux logo + * to be displayed on boot. + * + * Copyright (C) 1996 Larry Ewing (lewing@isc.tamu.edu) + * Copyright (C) 1996 Jakub Jelinek (jj@sunsite.mff.cuni.cz) + * + * You can put anything here, but: + * LINUX_LOGO_COLORS has to be less than 224 + * image size has to be 80x80 + * values have to start from 0x20 + * (i.e. RGB(linux_logo_red[0], + * linux_logo_green[0], + * linux_logo_blue[0]) is color 0x20) + * BW image has to be 80x80 as well, with MS bit + * on the left + * Serial_console ascii image can be any size, + * but should contain %s to display the version + */ + +#if LINUX_LOGO_COLORS == 221 + +unsigned char linux_logo_red[] __initdata = { + 0xF3, 0xF6, 0xF8, 0xF7, 0xEF, 0xE7, 0xE5, 0xE3, + 0xCA, 0xD4, 0xDD, 0xC8, 0xC7, 0xC4, 0xC2, 0xE5, + 0xF1, 0xED, 0xEE, 0xE6, 0xC6, 0xDA, 0xDD, 0xE5, + 0xD9, 0xC6, 0xE3, 0xD0, 0xC6, 0xBA, 0xB0, 0xB6, + 0xBB, 0xBE, 0xB9, 0xB8, 0xB3, 0xB2, 0xB0, 0xAD, + 0xAC, 0xA9, 0xA8, 0xA6, 0xA4, 0xA1, 0xA0, 0x9D, + 0xA0, 0x9F, 0x9E, 0x9C, 0x9B, 0x99, 0x9A, 0x99, + 0x98, 0x95, 0x96, 0x94, 0x93, 0x92, 0x8F, 0x8D, + 0x8C, 0x8A, 0x87, 0x86, 0x83, 0x81, 0x0D, 0x03, + 0x66, 0x44, 0x24, 0x08, 0xD6, 0xE6, 0xE9, 0xE6, + 0xE7, 0xCA, 0xDC, 0xDB, 0xD5, 0xD0, 0xC9, 0xE2, + 0xD5, 0xC6, 0xC4, 0xB3, 0xB2, 0xB9, 0xA9, 0x9A, + 0xB2, 0x9D, 0xE8, 0xEC, 0xF5, 0xF5, 0xF4, 0xF4, + 0xEC, 0xEE, 0xF0, 0xF5, 0xE0, 0xD6, 0xC5, 0xC2, + 0xD9, 0xD5, 0xD8, 0xD6, 0xF6, 0xF4, 0xED, 0xEC, + 0xEB, 0xF1, 0xF6, 0xF5, 0xF5, 0xEE, 0xEF, 0xEC, + 0xE7, 0xE3, 0xE6, 0xD6, 0xDD, 0xC3, 0xD6, 0xD7, + 0xCD, 0xCA, 0xC3, 0xAC, 0x95, 0x99, 0xB7, 0xA3, + 0x8B, 0x88, 0x95, 0x8A, 0x94, 0xD2, 0xCC, 0xC4, + 0xA8, 0x8E, 0x8F, 0xAE, 0xB8, 0xAC, 0xB6, 0xB4, + 0xAD, 0xA5, 0xA0, 0x9B, 0x8B, 0xA3, 0x94, 0x87, + 0x85, 0x89, 0x53, 0x80, 0x7D, 0x7C, 0x7A, 0x78, + 0x76, 0x71, 0x73, 0x6E, 0x6B, 0x67, 0x65, 0x62, + 0x4B, 0x5B, 0x5F, 0x53, 0x56, 0x52, 0x4F, 0x46, + 0x42, 0x0F, 0x75, 0x78, 0x7D, 0x72, 0x5F, 0x6E, + 0x7A, 0x75, 0x6A, 0x58, 0x48, 0x4F, 0x00, 0x2B, + 0x37, 0x3E, 0x32, 0x33, 0x25, 0x2C, 0x3B, 0x11, + 0x1D, 0x14, 0x06, 0x02, 0x00 +}; + +unsigned char linux_logo_green[] __initdata = { + 0xF3, 0xF6, 0xF8, 0xF7, 0xEF, 0xE7, 0xE5, 0xE3, + 0xCA, 0xD4, 0xDD, 0xC8, 0xC7, 0xC4, 0xC2, 0xD3, + 0xDA, 0xD4, 0xD7, 0xCC, 0xC1, 0xCC, 0xCB, 0xC9, + 0xC5, 0xBC, 0xBC, 0xBB, 0xB7, 0xA5, 0xB0, 0xB6, + 0xBB, 0xBE, 0xB9, 0xB8, 0xB3, 0xB2, 0xAD, 0xAD, + 0xAC, 0xA9, 0xA8, 0xA6, 0xA4, 0xA1, 0xA0, 0x95, + 0xA0, 0x9F, 0x9E, 0x9C, 0x9B, 0x99, 0x9A, 0x99, + 0x98, 0x95, 0x96, 0x94, 0x93, 0x92, 0x8F, 0x8D, + 0x8C, 0x8A, 0x87, 0x86, 0x83, 0x81, 0x08, 0x02, + 0x53, 0x2E, 0x19, 0x06, 0xC6, 0xC8, 0xCF, 0xBD, + 0xB3, 0xB6, 0xB4, 0xAB, 0xA5, 0xA3, 0x9B, 0xB6, + 0xA7, 0x99, 0x92, 0xA4, 0x9E, 0x9D, 0x98, 0x8C, + 0x8A, 0x86, 0xCD, 0xCC, 0xC9, 0xD7, 0xCA, 0xC4, + 0xCA, 0xC3, 0xC7, 0xC3, 0xC8, 0xB4, 0x91, 0x8E, + 0x8A, 0x82, 0x87, 0x85, 0xBD, 0xBF, 0xB6, 0xBC, + 0xAE, 0xB7, 0xBC, 0xB8, 0xBF, 0xB6, 0xBC, 0xB5, + 0xAB, 0xA6, 0xAD, 0xB2, 0xA5, 0x87, 0x9C, 0x96, + 0x95, 0x8E, 0x87, 0x8F, 0x86, 0x86, 0x8E, 0x80, + 0x7A, 0x70, 0x7B, 0x78, 0x78, 0x7F, 0x77, 0x6F, + 0x70, 0x76, 0x59, 0x77, 0x68, 0x64, 0x7B, 0x7C, + 0x75, 0x6D, 0x77, 0x69, 0x65, 0x5F, 0x5B, 0x54, + 0x4F, 0x5B, 0x39, 0x80, 0x7D, 0x7C, 0x7A, 0x78, + 0x76, 0x71, 0x73, 0x6E, 0x6B, 0x67, 0x65, 0x62, + 0x4B, 0x5B, 0x5F, 0x53, 0x56, 0x52, 0x4F, 0x46, + 0x42, 0x0B, 0x69, 0x66, 0x64, 0x57, 0x4A, 0x4E, + 0x55, 0x4B, 0x46, 0x3B, 0x30, 0x33, 0x00, 0x2B, + 0x37, 0x3E, 0x32, 0x33, 0x25, 0x2C, 0x29, 0x0D, + 0x1D, 0x14, 0x06, 0x02, 0x00 +}; + +unsigned char linux_logo_blue[] __initdata = { + 0xF3, 0xF6, 0xF8, 0xF7, 0xEF, 0xEE, 0xE5, 0xDE, + 0xD7, 0xD3, 0xDD, 0xC8, 0xC7, 0xC4, 0xC2, 0xB5, + 0xB0, 0xA6, 0xAC, 0x9B, 0xB5, 0xB5, 0xAE, 0x84, + 0x90, 0xA9, 0x81, 0x8D, 0x96, 0x86, 0xB0, 0xB6, + 0xBB, 0xBE, 0xB9, 0xB8, 0xB3, 0xB2, 0xA7, 0xAD, + 0xAC, 0xA9, 0xA8, 0xA6, 0xA4, 0xA1, 0xA5, 0x87, + 0xA0, 0x9F, 0x9E, 0x9C, 0x9B, 0x9A, 0x9A, 0x99, + 0x98, 0x95, 0x96, 0x94, 0x93, 0x92, 0x8F, 0x8D, + 0x8C, 0x8A, 0x87, 0x86, 0x83, 0x81, 0xC8, 0xD7, + 0x9B, 0x8E, 0x8C, 0xB2, 0x77, 0x77, 0x4E, 0x77, + 0x69, 0x71, 0x78, 0x6B, 0x65, 0x66, 0x64, 0x59, + 0x5C, 0x5A, 0x48, 0x72, 0x7B, 0x6B, 0x67, 0x6E, + 0x42, 0x5B, 0x29, 0x36, 0x25, 0x10, 0x17, 0x14, + 0x19, 0x16, 0x13, 0x0E, 0x08, 0x2E, 0x2E, 0x3D, + 0x24, 0x24, 0x24, 0x24, 0x13, 0x12, 0x14, 0x14, + 0x0E, 0x08, 0x0D, 0x0F, 0x08, 0x0D, 0x0E, 0x08, + 0x08, 0x0C, 0x06, 0x06, 0x07, 0x16, 0x07, 0x0E, + 0x08, 0x0A, 0x07, 0x0D, 0x2D, 0x3E, 0x09, 0x4E, + 0x68, 0x52, 0x56, 0x58, 0x4B, 0x22, 0x20, 0x20, + 0x27, 0x39, 0x28, 0x19, 0x1E, 0x1E, 0x08, 0x06, + 0x07, 0x09, 0x08, 0x08, 0x05, 0x1D, 0x1F, 0x17, + 0x18, 0x06, 0x79, 0x80, 0x7D, 0x7C, 0x7A, 0x78, + 0x76, 0x71, 0x73, 0x6E, 0x6B, 0x68, 0x65, 0x62, + 0x4B, 0x5B, 0x5F, 0x55, 0x56, 0x52, 0x4F, 0x46, + 0x42, 0x5A, 0x14, 0x23, 0x3D, 0x2B, 0x21, 0x14, + 0x06, 0x04, 0x03, 0x07, 0x09, 0x13, 0x2A, 0x3A, + 0x37, 0x3E, 0x32, 0x33, 0x25, 0x2C, 0x07, 0x09, + 0x1D, 0x14, 0x06, 0x02, 0x00 +}; + +unsigned char linux_logo[] __initdata = { + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x58, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x58, 0x57, + 0x58, 0x58, 0x59, 0x5C, 0x5D, 0x5F, 0x60, 0x61, + 0x62, 0x61, 0x61, 0x62, 0x62, 0x62, 0x63, 0x63, + 0x61, 0x61, 0x61, 0x61, 0x61, 0x60, 0x5E, 0x5E, + 0x5E, 0x5D, 0x5D, 0x5C, 0x5D, 0x5B, 0x58, 0x58, + 0x58, 0x57, 0x58, 0x57, 0x57, 0x57, 0x57, 0x58, + 0x57, 0x57, 0x58, 0x57, 0x57, 0x58, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x58, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x58, 0x57, + 0x54, 0x56, 0x57, 0x67, 0xFC, 0xFC, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0x67, 0x4C, + 0x4A, 0x49, 0x4A, 0x49, 0x4A, 0x49, 0x49, 0x4A, + 0x4A, 0x4B, 0x4B, 0x4B, 0x4C, 0x50, 0x51, 0x52, + 0x54, 0x54, 0x56, 0x57, 0x57, 0x57, 0x57, 0x58, + 0x57, 0x57, 0x58, 0x57, 0x57, 0x58, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x58, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x58, 0x56, 0x56, 0x53, + 0x52, 0x53, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFB, 0xFB, 0xFB, + 0x4B, 0x4B, 0x4B, 0x4A, 0x49, 0x4A, 0x4A, 0x49, + 0x49, 0x49, 0x48, 0x49, 0x49, 0x4A, 0x4A, 0x4B, + 0x4C, 0x4D, 0x52, 0x54, 0x56, 0x55, 0x57, 0x58, + 0x57, 0x57, 0x58, 0x57, 0x57, 0x58, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x58, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x55, 0x54, 0x53, 0x52, 0x51, 0x50, + 0x50, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFC, 0xF8, 0xF0, 0xF4, 0xFB, + 0xFC, 0x67, 0x53, 0x50, 0x4D, 0x4C, 0x4C, 0x4C, + 0x4B, 0x4A, 0x4A, 0x48, 0x49, 0x48, 0x48, 0x49, + 0x49, 0x49, 0x4B, 0x4C, 0x50, 0x52, 0x53, 0x56, + 0x57, 0x57, 0x58, 0x57, 0x57, 0x58, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x58, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x55, 0x54, 0x53, 0x51, 0x51, 0x50, 0x4C, 0x4D, + 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFC, 0xF4, 0xD2, 0xD7, 0xF5, + 0xFC, 0xFC, 0x5D, 0x5D, 0x5C, 0x5C, 0x59, 0x58, + 0x58, 0x56, 0x52, 0x4C, 0x4B, 0x4A, 0x4A, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x49, 0x4B, 0x4D, 0x51, + 0x54, 0x56, 0x58, 0x57, 0x57, 0x58, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x58, 0x57, 0x57, 0x57, 0x55, 0x54, + 0x53, 0x52, 0x51, 0x4D, 0x4D, 0x4D, 0x50, 0x50, + 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFC, 0xF4, 0x64, 0xD9, 0xF5, + 0xF9, 0xFC, 0xFC, 0x64, 0x63, 0x62, 0x61, 0x61, + 0x61, 0x60, 0x5E, 0x5B, 0x5A, 0x54, 0x52, 0x4C, + 0x4B, 0x49, 0x49, 0x47, 0x47, 0x48, 0x49, 0x4B, + 0x4C, 0x51, 0x53, 0x56, 0x57, 0x58, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x58, 0x57, 0x57, 0x55, 0x53, 0x53, + 0x51, 0x50, 0x50, 0x50, 0x50, 0x50, 0x53, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFC, 0xF4, 0xF5, 0xF9, 0xFC, + 0xFC, 0xFC, 0xFC, 0x64, 0x64, 0x64, 0x64, 0x64, + 0x64, 0x64, 0x64, 0x63, 0x61, 0x61, 0x5E, 0x59, + 0x55, 0x52, 0x4C, 0x4A, 0x49, 0x47, 0x48, 0x48, + 0x49, 0x4B, 0x4D, 0x51, 0x54, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x58, 0x55, 0x54, 0x54, 0x52, 0x51, + 0x51, 0x51, 0x51, 0x51, 0x53, 0x54, 0x59, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFC, 0xF7, 0xFC, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFC, 0x60, 0x60, 0x60, 0x61, + 0x62, 0x63, 0x64, 0x64, 0x65, 0x65, 0x64, 0x63, + 0x61, 0x5E, 0x59, 0x56, 0x4D, 0x4B, 0x48, 0x48, + 0x48, 0x48, 0x49, 0x4B, 0x50, 0x53, 0x56, 0x56, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x56, 0x54, 0x53, 0x52, 0x51, 0x51, + 0x51, 0x52, 0x53, 0x55, 0x59, 0x5D, 0x5E, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFB, 0xFB, 0xFB, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFC, 0x4C, 0x4E, 0x51, 0x52, + 0x57, 0x5A, 0x5E, 0x60, 0x61, 0x63, 0x65, 0xCB, + 0x64, 0x64, 0x63, 0x60, 0x5C, 0x57, 0x50, 0x4B, + 0x48, 0x47, 0x47, 0x47, 0x4A, 0x4C, 0x52, 0x53, + 0x54, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x55, 0x54, 0x53, 0x53, 0x51, 0x52, 0x52, 0x53, + 0x53, 0x57, 0x5A, 0x5D, 0x5E, 0x5E, 0x60, 0xFC, + 0xFC, 0xFC, 0xFB, 0xF9, 0xFC, 0xFC, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFA, 0xF9, 0xF5, 0xFB, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFC, 0xFB, 0x45, 0x3F, 0x3F, + 0x45, 0x48, 0x4B, 0x4D, 0x54, 0x5A, 0x5E, 0x61, + 0x63, 0xCB, 0xCB, 0x65, 0x64, 0x62, 0x5E, 0x57, + 0x50, 0x4B, 0x48, 0x47, 0x47, 0x48, 0x4B, 0x4D, + 0x51, 0x56, 0x56, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x55, + 0x54, 0x54, 0x53, 0x53, 0x52, 0x53, 0x54, 0x57, + 0x59, 0x5C, 0x5E, 0x5E, 0x5E, 0x5E, 0x5E, 0xFC, + 0xFC, 0xFA, 0xFC, 0xFA, 0xE0, 0xFC, 0xFC, 0xFC, + 0xFB, 0xFB, 0xFB, 0xDF, 0xD8, 0xF9, 0xE0, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFC, 0xFB, 0x4C, 0x4A, 0x48, + 0x48, 0x3E, 0x44, 0x43, 0x3F, 0x47, 0x4B, 0x52, + 0x5A, 0x5E, 0x62, 0x64, 0xCB, 0xCB, 0x64, 0x61, + 0x5E, 0x57, 0x4D, 0x49, 0x47, 0x47, 0x48, 0x4A, + 0x4C, 0x52, 0x54, 0x56, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x55, + 0x54, 0x53, 0x53, 0x54, 0x54, 0x55, 0x58, 0x5B, + 0x5C, 0x5D, 0x5E, 0x5D, 0x5D, 0x5B, 0x58, 0xFC, + 0xFC, 0xD8, 0x4C, 0x60, 0xFC, 0xF5, 0xFC, 0xFC, + 0xFC, 0xF7, 0x5F, 0x48, 0x48, 0x2C, 0xF8, 0xF9, + 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0x4B, 0x4A, 0x49, + 0x49, 0x49, 0x49, 0x47, 0x3E, 0x44, 0x42, 0x3F, + 0x3E, 0x4B, 0x54, 0x5C, 0x61, 0x64, 0xCB, 0xCB, + 0x64, 0x61, 0x5D, 0x53, 0x4B, 0x49, 0x47, 0x47, + 0x49, 0x4B, 0x50, 0x53, 0x56, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x55, 0x55, 0x54, + 0x53, 0x53, 0x54, 0x56, 0x58, 0x5A, 0x5B, 0x5D, + 0x5D, 0x5D, 0x5C, 0x5A, 0x54, 0x52, 0x4C, 0xFC, + 0xF7, 0x4E, 0x2D, 0x29, 0x4E, 0xFC, 0xFC, 0xFC, + 0xFB, 0x5F, 0x26, 0x24, 0x20, 0x2E, 0x65, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0x45, 0x3F, 0x45, + 0x3E, 0x47, 0x47, 0x47, 0x47, 0x47, 0x3E, 0x44, + 0x43, 0x40, 0x44, 0x49, 0x51, 0x5C, 0x62, 0x64, + 0xCB, 0xCB, 0x63, 0x60, 0x58, 0x50, 0x49, 0x48, + 0x48, 0x48, 0x4A, 0x4D, 0x53, 0x54, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x55, 0x54, 0x54, 0x54, + 0x54, 0x54, 0x55, 0x57, 0x59, 0x5B, 0x5C, 0x5D, + 0x5C, 0x5A, 0x54, 0x51, 0x4C, 0x4C, 0x54, 0xFC, + 0xF9, 0x23, 0xDB, 0x2D, 0x23, 0xFA, 0xFB, 0xFA, + 0xF5, 0x27, 0x21, 0xD9, 0xF8, 0x20, 0x21, 0xFB, + 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0x5D, 0x58, 0x55, + 0x50, 0x48, 0x45, 0x43, 0x44, 0x44, 0x45, 0x45, + 0x3E, 0x3F, 0x43, 0x41, 0x3F, 0x48, 0x52, 0x5D, + 0x63, 0x65, 0xCB, 0x65, 0x61, 0x5D, 0x52, 0x4B, + 0x48, 0x47, 0x47, 0x49, 0x4C, 0x51, 0x54, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x55, 0x54, 0x54, 0x54, + 0x54, 0x58, 0x5A, 0x59, 0x5B, 0x5B, 0x5B, 0x5A, + 0x55, 0x52, 0x4D, 0x4D, 0x55, 0x5B, 0x5D, 0xFC, + 0xF1, 0xF9, 0xFC, 0xD4, 0x21, 0xCC, 0xF7, 0xF8, + 0xF2, 0x21, 0xD9, 0xFC, 0xF2, 0xFB, 0x21, 0x45, + 0xFC, 0xFC, 0xFC, 0xFC, 0xFB, 0xD1, 0xD0, 0xCD, + 0xCC, 0x63, 0x5E, 0x58, 0x50, 0x47, 0x43, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x40, 0x41, 0x3F, 0x4A, + 0x56, 0x5E, 0x64, 0xCB, 0x65, 0x63, 0x5E, 0x56, + 0x4C, 0x48, 0x47, 0x47, 0x49, 0x4C, 0x51, 0x54, + 0x58, 0x57, 0x57, 0x57, 0x57, 0x55, 0x54, 0x54, + 0x57, 0x5A, 0x5A, 0x5C, 0x5B, 0x5A, 0x58, 0x54, + 0x51, 0x4C, 0x55, 0x5D, 0x5D, 0x5B, 0x54, 0xFC, + 0xF0, 0xF9, 0xFC, 0x65, 0x45, 0xCD, 0xFB, 0xFB, + 0xF8, 0x26, 0xFB, 0xFC, 0xFC, 0xFC, 0x21, 0x27, + 0xFB, 0xFC, 0xFC, 0xFC, 0xFB, 0xD7, 0x35, 0x34, + 0x2F, 0x35, 0x36, 0x2F, 0x2F, 0x36, 0x2F, 0x2F, + 0x36, 0x36, 0x35, 0x35, 0x43, 0x42, 0x41, 0x2E, + 0x45, 0x4C, 0x5B, 0x62, 0x65, 0xCC, 0x64, 0x60, + 0x58, 0x4D, 0x49, 0x47, 0x47, 0x49, 0x4C, 0x51, + 0x58, 0x57, 0x57, 0x57, 0x57, 0x57, 0x55, 0x57, + 0x58, 0x5A, 0x5A, 0x5B, 0x5A, 0x55, 0x54, 0x51, + 0x53, 0x5C, 0x5D, 0x5D, 0x54, 0x4B, 0x4D, 0xFC, + 0xFC, 0x44, 0xFC, 0xFB, 0x7B, 0xAB, 0xA8, 0xAE, + 0xAB, 0x7F, 0xFC, 0xFC, 0xFB, 0xFB, 0x22, 0x2A, + 0xFC, 0xFC, 0xFC, 0xFC, 0x36, 0x2F, 0x30, 0x30, + 0x32, 0x30, 0x32, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x2F, 0x2F, 0x40, 0x41, + 0x2E, 0x40, 0x48, 0x56, 0x5F, 0x64, 0xCC, 0x65, + 0x61, 0x59, 0x50, 0x49, 0x47, 0x47, 0x49, 0x4C, + 0x5A, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x58, + 0x5A, 0x5A, 0x5A, 0x58, 0x55, 0x52, 0x51, 0x5A, + 0x5D, 0x5D, 0x57, 0x4C, 0x51, 0x54, 0x5D, 0xFC, + 0xFC, 0x2A, 0xFC, 0xC9, 0xAA, 0x8B, 0x8A, 0x8C, + 0xAB, 0x8C, 0x8C, 0xFB, 0xFB, 0x23, 0x20, 0xF1, + 0xFC, 0xFC, 0xFC, 0x3B, 0x33, 0x33, 0x32, 0x32, + 0x31, 0x32, 0x30, 0x32, 0x32, 0x32, 0x32, 0x30, + 0x31, 0x31, 0x31, 0x32, 0x33, 0x33, 0x3C, 0x41, + 0x41, 0x2E, 0x2D, 0x45, 0x4D, 0x5D, 0x63, 0xCC, + 0x65, 0x62, 0x5D, 0x51, 0x49, 0x47, 0x47, 0x4A, + 0x59, 0x57, 0x57, 0x57, 0x57, 0x58, 0x58, 0x58, + 0x5A, 0x5A, 0x58, 0x55, 0x53, 0x53, 0x5C, 0x5E, + 0x59, 0x51, 0x4E, 0x54, 0x59, 0x5E, 0x62, 0xFC, + 0xFC, 0xDB, 0xAA, 0xA1, 0x95, 0x9C, 0x8C, 0x88, + 0x82, 0x83, 0x83, 0x8C, 0x88, 0xAE, 0xB9, 0xFB, + 0xFC, 0xFC, 0xFC, 0x3C, 0x3B, 0x72, 0x38, 0x33, + 0x33, 0x33, 0x31, 0x33, 0x31, 0x31, 0x31, 0x31, + 0x33, 0x33, 0x38, 0x33, 0x72, 0x3B, 0x44, 0x2E, + 0x41, 0x2E, 0x2E, 0x2D, 0x43, 0x4B, 0x5B, 0x63, + 0xCB, 0xCC, 0x63, 0x5D, 0x51, 0x49, 0x47, 0x49, + 0x5C, 0x58, 0x57, 0x57, 0x57, 0x57, 0x58, 0x58, + 0x58, 0x58, 0x57, 0x53, 0x58, 0x5D, 0x5E, 0x55, + 0x51, 0x53, 0x58, 0x5E, 0x60, 0x63, 0x64, 0xFC, + 0xFC, 0xC0, 0xA6, 0x9D, 0x8B, 0x9C, 0x8C, 0x8C, + 0x6E, 0x83, 0x88, 0x8C, 0x8C, 0x8C, 0x83, 0xE8, + 0xFB, 0xFC, 0xFC, 0xFC, 0x33, 0x70, 0x70, 0x6F, + 0x6F, 0x6F, 0x6F, 0x3A, 0x6F, 0x6D, 0x6F, 0x6F, + 0x70, 0x6F, 0x6F, 0x70, 0x6F, 0x32, 0x5A, 0x48, + 0x41, 0x2D, 0x2D, 0x2D, 0x2C, 0x41, 0x49, 0x5A, + 0x62, 0xCB, 0xCB, 0x63, 0x5D, 0x50, 0x49, 0x4A, + 0x5C, 0x58, 0x58, 0x57, 0x55, 0x57, 0x57, 0x57, + 0x57, 0x55, 0x56, 0x59, 0x5E, 0x5C, 0x52, 0x53, + 0x55, 0x5B, 0x5E, 0x61, 0x63, 0x64, 0x63, 0xFC, + 0xE8, 0xBF, 0xA4, 0x99, 0x9C, 0x8C, 0x88, 0x88, + 0x6E, 0x88, 0x8C, 0x8C, 0x8C, 0xC2, 0xA6, 0xC4, + 0xFC, 0xFC, 0xFC, 0xFC, 0x36, 0x3A, 0x6F, 0x70, + 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, + 0x70, 0x70, 0x70, 0x70, 0x37, 0x32, 0xCD, 0x5E, + 0x4C, 0x43, 0x2C, 0x2D, 0x2D, 0x2C, 0x2E, 0x47, + 0x57, 0x61, 0x65, 0xCC, 0x63, 0x5C, 0x50, 0x4D, + 0x5C, 0x5A, 0x57, 0x55, 0x55, 0x55, 0x58, 0x58, + 0x55, 0x54, 0x5B, 0x5E, 0x5D, 0x53, 0x53, 0x55, + 0x5D, 0x5E, 0x61, 0x61, 0x61, 0x61, 0x5E, 0xFC, + 0xEA, 0xBE, 0xA4, 0x9B, 0x8B, 0x85, 0x8C, 0x6E, + 0x8C, 0x8C, 0x8C, 0xA3, 0xAA, 0xA4, 0xA4, 0xE9, + 0xFB, 0xFC, 0xFC, 0xFC, 0x36, 0x6D, 0x70, 0x73, + 0x70, 0x70, 0x70, 0x73, 0x73, 0x73, 0x73, 0x70, + 0x70, 0x70, 0x73, 0x70, 0x37, 0x38, 0xD1, 0xCF, + 0x61, 0x4D, 0x44, 0x2C, 0x2D, 0x2E, 0x2C, 0x2E, + 0x3E, 0x56, 0x61, 0xCB, 0xCC, 0x62, 0x5B, 0x57, + 0x59, 0x58, 0x55, 0x54, 0x54, 0x55, 0x58, 0x58, + 0x58, 0x5B, 0x5E, 0x5B, 0x53, 0x55, 0x55, 0x5C, + 0x5E, 0x61, 0x61, 0x60, 0x5D, 0x5A, 0x4E, 0xFC, + 0xFC, 0xEA, 0xAA, 0x9C, 0x8A, 0x85, 0x82, 0x8C, + 0x8C, 0xA8, 0xEB, 0xA8, 0xA4, 0xA4, 0xAA, 0xFC, + 0xFC, 0xFC, 0x64, 0xFB, 0x39, 0x31, 0x72, 0x78, + 0x73, 0x78, 0x73, 0x74, 0x74, 0x74, 0x74, 0x73, + 0x78, 0x70, 0x73, 0x73, 0x33, 0xCC, 0xD2, 0xD1, + 0xCE, 0x62, 0x53, 0x3F, 0x2D, 0x2D, 0x41, 0x2C, + 0x2E, 0x3E, 0x56, 0x62, 0xCB, 0xCB, 0x61, 0x5D, + 0x54, 0x54, 0x54, 0x54, 0x56, 0x58, 0x58, 0x58, + 0x5C, 0x5E, 0x5A, 0x55, 0x58, 0x58, 0x5B, 0x5E, + 0x61, 0x5E, 0x5D, 0x5A, 0x52, 0x55, 0xCD, 0xFC, + 0xFC, 0x34, 0xC9, 0xE8, 0xA8, 0xAE, 0xC2, 0xE8, + 0xC3, 0xA6, 0xA7, 0xA6, 0xAA, 0x78, 0x2E, 0x42, + 0xFC, 0xFC, 0xD2, 0x64, 0xF8, 0x31, 0x72, 0x73, + 0x73, 0x73, 0x73, 0x74, 0x75, 0x75, 0x74, 0x73, + 0x73, 0x73, 0x73, 0x72, 0x33, 0x5C, 0x64, 0xD2, + 0xD1, 0xCF, 0x63, 0x54, 0x3F, 0x2C, 0x41, 0x41, + 0x2C, 0x2E, 0x47, 0x58, 0x63, 0xCB, 0xCB, 0x62, + 0x52, 0x53, 0x53, 0x56, 0x58, 0x58, 0x5A, 0x5B, + 0x5E, 0x5A, 0x57, 0x58, 0x58, 0x58, 0x60, 0x60, + 0x5D, 0x5A, 0x55, 0x4E, 0x64, 0xD2, 0xD1, 0xFC, + 0xFC, 0x41, 0x3E, 0xC1, 0xC0, 0xA3, 0xA6, 0xA7, + 0xA7, 0xA9, 0xAA, 0xB8, 0x2E, 0x3F, 0x2C, 0x41, + 0xFC, 0xFC, 0xF7, 0xCE, 0xCD, 0x36, 0x72, 0x73, + 0x74, 0x75, 0x78, 0x75, 0x75, 0x75, 0x74, 0x74, + 0x74, 0x74, 0x78, 0x72, 0x6D, 0x49, 0x59, 0xCB, + 0xD1, 0xD1, 0xD2, 0xCB, 0x56, 0x3F, 0x2C, 0x41, + 0x40, 0x2D, 0x2E, 0x49, 0x5B, 0x64, 0xCC, 0x64, + 0x51, 0x53, 0x53, 0x55, 0x58, 0x59, 0x5B, 0x5E, + 0x59, 0x58, 0x58, 0x58, 0x55, 0x60, 0x60, 0x5C, + 0x5A, 0x53, 0x5B, 0xD0, 0xD3, 0xD3, 0xD3, 0xFB, + 0xFC, 0x40, 0x41, 0x45, 0xC4, 0xC0, 0xBE, 0xBE, + 0xC1, 0xC0, 0x3C, 0x47, 0x2E, 0x21, 0x22, 0x20, + 0x65, 0xFC, 0xFC, 0xFC, 0xFC, 0x6D, 0x72, 0x75, + 0x78, 0x76, 0x75, 0x79, 0x76, 0x76, 0x76, 0x76, + 0x75, 0x75, 0x75, 0x72, 0x6D, 0x2E, 0x48, 0x5D, + 0xCE, 0xD1, 0xD4, 0xD3, 0xCB, 0x56, 0x43, 0x2C, + 0x42, 0x43, 0x2E, 0x2E, 0x4A, 0x5D, 0x64, 0x64, + 0x50, 0x52, 0x56, 0x58, 0x5C, 0x5D, 0x5E, 0x5D, + 0x5A, 0x58, 0x58, 0x55, 0x61, 0x60, 0x58, 0x58, + 0x4E, 0x61, 0xD1, 0xD4, 0xD4, 0xD1, 0xEE, 0xFC, + 0xFC, 0x2B, 0x29, 0x2E, 0x3F, 0xB0, 0xAD, 0x81, + 0x46, 0x2D, 0x46, 0x2C, 0x24, 0x22, 0x22, 0x23, + 0x25, 0xFC, 0xFC, 0xFC, 0xFC, 0x6E, 0x73, 0x76, + 0x76, 0x79, 0x79, 0x79, 0x76, 0x76, 0x79, 0x76, + 0x79, 0x79, 0x79, 0x74, 0x3F, 0x41, 0x2C, 0x48, + 0x5F, 0xCF, 0xD5, 0xD7, 0xD6, 0xCD, 0x57, 0x40, + 0x2E, 0x3F, 0x44, 0x2E, 0x41, 0x4C, 0x60, 0x61, + 0x51, 0x53, 0x58, 0x5C, 0x5D, 0x5E, 0x5D, 0x5C, + 0x58, 0x57, 0x54, 0x5F, 0x5E, 0x55, 0x55, 0x52, + 0x64, 0xD4, 0xD5, 0xD4, 0xD1, 0x5D, 0xFA, 0xFB, + 0xF4, 0x21, 0x24, 0x41, 0x40, 0x44, 0x2E, 0x2E, + 0x42, 0x41, 0x2A, 0x24, 0x22, 0x22, 0x22, 0x22, + 0x23, 0xD9, 0xFC, 0xFC, 0xFC, 0xFC, 0xE5, 0xB8, + 0x8F, 0x8F, 0x7A, 0x8F, 0x7A, 0x8F, 0x7A, 0x8F, + 0x8F, 0x8F, 0xB8, 0xE5, 0x3F, 0x3E, 0x43, 0x2C, + 0x48, 0x61, 0xD1, 0xD7, 0xD9, 0xD7, 0xD0, 0x57, + 0x41, 0x2E, 0x3E, 0x44, 0x2D, 0x40, 0x52, 0x5D, + 0x53, 0x55, 0x59, 0x5D, 0x5E, 0x5E, 0x5D, 0x5A, + 0x57, 0x53, 0x5E, 0x5E, 0x54, 0x53, 0x54, 0x65, + 0xD5, 0xD6, 0xD4, 0xCE, 0x53, 0xFB, 0xF9, 0xFC, + 0x24, 0x22, 0x23, 0x23, 0x41, 0x42, 0x2E, 0x40, + 0x2B, 0x21, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x23, 0x23, 0xFC, 0xFC, 0xFC, 0xFC, 0xE7, 0xBD, + 0xB5, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, + 0x93, 0xB5, 0xC6, 0xEB, 0x2D, 0x47, 0x4A, 0x47, + 0x2C, 0x3E, 0x61, 0xD4, 0xDC, 0xDC, 0xDA, 0xCF, + 0x54, 0x41, 0x41, 0x3E, 0x45, 0x2C, 0x3F, 0x4A, + 0x58, 0x5A, 0x5C, 0x5F, 0x60, 0x5E, 0x5D, 0x57, + 0x51, 0x5D, 0x5D, 0x51, 0x53, 0x53, 0xCB, 0xD5, + 0xD6, 0xD5, 0x63, 0x55, 0xFC, 0xFC, 0xFC, 0x2C, + 0x23, 0x22, 0x23, 0x22, 0x20, 0x2D, 0x2C, 0x26, + 0x21, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x21, 0xF0, 0xFC, 0xFC, 0xFC, 0xE2, 0xC6, + 0xB5, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, + 0x93, 0x93, 0xC7, 0xE3, 0x3E, 0x2E, 0x49, 0x52, + 0x4C, 0x41, 0x44, 0x62, 0xD6, 0xDE, 0xDE, 0xD9, + 0xD0, 0x51, 0x2E, 0x40, 0x47, 0x44, 0x2C, 0x42, + 0x5D, 0x5D, 0x5F, 0x60, 0x60, 0x5D, 0x57, 0x51, + 0x58, 0x5D, 0x4E, 0x52, 0x55, 0x64, 0xD5, 0xD6, + 0xD4, 0x61, 0x59, 0x6B, 0xFC, 0xFC, 0xFC, 0x21, + 0x23, 0x22, 0x23, 0x22, 0x23, 0x21, 0x23, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x21, 0x24, 0xFC, 0xFC, 0xFC, 0xE2, 0xC7, + 0xB5, 0x90, 0x93, 0x93, 0x93, 0x90, 0x93, 0x93, + 0x90, 0xB5, 0xC8, 0xE4, 0x5F, 0x45, 0x2E, 0x4D, + 0x57, 0x57, 0x44, 0x43, 0x63, 0xDA, 0xDF, 0xDF, + 0xD9, 0xCE, 0x4C, 0x2C, 0x3F, 0x3E, 0x40, 0x40, + 0x60, 0x5E, 0x61, 0x61, 0x5E, 0x5B, 0x53, 0x52, + 0x5C, 0x52, 0x52, 0x55, 0x61, 0xD4, 0xD5, 0xD1, + 0x5E, 0x5B, 0x5C, 0xFB, 0xFC, 0xFC, 0x2A, 0x21, + 0x23, 0x22, 0x23, 0x22, 0x22, 0x22, 0x23, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0xFB, 0xFC, 0xFC, 0xB3, 0xC8, + 0xB5, 0x90, 0x92, 0xB5, 0x93, 0x93, 0xB5, 0x93, + 0x92, 0xB5, 0xC8, 0xB9, 0xD0, 0x5E, 0x44, 0x40, + 0x52, 0x58, 0x57, 0x48, 0x40, 0x63, 0xD9, 0xE0, + 0xE0, 0xD9, 0xCB, 0x49, 0x2D, 0x3F, 0x45, 0x3F, + 0x63, 0x61, 0x62, 0x60, 0x5E, 0x55, 0x4D, 0x59, + 0x53, 0x4E, 0x54, 0x5D, 0xD2, 0xD4, 0xD2, 0x5E, + 0x5C, 0x5D, 0xFC, 0xFC, 0xFC, 0xF8, 0x29, 0x23, + 0x23, 0x23, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x23, 0x22, 0x22, 0x23, 0x23, 0x23, 0x22, 0x22, + 0x22, 0x22, 0x22, 0xF0, 0xFC, 0xFC, 0xB3, 0xC7, + 0xB5, 0x93, 0xB5, 0x93, 0x93, 0x91, 0x93, 0x93, + 0x91, 0xB5, 0xC7, 0xAD, 0xD6, 0xD2, 0x5E, 0x3F, + 0x3F, 0x57, 0x57, 0x58, 0x4A, 0x41, 0x64, 0xDC, + 0xF1, 0xDF, 0xDA, 0x61, 0x45, 0x2E, 0x43, 0x47, + 0xCB, 0x63, 0x62, 0x5F, 0x58, 0x51, 0x53, 0x54, + 0x4C, 0x52, 0x5C, 0xCD, 0xD3, 0xD2, 0x60, 0x5D, + 0x5D, 0xFB, 0xFC, 0xFC, 0xFC, 0xDB, 0x49, 0x24, + 0x21, 0x23, 0x23, 0x22, 0x26, 0x26, 0x2A, 0x24, + 0x22, 0x23, 0x22, 0x21, 0x24, 0x26, 0x26, 0x2A, + 0x29, 0x2B, 0x24, 0x25, 0xFC, 0xFC, 0xB3, 0xC5, + 0x91, 0x91, 0x92, 0x91, 0x92, 0x92, 0x93, 0x93, + 0x91, 0x93, 0xC6, 0xAD, 0xDC, 0xD9, 0xD4, 0x60, + 0x43, 0x45, 0x58, 0x58, 0x57, 0x4B, 0x43, 0xCC, + 0xDD, 0xF1, 0xD8, 0xD5, 0x5D, 0x43, 0x41, 0x47, + 0xCD, 0x63, 0x62, 0x5D, 0x54, 0x4C, 0x55, 0x4B, + 0x51, 0x58, 0x62, 0xD0, 0xD0, 0x62, 0x5D, 0x5D, + 0x67, 0xFC, 0xFC, 0xFC, 0xFC, 0x58, 0x4E, 0x28, + 0x2A, 0x20, 0x23, 0x22, 0x23, 0x2A, 0x23, 0x22, + 0x22, 0x22, 0x23, 0x23, 0x25, 0x2A, 0x2E, 0x2D, + 0x2E, 0x2E, 0x2E, 0x23, 0xFA, 0xFC, 0xB2, 0xBD, + 0xB5, 0x90, 0x91, 0x93, 0x92, 0x90, 0x91, 0x93, + 0x92, 0x91, 0xBD, 0xAD, 0xDE, 0xE0, 0xD8, 0xD7, + 0x61, 0x40, 0x48, 0x58, 0x58, 0x58, 0x48, 0x44, + 0xCF, 0xDE, 0xE0, 0xDD, 0xD0, 0x52, 0x41, 0x45, + 0xCD, 0x63, 0x61, 0x58, 0x4D, 0x51, 0x4C, 0x4B, + 0x54, 0x5D, 0xCC, 0xCE, 0x63, 0x61, 0x5D, 0x5D, + 0xFB, 0xFC, 0xFC, 0xFC, 0xFC, 0x4B, 0x27, 0x21, + 0x22, 0x22, 0x23, 0x22, 0x22, 0x24, 0x23, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x20, + 0x27, 0x2B, 0x41, 0x2B, 0x23, 0xFC, 0xB2, 0xB6, + 0x93, 0x90, 0x92, 0xB5, 0x92, 0x90, 0xB5, 0x90, + 0x92, 0x93, 0xBC, 0xAD, 0xDC, 0xF1, 0xF3, 0xF0, + 0xD9, 0x61, 0x41, 0x4A, 0x58, 0x57, 0x57, 0x44, + 0x49, 0xD2, 0xDD, 0xD8, 0xDA, 0x63, 0x4A, 0x45, + 0xCC, 0x63, 0x5E, 0x52, 0x4B, 0x4C, 0x49, 0x51, + 0x5C, 0x61, 0xCD, 0x65, 0x63, 0x5E, 0x4E, 0xCF, + 0xFB, 0xFB, 0xF0, 0xFC, 0xD2, 0x2A, 0x22, 0x23, + 0x22, 0x22, 0x23, 0x22, 0x22, 0x21, 0x22, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, + 0x23, 0x22, 0x26, 0x41, 0x27, 0xF9, 0x81, 0xB7, + 0xB5, 0x91, 0x92, 0xB5, 0x91, 0xB5, 0x93, 0xB5, + 0x93, 0xB6, 0xB7, 0xB9, 0xCB, 0xD8, 0xF3, 0xF2, + 0xF2, 0xDB, 0x61, 0x2D, 0x51, 0x58, 0x57, 0x58, + 0x41, 0x51, 0xD4, 0xDB, 0xDC, 0xD1, 0x5B, 0x4C, + 0xCB, 0x62, 0x59, 0x4C, 0x4A, 0x49, 0x4B, 0x55, + 0x60, 0x64, 0xCC, 0x64, 0x5E, 0x55, 0x60, 0xE1, + 0xFB, 0xF8, 0xFC, 0xFC, 0x21, 0x22, 0x22, 0x23, + 0x22, 0x22, 0x23, 0x22, 0x22, 0x21, 0x22, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, + 0x23, 0x22, 0x21, 0x24, 0x2D, 0x21, 0xB4, 0xBB, + 0xB6, 0xB5, 0xB6, 0xB7, 0xB7, 0xB7, 0xB7, 0xB6, + 0xB6, 0xB6, 0xBB, 0xB9, 0x45, 0xCB, 0xDF, 0xF3, + 0xF3, 0xF3, 0xDB, 0x5E, 0x2C, 0x51, 0x58, 0x58, + 0x52, 0x2D, 0x5C, 0xD4, 0xD9, 0xD5, 0x63, 0x58, + 0x64, 0x60, 0x53, 0x49, 0x4A, 0x49, 0x52, 0x5C, + 0x63, 0xCD, 0xCD, 0x63, 0x5C, 0x4E, 0x65, 0xFC, + 0xFC, 0xF5, 0xFC, 0xD2, 0x23, 0x22, 0x22, 0x23, + 0x22, 0x22, 0x23, 0x22, 0x22, 0x21, 0x22, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, + 0x23, 0x22, 0x21, 0x22, 0x25, 0x29, 0xB3, 0xC7, + 0xB5, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, + 0xB6, 0xB5, 0xC7, 0xAD, 0x57, 0x3F, 0xCB, 0xF0, + 0xF3, 0xF3, 0xF2, 0xD9, 0x58, 0x41, 0x4C, 0x58, + 0x57, 0x47, 0x42, 0x62, 0xD4, 0xD4, 0xCC, 0x60, + 0x63, 0x5D, 0x50, 0x47, 0x48, 0x4B, 0x58, 0x60, + 0xCC, 0xCE, 0xCD, 0x60, 0x53, 0x5C, 0x62, 0xFB, + 0xF9, 0xFC, 0xFC, 0x21, 0x23, 0x22, 0x22, 0x23, + 0x22, 0x22, 0x23, 0x23, 0x23, 0x21, 0x22, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, + 0x23, 0x22, 0x23, 0x23, 0x22, 0x23, 0x81, 0xC7, + 0xB7, 0xB7, 0xBC, 0xB7, 0xBC, 0xBC, 0xBC, 0xB7, + 0xB7, 0xB7, 0xC8, 0x80, 0x58, 0x57, 0x40, 0xCE, + 0xF3, 0xF2, 0xF2, 0xF0, 0xD5, 0x4C, 0x3F, 0x4B, + 0x52, 0x50, 0x2D, 0x4B, 0x64, 0xD2, 0xCC, 0x61, + 0x60, 0x58, 0x4A, 0x47, 0x47, 0x4C, 0x59, 0x64, + 0xD0, 0xD0, 0x64, 0x59, 0x49, 0x5D, 0xFB, 0xFC, + 0xD9, 0xFC, 0xD6, 0x23, 0x22, 0x22, 0x22, 0x23, + 0x22, 0x22, 0x23, 0x23, 0x21, 0x21, 0x22, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, + 0x23, 0x22, 0x23, 0x23, 0x22, 0x23, 0xB4, 0xC8, + 0xBD, 0xB7, 0xBD, 0xBC, 0xBD, 0xC5, 0xBC, 0xC5, + 0xBC, 0xBD, 0xC7, 0xAC, 0x58, 0x57, 0x58, 0x2C, + 0xD1, 0xF0, 0xF3, 0xF3, 0xE0, 0xCD, 0x45, 0x3E, + 0x48, 0x4B, 0x3F, 0x41, 0x56, 0x64, 0x65, 0x62, + 0x5D, 0x52, 0x47, 0x48, 0x48, 0x53, 0x60, 0xCC, + 0xD2, 0xD0, 0x63, 0x52, 0x4E, 0x53, 0xFB, 0xFB, + 0xFC, 0xFC, 0x23, 0x23, 0x22, 0x23, 0x22, 0x23, + 0x22, 0x22, 0x23, 0x23, 0x20, 0x21, 0x22, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, + 0x23, 0x22, 0x23, 0x22, 0x23, 0x22, 0xB4, 0xC7, + 0xC5, 0xBC, 0xC5, 0xBD, 0xC5, 0xC5, 0xBD, 0xC5, + 0xBC, 0xC6, 0xC7, 0xB9, 0x58, 0x57, 0x58, 0x57, + 0x2D, 0xD4, 0xF1, 0xF2, 0xF0, 0xD9, 0x5D, 0x47, + 0x48, 0x3F, 0x42, 0x2C, 0x48, 0x5C, 0x5F, 0x60, + 0x58, 0x50, 0x47, 0x4A, 0x49, 0x55, 0x63, 0xD0, + 0xD2, 0xCD, 0x5D, 0x49, 0x4E, 0xE1, 0xFC, 0xF0, + 0xFC, 0xF8, 0x22, 0x22, 0x22, 0x23, 0x22, 0x23, + 0x22, 0x22, 0x23, 0x20, 0x21, 0x21, 0x22, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x23, 0x22, + 0x23, 0x22, 0x23, 0x23, 0x23, 0x22, 0xC4, 0xC8, + 0xBD, 0xBD, 0xC6, 0xBD, 0xC6, 0xC6, 0xC5, 0xC6, + 0xBD, 0xC6, 0xC7, 0xE4, 0x54, 0x57, 0x58, 0x57, + 0x57, 0x43, 0xD7, 0xE0, 0xF1, 0xD8, 0xCD, 0x4B, + 0x4A, 0x47, 0x42, 0x2C, 0x3F, 0x4D, 0x58, 0x5C, + 0x52, 0x4B, 0x48, 0x4B, 0x4A, 0x58, 0xCB, 0xD3, + 0xD2, 0xCD, 0x58, 0x47, 0x4A, 0xFC, 0xFC, 0xFB, + 0xFC, 0x2B, 0x22, 0x22, 0x22, 0x23, 0x22, 0x23, + 0x22, 0x22, 0x23, 0x26, 0x21, 0x21, 0x23, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x23, + 0x22, 0x23, 0x22, 0x23, 0x22, 0x23, 0xE5, 0xC8, + 0xBA, 0xC5, 0xC6, 0xC6, 0xC6, 0xC7, 0xC6, 0xC7, + 0xC5, 0xC6, 0xC8, 0xE5, 0x2E, 0x54, 0x58, 0x57, + 0x57, 0x4C, 0x4D, 0xDA, 0xD8, 0xD8, 0xD4, 0x5C, + 0x4B, 0x4B, 0x3F, 0x42, 0x44, 0x4A, 0x51, 0x58, + 0x4B, 0x48, 0x4B, 0x51, 0x4D, 0x5F, 0xD0, 0xD1, + 0xD0, 0x64, 0x51, 0x44, 0x6B, 0xFC, 0xFB, 0xFC, + 0xFC, 0x21, 0x23, 0x22, 0x22, 0x23, 0x22, 0x23, + 0x22, 0x22, 0x23, 0x26, 0x21, 0x23, 0x23, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x23, + 0x22, 0x23, 0x22, 0x23, 0x23, 0x23, 0xE5, 0xED, + 0xE7, 0xBA, 0xC8, 0xC6, 0xC6, 0xC6, 0xC6, 0xC7, + 0xC7, 0xE5, 0xED, 0xE6, 0x61, 0x41, 0x52, 0x58, + 0x58, 0x57, 0x45, 0x5E, 0xD7, 0xDD, 0xD5, 0x60, + 0x4B, 0x4C, 0x48, 0x4D, 0x4D, 0x50, 0x4D, 0x56, + 0x4A, 0x3E, 0x53, 0x53, 0x52, 0x63, 0xD3, 0xD0, + 0xCE, 0x60, 0x4A, 0x45, 0xFC, 0xFC, 0xF7, 0xFC, + 0xFC, 0x21, 0x23, 0x23, 0x22, 0x23, 0x22, 0x23, + 0x22, 0x23, 0x21, 0x2A, 0x20, 0x23, 0x23, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, + 0x23, 0x22, 0x23, 0x22, 0x21, 0x23, 0xEB, 0xF6, + 0xF6, 0xED, 0xED, 0xED, 0xED, 0xED, 0xED, 0xED, + 0xF6, 0xF6, 0xF6, 0xE6, 0xDB, 0x58, 0x45, 0x4B, + 0x58, 0x57, 0x4D, 0x4B, 0x64, 0xD4, 0xD0, 0x5C, + 0x48, 0x51, 0x4C, 0x5D, 0x5E, 0x5C, 0x56, 0x59, + 0x3E, 0x4A, 0x58, 0x54, 0x52, 0x65, 0xD3, 0xD0, + 0xCF, 0x5D, 0x48, 0xFC, 0xFC, 0xFC, 0xFA, 0xFC, + 0xFC, 0x21, 0x22, 0x23, 0x22, 0x23, 0x22, 0x23, + 0x22, 0x23, 0x21, 0x2A, 0x21, 0x23, 0x23, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, + 0x23, 0x22, 0x23, 0x22, 0x21, 0x4F, 0xE6, 0xC6, + 0xC6, 0xBD, 0xC6, 0xBD, 0xBD, 0xBD, 0xBD, 0xC6, + 0xC5, 0xBA, 0xC7, 0xE6, 0xF2, 0xD4, 0x49, 0x4B, + 0x3E, 0x4D, 0x52, 0x3E, 0x52, 0x63, 0x64, 0x56, + 0x48, 0x54, 0x4D, 0x61, 0xCC, 0xCC, 0x60, 0x60, + 0x47, 0x4D, 0x5C, 0x53, 0x58, 0xCF, 0xD1, 0xCF, + 0xD0, 0x59, 0x45, 0xFC, 0xFC, 0xFC, 0xEF, 0xF9, + 0xFC, 0x21, 0x23, 0x22, 0x23, 0x22, 0x23, 0x22, + 0x23, 0x22, 0x23, 0x2A, 0x21, 0x23, 0x23, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, + 0x23, 0x22, 0x23, 0x22, 0x23, 0x4F, 0xE4, 0xB9, + 0xAF, 0x80, 0x80, 0x8E, 0x8E, 0x8E, 0x8E, 0x8F, + 0x80, 0xB4, 0xB9, 0xE4, 0x7F, 0xDE, 0x61, 0x52, + 0x54, 0x48, 0x3F, 0x43, 0x4D, 0x56, 0x59, 0x4B, + 0x3E, 0x58, 0x53, 0x61, 0xD3, 0xD4, 0xCF, 0xCD, + 0x4C, 0x58, 0x5F, 0x53, 0x5E, 0xD3, 0xD0, 0xCE, + 0xCE, 0x52, 0x3F, 0xFC, 0xFC, 0xFC, 0xF7, 0x65, + 0xFA, 0x22, 0x23, 0x22, 0x23, 0x22, 0x23, 0x22, + 0x23, 0x22, 0x21, 0x2A, 0x23, 0x23, 0x23, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, + 0x23, 0x22, 0x23, 0x22, 0x21, 0xB1, 0xE4, 0xE6, + 0x7C, 0xB1, 0x7C, 0xB1, 0xB2, 0xB2, 0xB3, 0x3D, + 0xB3, 0x3C, 0xE5, 0xB3, 0xB0, 0xF1, 0xD0, 0x58, + 0x5D, 0x4D, 0x40, 0x41, 0x48, 0x51, 0x4C, 0x3F, + 0x3F, 0x4D, 0x5A, 0x5A, 0xD5, 0xD9, 0xD7, 0xD4, + 0x57, 0x5E, 0x61, 0x4C, 0x63, 0xD4, 0xCF, 0xCE, + 0xCB, 0x4D, 0x4A, 0xFC, 0xFC, 0xFC, 0xFC, 0xF0, + 0xFB, 0x22, 0x23, 0x22, 0x23, 0x22, 0x23, 0x22, + 0x23, 0x22, 0x23, 0x2A, 0x21, 0x23, 0x23, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, + 0x22, 0x23, 0x22, 0x23, 0x23, 0xB1, 0x81, 0x7D, + 0x39, 0x35, 0x35, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x7C, 0xB2, 0xB0, 0xDF, 0xD2, 0x57, + 0x60, 0x59, 0x5B, 0x59, 0x52, 0x4C, 0x4A, 0x40, + 0x42, 0x4A, 0x53, 0x4D, 0xD2, 0xDE, 0xDE, 0xD9, + 0x5E, 0x5E, 0x60, 0x4A, 0xCD, 0xD1, 0xCF, 0xCE, + 0x63, 0x49, 0x5C, 0xFB, 0xE8, 0x89, 0x9F, 0xFC, + 0xD6, 0x21, 0x21, 0x23, 0x22, 0x22, 0x23, 0x22, + 0x23, 0x22, 0x21, 0x2A, 0x22, 0x23, 0x23, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, + 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x7F, 0xB9, + 0x71, 0x6C, 0x38, 0x38, 0x33, 0x33, 0x33, 0x38, + 0x38, 0x71, 0xAD, 0xE4, 0xD3, 0xDA, 0xCC, 0x52, + 0x63, 0x60, 0xCE, 0xD4, 0xCF, 0x60, 0x4C, 0x40, + 0x3F, 0x45, 0x4B, 0x5A, 0xCB, 0xD8, 0xDE, 0xDC, + 0x5E, 0x5E, 0x5F, 0x4C, 0xD2, 0xD2, 0xCF, 0xCF, + 0x61, 0x45, 0x5E, 0xA7, 0x9D, 0x95, 0x8B, 0x99, + 0xFC, 0x41, 0x21, 0x23, 0x23, 0x22, 0x23, 0x22, + 0x23, 0x22, 0x23, 0x2A, 0x23, 0x23, 0x23, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x77, 0x77, 0xF6, + 0xFC, 0x7D, 0x7D, 0x7E, 0x7E, 0x7E, 0x7E, 0x7D, + 0x7D, 0xFC, 0x47, 0x64, 0xD0, 0xD0, 0x5D, 0x4B, + 0x62, 0xCC, 0xD1, 0xDE, 0xDE, 0xD4, 0x5E, 0x43, + 0x3F, 0x3E, 0x48, 0x53, 0x58, 0xDB, 0xD8, 0xDC, + 0x5E, 0x5E, 0x5E, 0x53, 0xD4, 0xD2, 0xD0, 0xD0, + 0x5E, 0x49, 0xA7, 0xA6, 0x89, 0x95, 0x8B, 0x9C, + 0x9C, 0xFB, 0xD4, 0x22, 0x22, 0x22, 0x22, 0x23, + 0x22, 0x23, 0x23, 0x2A, 0x22, 0x23, 0x23, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x23, + 0x23, 0x22, 0x23, 0x23, 0x98, 0x8C, 0x8C, 0x88, + 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xF8, + 0xE9, 0x9C, 0x48, 0x5C, 0xD0, 0xCB, 0x48, 0x49, + 0x5B, 0xCB, 0xCD, 0xE0, 0xF1, 0xDD, 0xD0, 0x4A, + 0x41, 0x47, 0x45, 0x4C, 0x48, 0xD7, 0xDE, 0xDC, + 0x5E, 0x5E, 0x5A, 0x58, 0xD1, 0xD0, 0xD0, 0xD2, + 0x5C, 0x55, 0xA7, 0xA6, 0x87, 0x86, 0x89, 0x94, + 0x9C, 0xA9, 0xFC, 0xF4, 0x22, 0x23, 0x22, 0x23, + 0x22, 0x23, 0x22, 0x2A, 0x21, 0x23, 0x23, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x23, + 0x22, 0x23, 0x22, 0x23, 0xA4, 0x89, 0x8C, 0xAA, + 0xFB, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xF7, + 0x85, 0x88, 0x8D, 0x59, 0x64, 0x63, 0x47, 0x3E, + 0x4C, 0x60, 0x61, 0xE0, 0xF0, 0xDF, 0xD9, 0x5D, + 0x2E, 0x3E, 0x3E, 0x47, 0x4D, 0xCD, 0xDE, 0xDC, + 0x5D, 0x5C, 0x51, 0x5D, 0xD1, 0xD2, 0xD2, 0xD4, + 0x5A, 0xBE, 0xA7, 0x98, 0x8A, 0x8A, 0xA0, 0x8B, + 0x86, 0x86, 0xF7, 0xFC, 0xF7, 0x26, 0x23, 0x23, + 0x22, 0x22, 0x22, 0x22, 0x21, 0x22, 0x23, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x23, + 0x22, 0x21, 0x21, 0x21, 0xA1, 0x98, 0x9F, 0xBF, + 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xA7, + 0x8C, 0x86, 0x8D, 0x59, 0x5E, 0x5D, 0x3F, 0x3E, + 0x47, 0x53, 0x63, 0xD9, 0xF0, 0xF1, 0xDE, 0xD0, + 0x43, 0x3E, 0x47, 0x45, 0x4A, 0x5B, 0xDC, 0xDA, + 0x5D, 0x59, 0x49, 0x5F, 0xD1, 0xD2, 0xD3, 0xB9, + 0xA5, 0xA7, 0x98, 0x9B, 0x96, 0x9D, 0x89, 0x89, + 0x8B, 0x9C, 0x9D, 0xFC, 0xFC, 0xFC, 0x26, 0x22, + 0x23, 0x23, 0x22, 0x22, 0x21, 0x22, 0x23, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x23, + 0x22, 0x22, 0x29, 0x2D, 0x99, 0x99, 0xA2, 0xAA, + 0xC4, 0xFB, 0xFC, 0xFC, 0xFC, 0xF6, 0xBF, 0xA2, + 0x9C, 0x9C, 0x8E, 0xDC, 0xCD, 0x51, 0x41, 0x3E, + 0x45, 0x49, 0x58, 0xCD, 0xE0, 0xE0, 0xD8, 0xDA, + 0x4C, 0x4A, 0x45, 0x45, 0x48, 0x47, 0xDA, 0xDA, + 0x5C, 0x58, 0x44, 0x69, 0xA9, 0x98, 0xA4, 0xA6, + 0xA1, 0xA4, 0x99, 0x9E, 0x9D, 0x8B, 0x8A, 0x97, + 0x87, 0x9A, 0x8A, 0xC2, 0xFC, 0xFC, 0xFC, 0x4D, + 0x21, 0x21, 0x23, 0x22, 0x21, 0x22, 0x23, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x23, 0x22, + 0x21, 0x22, 0x2D, 0x34, 0xA4, 0xA2, 0xA2, 0xA9, + 0xBF, 0xC0, 0xC3, 0xC1, 0xC0, 0xBE, 0xA6, 0x9D, + 0x99, 0x87, 0xA2, 0xF1, 0xDC, 0x64, 0x42, 0x45, + 0x47, 0x3E, 0x49, 0x4C, 0xDD, 0xDF, 0xD8, 0xDB, + 0x5E, 0x4C, 0x48, 0x45, 0x45, 0x41, 0xD1, 0xD6, + 0x5A, 0x55, 0x3F, 0xA7, 0xA1, 0x98, 0x9F, 0x99, + 0x9F, 0x9D, 0x9A, 0x95, 0x8B, 0x97, 0x89, 0x8A, + 0x88, 0x94, 0x9C, 0x8C, 0xFC, 0xFC, 0xFC, 0xFC, + 0xF4, 0x21, 0x23, 0x22, 0x21, 0x22, 0x23, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x23, + 0x23, 0x23, 0x2C, 0x2C, 0xA8, 0xA2, 0xA4, 0xA4, + 0xA9, 0xAA, 0xAA, 0xAA, 0xA9, 0xA6, 0x98, 0x9C, + 0x8B, 0x88, 0x98, 0x8D, 0xD8, 0xD6, 0x4E, 0x47, + 0x47, 0x49, 0x47, 0x3F, 0xDA, 0xDD, 0xDE, 0xDD, + 0xCC, 0x4A, 0x4B, 0x3E, 0x45, 0x43, 0x61, 0xD4, + 0x56, 0x51, 0x44, 0xA4, 0x9B, 0x8B, 0x9C, 0x9A, + 0xA0, 0xA2, 0x98, 0x98, 0x8B, 0x8B, 0x98, 0x98, + 0x84, 0x8B, 0x94, 0x8A, 0xA4, 0xFC, 0xFC, 0xFC, + 0xFC, 0xF2, 0x21, 0x22, 0x21, 0x22, 0x23, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x23, 0x23, + 0x23, 0x22, 0x2C, 0x2D, 0xC0, 0xA4, 0xA2, 0xA4, + 0xA4, 0xA6, 0xA6, 0xA6, 0xA4, 0xA2, 0x9F, 0x89, + 0x8B, 0x9C, 0x9C, 0x8B, 0x68, 0xDB, 0x5F, 0x4B, + 0x3E, 0x49, 0x4B, 0x3E, 0xCC, 0xDA, 0xDC, 0xDD, + 0xD3, 0x49, 0x52, 0x48, 0x45, 0x45, 0x53, 0xD0, + 0x51, 0x4A, 0x44, 0xA4, 0x9B, 0x8B, 0x9C, 0xA0, + 0x9B, 0x86, 0x89, 0x98, 0x89, 0x8A, 0x96, 0x8A, + 0x9C, 0x89, 0x89, 0x9C, 0x8C, 0xF6, 0xFC, 0xFC, + 0xFC, 0xFC, 0x21, 0x22, 0x21, 0x22, 0x23, 0x22, + 0x22, 0x22, 0x22, 0x23, 0x22, 0x21, 0x22, 0x23, + 0x22, 0x21, 0x2B, 0x34, 0xC0, 0xA8, 0xA4, 0xA2, + 0xA2, 0x98, 0xA1, 0xA0, 0x98, 0x9F, 0x95, 0x8A, + 0x94, 0xA1, 0x8A, 0x84, 0x9B, 0x68, 0xCC, 0x49, + 0x4A, 0x47, 0x4C, 0x4B, 0x51, 0xD3, 0xDA, 0xDC, + 0xD5, 0x56, 0x56, 0x4A, 0x3E, 0x45, 0x48, 0x63, + 0x4A, 0x47, 0x3E, 0xA7, 0x98, 0x9D, 0x9E, 0x8B, + 0x95, 0x9B, 0x89, 0x86, 0x9B, 0x8B, 0x89, 0x84, + 0x9A, 0xA1, 0x95, 0x9A, 0x8C, 0xA4, 0xFC, 0xFC, + 0xFC, 0xFA, 0x23, 0x22, 0x21, 0x22, 0x23, 0x22, + 0x22, 0x22, 0x22, 0x23, 0x22, 0x21, 0x22, 0x23, + 0x21, 0x23, 0x2C, 0xF6, 0xBF, 0xA9, 0xA2, 0x99, + 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9B, 0x87, 0x8B, + 0x9C, 0x86, 0x9C, 0x8A, 0x87, 0x87, 0x89, 0x51, + 0x54, 0x47, 0x4B, 0x50, 0x4B, 0xCF, 0xD6, 0xDC, + 0xD5, 0x60, 0x54, 0x52, 0x48, 0x45, 0x40, 0x5A, + 0x45, 0x43, 0x47, 0xA7, 0x98, 0x9B, 0x95, 0x95, + 0x9A, 0x87, 0x98, 0x98, 0x8A, 0x86, 0x87, 0x9E, + 0x9B, 0x95, 0x9D, 0x9D, 0x99, 0x85, 0xA6, 0xFA, + 0xF2, 0x21, 0x23, 0x22, 0x21, 0x22, 0x23, 0x22, + 0x22, 0x22, 0x22, 0x23, 0x22, 0x21, 0x22, 0x22, + 0x21, 0x24, 0xFB, 0xF7, 0xBF, 0xA6, 0xA2, 0x99, + 0x97, 0x89, 0x86, 0x89, 0x9C, 0x96, 0x9E, 0x94, + 0x89, 0x99, 0x98, 0x89, 0x9E, 0x9B, 0x89, 0x8B, + 0x58, 0x4B, 0x4A, 0x52, 0x48, 0xCC, 0xD3, 0xDA, + 0xD3, 0x65, 0x4C, 0x58, 0x49, 0x3E, 0x2E, 0x4D, + 0x40, 0x41, 0x45, 0xA9, 0xA1, 0x9B, 0x9E, 0x9C, + 0x95, 0x8A, 0x94, 0x89, 0x96, 0x87, 0x9C, 0x9A, + 0x84, 0x9D, 0x9C, 0x9E, 0x9A, 0x9C, 0x9D, 0xBB, + 0x23, 0x23, 0x22, 0x22, 0x21, 0x22, 0x23, 0x22, + 0x22, 0x22, 0x22, 0x23, 0x22, 0x21, 0x23, 0x23, + 0x24, 0xFC, 0xFC, 0xF6, 0xBF, 0xA6, 0x9F, 0x99, + 0x89, 0x95, 0x87, 0x94, 0x9D, 0x9E, 0x97, 0x9E, + 0x95, 0x9B, 0x89, 0x95, 0x95, 0x9B, 0x89, 0x87, + 0x5D, 0x56, 0x3E, 0x51, 0x3E, 0x60, 0xCF, 0xD3, + 0xD2, 0xCD, 0x5C, 0x49, 0x4B, 0x3E, 0x2C, 0x48, + 0x3E, 0x43, 0x3E, 0xA9, 0xA1, 0x9B, 0x97, 0x94, + 0x95, 0x9A, 0x9C, 0x87, 0x87, 0x9B, 0x9C, 0x95, + 0x9D, 0x89, 0x9A, 0x89, 0x9E, 0x9E, 0x8C, 0xA6, + 0x20, 0x23, 0x23, 0x22, 0x23, 0x22, 0x23, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x21, 0x21, 0x20, 0x40, + 0xFC, 0xFC, 0xFC, 0xEC, 0xBE, 0xA4, 0x9F, 0x99, + 0x95, 0x9F, 0xA0, 0x88, 0x9D, 0x8B, 0x97, 0x95, + 0x87, 0x95, 0x96, 0x95, 0x97, 0x94, 0x94, 0x98, + 0xD3, 0x4C, 0x47, 0x4D, 0x42, 0x4C, 0x60, 0xCC, + 0xCE, 0xD0, 0x65, 0x4B, 0x47, 0x44, 0x2B, 0x45, + 0x4B, 0x47, 0x49, 0xA7, 0xA1, 0x9A, 0x97, 0x89, + 0x95, 0x97, 0x97, 0x9E, 0x89, 0x95, 0x89, 0x9C, + 0x87, 0x95, 0x97, 0x99, 0x95, 0x99, 0x9F, 0xA4, + 0xC4, 0x21, 0x21, 0x23, 0x21, 0x23, 0x23, 0x23, + 0x23, 0x23, 0x23, 0x23, 0x21, 0x20, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFC, 0xEA, 0xAA, 0xA6, 0xA2, 0x99, + 0x8B, 0x9A, 0x95, 0x9E, 0x9E, 0x9A, 0x94, 0x87, + 0x94, 0x94, 0x89, 0x94, 0x9B, 0x9B, 0xA7, 0xDC, + 0xDB, 0x65, 0x2E, 0x3E, 0x43, 0x44, 0x49, 0x58, + 0x63, 0xD3, 0xD3, 0x5E, 0x42, 0x42, 0x2D, 0x40, + 0x54, 0x4C, 0x4A, 0xA7, 0xA0, 0x99, 0x9B, 0x94, + 0xA0, 0x8A, 0x9B, 0x9D, 0x87, 0x95, 0x94, 0x8B, + 0x8A, 0x98, 0x9C, 0x8A, 0x9B, 0x99, 0xA2, 0xA6, + 0xBF, 0xEC, 0x2A, 0x20, 0x21, 0x23, 0x21, 0x20, + 0x20, 0x20, 0x20, 0x4C, 0xF9, 0xFC, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFC, 0xEB, 0xAA, 0xA4, 0x9F, 0x9C, + 0x8B, 0x9B, 0x88, 0x84, 0x9E, 0x9D, 0x96, 0x94, + 0x94, 0x9A, 0x9B, 0x9B, 0xA4, 0xD5, 0xCD, 0xDE, + 0xF1, 0xDA, 0x4C, 0x2D, 0x41, 0x2B, 0x42, 0x4C, + 0x5E, 0xD4, 0xD7, 0xCD, 0x49, 0x2E, 0x2E, 0x41, + 0x5E, 0x57, 0xA7, 0xA6, 0xA7, 0xA4, 0xA2, 0x98, + 0x9D, 0x9C, 0xA1, 0x99, 0x9D, 0x88, 0x8B, 0x9C, + 0x8A, 0x9C, 0x9C, 0x94, 0x9C, 0x89, 0xA0, 0xA6, + 0xAA, 0xEB, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFB, 0xE9, 0xAA, 0xA6, 0xA2, 0x8B, + 0x8B, 0x8A, 0x86, 0x9B, 0x9C, 0x98, 0xA0, 0x9B, + 0x9B, 0x84, 0xA7, 0xB4, 0x61, 0xD1, 0xD2, 0xE0, + 0xF1, 0xDC, 0x61, 0x2D, 0x2E, 0x3F, 0x56, 0x62, + 0x5D, 0xD4, 0xD9, 0xD3, 0x54, 0x41, 0x41, 0x44, + 0xCB, 0x60, 0x52, 0xA9, 0xA9, 0xA9, 0xA7, 0xA6, + 0xA6, 0xA4, 0xA4, 0xA2, 0xA2, 0x9D, 0x95, 0x89, + 0x9C, 0x8A, 0x9E, 0x9C, 0x8A, 0x9E, 0xA0, 0xA8, + 0xC0, 0xE9, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFC, 0xE9, 0xAA, 0xA6, 0xA0, 0x99, + 0x9C, 0x8B, 0x9A, 0x84, 0x9B, 0x9B, 0x98, 0x98, + 0xA9, 0xB9, 0x49, 0x57, 0xCB, 0xD4, 0xD3, 0xF1, + 0xD8, 0xDA, 0xCE, 0x3F, 0x41, 0x4B, 0x5D, 0xCB, + 0x5E, 0xD6, 0xDB, 0xD6, 0x5D, 0x43, 0x3F, 0x49, + 0xD1, 0xCC, 0x4F, 0xDD, 0xC3, 0xBB, 0xBF, 0xAA, + 0xAA, 0xA9, 0xAA, 0xA8, 0xA8, 0xA6, 0xA6, 0xA2, + 0x9C, 0x9F, 0x9B, 0x9A, 0x9D, 0xA2, 0xA8, 0xAA, + 0xC1, 0xEA, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFC, 0xEA, 0xC0, 0xAA, 0xA6, 0xA2, + 0xA2, 0x99, 0xA0, 0xA0, 0xA4, 0xA7, 0xA9, 0xC0, + 0x67, 0x49, 0x54, 0x60, 0xD0, 0xD4, 0xCC, 0xDF, + 0xD9, 0xD5, 0xD2, 0x3E, 0x47, 0x56, 0x60, 0xCD, + 0x5D, 0xD9, 0xD9, 0xD6, 0x61, 0x3F, 0x47, 0x52, + 0xD6, 0xD3, 0x62, 0x4D, 0x40, 0x4A, 0x57, 0xCA, + 0xC3, 0xC1, 0xC1, 0xC0, 0xBF, 0xBF, 0xAA, 0xAA, + 0xA6, 0xA4, 0xA4, 0xA4, 0xA6, 0xA8, 0xBE, 0xC1, + 0xC9, 0xEB, 0xFB, 0xFB, 0xFC, 0xFC, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFC, 0xEB, 0xC3, 0xC0, 0xAA, 0xA8, + 0xA6, 0xA6, 0xA6, 0xA9, 0xAA, 0xC0, 0xE8, 0xD0, + 0xD2, 0x4C, 0x5E, 0x64, 0xD0, 0xD1, 0x5F, 0xD9, + 0xD5, 0xD1, 0xD0, 0x48, 0x52, 0x5C, 0x64, 0xCD, + 0x5C, 0xDC, 0xD7, 0xD5, 0x62, 0x3F, 0x4C, 0x53, + 0xDA, 0xD7, 0xCE, 0x56, 0x40, 0x4B, 0x52, 0x56, + 0xCE, 0xDF, 0x6A, 0xEB, 0xE9, 0xC9, 0xC3, 0xC0, + 0xC0, 0xBF, 0xBE, 0xAA, 0xBF, 0xC0, 0xC3, 0xC9, + 0xEA, 0xF6, 0xEE, 0x58, 0x57, 0x5E, 0xD6, 0xD0, + 0xD2, 0x61, 0xCB, 0xD6, 0xD6, 0xD4, 0xDF, 0xF3, + 0xF2, 0xDD, 0xD7, 0xEB, 0xC9, 0xC1, 0xC0, 0xBF, + 0xAA, 0xAA, 0xAA, 0xBE, 0xC3, 0xF0, 0xD2, 0xD2, + 0xD2, 0x51, 0x62, 0xCC, 0xD0, 0xCC, 0x61, 0xD3, + 0xCF, 0xCE, 0xD2, 0x48, 0x5A, 0x61, 0xCC, 0xCE, + 0x5F, 0xD9, 0xD5, 0xD1, 0x63, 0x44, 0x56, 0x56, + 0xDC, 0xD9, 0xD4, 0x5E, 0x42, 0x4A, 0x4C, 0x57, + 0x5D, 0xD8, 0xE0, 0xD8, 0xDC, 0xCB, 0x66, 0xEC, + 0xE8, 0xC3, 0xC3, 0xC3, 0xC3, 0xC9, 0xE8, 0xEA, + 0xF6, 0x50, 0x3E, 0x58, 0x57, 0x5A, 0xD6, 0xD4, + 0xCC, 0x4B, 0x53, 0x5C, 0x64, 0xD1, 0xDF, 0xF3, + 0xF1, 0xDE, 0xD9, 0xF6, 0xEB, 0xC9, 0xC1, 0xC1, + 0xC0, 0xC0, 0xC1, 0xC9, 0xF0, 0xD6, 0xCD, 0xD6, + 0xD3, 0x53, 0xCB, 0xCF, 0xCD, 0x5F, 0x5F, 0xCE, + 0xCF, 0xCD, 0xD0, 0x47, 0x5F, 0xCB, 0xCE, 0xCD, + 0x63, 0xD6, 0xD3, 0xD1, 0x63, 0x3F, 0x58, 0x58, + 0xDB, 0xDC, 0xDA, 0x65, 0x3E, 0x49, 0x49, 0x4D, + 0x49, 0xDC, 0xDF, 0xE0, 0xDE, 0xD5, 0x47, 0x47, + 0x46, 0x6B, 0xEB, 0xEA, 0xE9, 0xEA, 0xEB, 0xF6, + 0xD0, 0x57, 0x57, 0x47, 0x47, 0x5B, 0xD4, 0xD4, + 0xCD, 0x44, 0x3E, 0x4B, 0x50, 0x4B, 0x51, 0xD5, + 0xDB, 0xD8, 0xDE, 0x4B, 0xF6, 0xF6, 0xEA, 0xE9, + 0xE8, 0xEA, 0xEB, 0x67, 0x5E, 0xCC, 0xD6, 0xDC, + 0xD5, 0x58, 0xCE, 0xCE, 0x62, 0x50, 0xCC, 0xD3, + 0xD2, 0xCD, 0xCD, 0x4B, 0x64, 0xCE, 0xCE, 0x64, + 0xCC, 0xD3, 0xD2, 0xD2, 0x61, 0x47, 0x5D, 0x5C, + 0xDD, 0xDD, 0xD9, 0xD1, 0x4C, 0x47, 0x49, 0x4A, + 0x4B, 0xD1, 0xD8, 0xE0, 0xDF, 0xDD, 0x5D, 0x4A, + 0x48, 0x52, 0x51, 0x3F, 0xF6, 0xEC, 0xE0, 0xE0, + 0xD3, 0x5E, 0x5F, 0x50, 0x4B, 0x50, 0xCB, 0xCE, + 0x64, 0x45, 0x4C, 0x57, 0x57, 0x58, 0x52, 0xD6, + 0xD3, 0xDE, 0xDF, 0xD1, 0x3E, 0x4B, 0xF6, 0xF6, + 0xEC, 0x66, 0x53, 0x43, 0x56, 0xD1, 0xD9, 0xDE, + 0xD4, 0x5E, 0xCE, 0xCC, 0x5B, 0x2C, 0xD4, 0xD5, + 0xD2, 0xD0, 0x63, 0x5D, 0xCD, 0xD0, 0xCD, 0x5E, + 0xD0, 0xCF, 0xCE, 0xD2, 0x5E, 0x50, 0x60, 0x5D, + 0xDE, 0xDD, 0xDC, 0xD7, 0x5D, 0x45, 0x47, 0x3E, + 0x4B, 0x5E, 0xDE, 0xDF, 0xE0, 0xD8, 0xCF, 0x3E, + 0x45, 0x51, 0x58, 0x42, 0xCB, 0xDA, 0xDE, 0xD8, + 0xD2, 0x61, 0xCC, 0xCF, 0xD6, 0xDA, 0xDA, 0xD5, + 0xD0, 0x50, 0x44, 0x57, 0x57, 0x58, 0x45, 0xD1, + 0xD1, 0xD7, 0xDF, 0xDF, 0xD7, 0xCF, 0x64, 0x60, + 0xCE, 0xCE, 0xCE, 0x63, 0xCF, 0xDA, 0xDE, 0xD9, + 0xCF, 0x63, 0xCD, 0x63, 0x4D, 0x4B, 0xD6, 0xD5, + 0xCE, 0xD3, 0x60, 0xCB, 0xD0, 0xD0, 0x65, 0x47, + 0xD0, 0xCC, 0xCC, 0xD1, 0x59, 0x5D, 0x63, 0x5E, + 0xDD, 0xDD, 0xDE, 0xDC, 0xCB, 0x40, 0x48, 0x45, + 0x3E, 0x3E, 0xD9, 0xDF, 0xE0, 0xDF, 0xDA, 0x51, + 0x4C, 0x48, 0x56, 0x4C, 0x5B, 0xD2, 0xDA, 0xDB, + 0xCB, 0x5F, 0xD0, 0xCC, 0xDC, 0xF0, 0xF3, 0xE0, + 0xDD, 0xCC, 0x41, 0x50, 0x57, 0x57, 0x4B, 0x5D, + 0xD3, 0xD1, 0xDE, 0xDF, 0xDE, 0xD7, 0xD0, 0xD0, + 0xD5, 0xD6, 0xD6, 0xCE, 0xD7, 0xDC, 0xDA, 0xD5, + 0x60, 0x63, 0x64, 0x5E, 0x47, 0x61, 0xD5, 0xD2, + 0xCF, 0xD0, 0x59, 0xCD, 0xD1, 0xCF, 0x61, 0x4D, + 0xCC, 0xCE, 0xCD, 0xD0, 0x52, 0x61, 0x64, 0x60, + 0xDA, 0xDE, 0xDE, 0xDD, 0xD1, 0x4B, 0x4A, 0x45, + 0x3E, 0x41, 0xCD, 0xDE, 0xE0, 0xF1, 0xDE, 0x63, + 0x4A, 0x4A, 0x4A, 0x4B, 0x50, 0xCB, 0xD4, 0xD7, + 0x5E, 0x54, 0x62, 0xD3, 0xD4, 0xF0, 0xF3, 0xF3, + 0xF2, 0xDE, 0x61, 0x40, 0x49, 0x56, 0x4D, 0x3E, + 0x4B, 0xCE, 0xD9, 0xD8, 0xD9, 0xD5, 0xCF, 0xD2, + 0xD6, 0xD6, 0xD1, 0xD1, 0xD7, 0xD5, 0xCF, 0xD0, + 0x54, 0x64, 0x63, 0x56, 0x2C, 0xCB, 0xD1, 0xCC, + 0xD3, 0xCD, 0x54, 0xCF, 0xD1, 0xCE, 0x5E, 0x5C, + 0xCE, 0xCE, 0xCE, 0xCB, 0x4B, 0x63, 0xCC, 0x61, + 0xD4, 0xDC, 0xDE, 0xDE, 0xDA, 0x5D, 0x45, 0x45, + 0x48, 0x3F, 0x52, 0xD9, 0xD8, 0xDF, 0xDF, 0xD2, + 0x52, 0x4B, 0x3E, 0x2E, 0x47, 0x60, 0xCF, 0xD3, + 0x59, 0x48, 0x50, 0x5E, 0xCC, 0xDE, 0xF2, 0xF2, + 0xF3, 0xF3, 0xDD, 0x5D, 0x3E, 0x48, 0x47, 0x47, + 0x58, 0xD1, 0xDA, 0xDA, 0xD5, 0xD1, 0xCD, 0xD2, + 0xD3, 0xCF, 0xD3, 0xD1, 0xCD, 0xD3, 0xD2, 0x5E, + 0x52, 0x64, 0x60, 0x4B, 0x45, 0x61, 0xCD, 0xD3, + 0xD3, 0x64, 0x61, 0xD0, 0xD0, 0x64, 0x45, 0x63, + 0xD0, 0xCE, 0xD0, 0x60, 0x56, 0xCB, 0xCC, 0x62, + 0xCE, 0xDA, 0xDE, 0xD8, 0xDD, 0xCC, 0x45, 0x49, + 0x3E, 0x47, 0x42, 0xD1, 0xDC, 0xD8, 0xD8, 0xD3, + 0x5D, 0x4C, 0x49, 0x3F, 0x47, 0x59, 0xCD, 0xCF, + 0x59, 0x2E, 0x48, 0x47, 0x52, 0x63, 0xF0, 0xF2, + 0xF3, 0xF3, 0xF2, 0xDA, 0x52, 0x4B, 0x52, 0x58, + 0x5E, 0x63, 0xD0, 0xD0, 0xD0, 0xCF, 0xCE, 0xCE, + 0xCF, 0x65, 0x61, 0xD6, 0xD6, 0xD6, 0xCB, 0x4B, + 0x61, 0x62, 0x5D, 0x43, 0x4B, 0x61, 0xD0, 0xD4, + 0xD1, 0x61, 0xCE, 0xD2, 0xCD, 0x5E, 0x4A, 0xCE, + 0xD0, 0xCC, 0xD0, 0x59, 0x61, 0xCC, 0xCC, 0x62, + 0xD1, 0xD5, 0xDE, 0xD8, 0xDD, 0xCF, 0x4B, 0x4A, + 0x45, 0x3E, 0x2D, 0xCB, 0xDC, 0xDE, 0xD8, 0xD5, + 0x60, 0x54, 0x51, 0x4C, 0x4D, 0x5C, 0xCC, 0xCE, + 0x5A, 0x2C, 0x50, 0x53, 0x3E, 0x59, 0xD8, 0xF3, + 0xF2, 0xF3, 0xF3, 0xE0, 0x5E, 0x4A, 0x4C, 0x53, + 0x5E, 0x63, 0xCC, 0xCC, 0xCC, 0xCD, 0xCF, 0xD3, + 0x62, 0x53, 0xD6, 0xD6, 0xD6, 0xD6, 0x5B, 0x48, + 0x64, 0x63, 0x59, 0x44, 0x57, 0x63, 0xD2, 0xD3, + 0xD0, 0x5E, 0xD0, 0xD1, 0xCB, 0x58, 0x4C, 0xCF, + 0xCF, 0xCE, 0xCE, 0x57, 0x63, 0xCC, 0xCD, 0x57, +}; + +unsigned char linux_logo_bw[] __initdata = { + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x3F, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, + 0xFE, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFE, 0x3F, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFE, 0x7F, 0xFF, 0xC7, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xC3, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, + 0xFB, 0xE3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFD, 0xFF, 0xFF, 0xE1, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xF1, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xF1, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFF, + 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xF9, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xF9, 0xCF, 0xC3, 0xF8, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x87, 0x81, 0xF9, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xA7, + 0x99, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xF9, 0xF3, 0xBC, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xF9, 0xE3, 0xBC, 0xF9, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xB0, 0x3C, 0xF9, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xB0, + 0x19, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xF9, 0xC0, 0x03, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xF9, 0x80, 0x01, 0xF8, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x80, 0x01, 0xF8, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x80, + 0x01, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xF9, 0xC0, 0x21, 0xD8, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xF9, 0xB1, 0x80, 0xEC, 0xC0, 0x1F, + 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0x90, 0x00, 0xE4, + 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0x8C, + 0xC0, 0x7C, 0x04, 0x81, 0xFF, 0xFF, 0xFF, 0xFF, + 0xE3, 0x80, 0x00, 0x7C, 0x40, 0x11, 0xFF, 0xFF, + 0xFF, 0xFF, 0xE3, 0x80, 0x00, 0x7F, 0xD2, 0x29, + 0xFF, 0xFF, 0xFF, 0xFF, 0x87, 0x00, 0x00, 0x3F, + 0x80, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0x0E, 0x00, + 0x00, 0x3F, 0x80, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, + 0x1E, 0x00, 0x00, 0x1F, 0x80, 0x19, 0xFF, 0xFF, + 0xFF, 0xFE, 0x1C, 0x00, 0x00, 0x1E, 0x80, 0x19, + 0xFF, 0xFF, 0xFF, 0xFE, 0x3C, 0x00, 0x00, 0x1E, + 0x80, 0x11, 0xFF, 0xFF, 0xFF, 0xFC, 0x7C, 0x00, + 0x00, 0x0F, 0x80, 0x11, 0xFF, 0xFF, 0xFF, 0xFC, + 0xF8, 0x00, 0x00, 0x0E, 0x80, 0x11, 0xFF, 0xFF, + 0xFF, 0xFC, 0xF8, 0x00, 0x00, 0x06, 0x00, 0x11, + 0xFF, 0xFF, 0xFF, 0xF8, 0xF8, 0x00, 0x00, 0x06, + 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xF9, 0xF0, 0x00, + 0x00, 0x02, 0x00, 0x09, 0xFF, 0xFF, 0xFF, 0xF1, + 0xF0, 0x00, 0x00, 0x02, 0x80, 0x10, 0xFF, 0xFF, + 0xFF, 0xF1, 0xE0, 0x00, 0x00, 0x00, 0x97, 0x10, + 0xFF, 0xFF, 0xFF, 0xE3, 0xE0, 0x00, 0x00, 0x00, + 0xDF, 0xF0, 0xFF, 0xFF, 0xFF, 0xE3, 0xC0, 0x00, + 0x00, 0x00, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0xC7, + 0xC0, 0x00, 0x00, 0x01, 0xFF, 0xF8, 0xFF, 0xFF, + 0xFF, 0xC7, 0x80, 0x00, 0x00, 0x01, 0xFF, 0xF8, + 0xFF, 0xFF, 0xFF, 0x8F, 0x80, 0x00, 0x00, 0x01, + 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0x8F, 0x80, 0x00, + 0x00, 0x01, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0x9F, + 0x80, 0x00, 0x00, 0x01, 0xFF, 0xF8, 0xFF, 0xFF, + 0xFF, 0x9F, 0x80, 0x00, 0x00, 0x01, 0x80, 0x18, + 0xFF, 0xFF, 0xFF, 0x9E, 0x80, 0x00, 0x00, 0x03, + 0xA8, 0x11, 0xFF, 0xFF, 0xFF, 0x9F, 0x80, 0x00, + 0x00, 0x02, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0x99, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x09, 0xFF, 0xFF, + 0xFF, 0x00, 0x80, 0x00, 0x00, 0x01, 0xC0, 0x01, + 0xFF, 0xFF, 0xFE, 0x20, 0x60, 0x00, 0x00, 0x00, + 0xFF, 0xC3, 0xFF, 0xFF, 0xF8, 0x00, 0x30, 0x00, + 0x00, 0x00, 0xFF, 0x0F, 0xFF, 0xFF, 0xC0, 0x40, + 0x38, 0x00, 0x00, 0x00, 0xFE, 0x47, 0xFF, 0xFF, + 0x81, 0x00, 0x1C, 0x00, 0x00, 0x00, 0xFC, 0x23, + 0xFF, 0xFF, 0x90, 0x00, 0x1E, 0x00, 0x00, 0x00, + 0x78, 0x11, 0xFF, 0xFF, 0x80, 0x00, 0x0F, 0x80, + 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0x80, 0x00, + 0x07, 0xC0, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, + 0xC0, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x00, 0x04, + 0x7F, 0xFF, 0x80, 0x00, 0x03, 0xC0, 0x00, 0x10, + 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x01, 0x80, + 0x00, 0x30, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x70, 0x00, 0x01, 0x4F, 0xFF, + 0x80, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, + 0x0F, 0xFF, 0xC0, 0x00, 0x00, 0x80, 0x03, 0xF0, + 0x00, 0x00, 0x8F, 0xFF, 0x80, 0x00, 0x00, 0x40, + 0x0F, 0xF0, 0x00, 0x04, 0x1F, 0xFF, 0x80, 0x00, + 0x00, 0x7F, 0xFF, 0xF0, 0x00, 0x10, 0x1F, 0xFF, + 0xC0, 0x00, 0x00, 0x7F, 0xFF, 0xF0, 0x00, 0x40, + 0xFF, 0xFF, 0x98, 0x00, 0x00, 0xFF, 0xFF, 0xF0, + 0x00, 0x83, 0xFF, 0xFF, 0x81, 0xE0, 0x01, 0xFF, + 0xFF, 0xF8, 0x02, 0x07, 0xFF, 0xFF, 0x80, 0x3F, + 0x07, 0xE0, 0x00, 0x1C, 0x0C, 0x1F, 0xFF, 0xFF, + 0xF8, 0x03, 0xFF, 0x80, 0x00, 0x1F, 0x78, 0x1F, + 0xFF, 0xFF, 0xFF, 0x80, 0x7F, 0x00, 0x07, 0x0F, + 0xF0, 0x7F, 0xFF, 0xFF, 0xFF, 0xFE, 0x0C, 0x07, + 0xFF, 0x83, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x00, 0x1F, 0xFF, 0xC0, 0x03, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x07, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +}; + +#endif + +#ifdef INCLUDE_LINUX_LOGO16 + +unsigned char linux_logo16_red[] __initdata = { + 0x00, 0x90, 0xb0, 0x9c, 0xf7, 0x35, 0x83, 0xa5, + 0x65, 0x8f, 0x98, 0xc9, 0xdb, 0xe1, 0xe7, 0xf8 +}; + +unsigned char linux_logo16_green[] __initdata = { + 0x00, 0x90, 0xb0, 0x9c, 0xf7, 0x2e, 0x83, 0xa5, + 0x65, 0x6e, 0x98, 0x89, 0xbf, 0xac, 0xda, 0xf8 +}; + +unsigned char linux_logo16_blue[] __initdata = { + 0x00, 0x90, 0xaf, 0x9c, 0xf7, 0x2b, 0x82, 0xa5, + 0x65, 0x41, 0x97, 0x1e, 0x60, 0x29, 0xa5, 0xf8 +}; + +unsigned char linux_logo16[] __initdata = { + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa1, 0x11, 0x11, + 0x61, 0x16, 0x66, 0x66, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x1a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0x33, 0xa8, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x87, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x73, 0x33, 0x33, 0x3a, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xa3, 0x33, 0x33, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x27, 0x77, 0x77, 0x77, 0x33, 0x3a, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xa3, 0x33, 0x33, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x55, 0x50, 0x08, 0x33, 0x77, 0x77, + 0x77, 0x72, 0x72, 0x27, 0x77, 0x77, 0x33, 0x33, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xa3, 0x33, 0x33, 0x77, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x58, 0x85, 0x00, 0x11, 0x11, 0xaa, + 0xa3, 0x37, 0x77, 0x72, 0x22, 0x22, 0x77, 0x73, + 0x33, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa3, + 0x33, 0x37, 0x77, 0x33, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x56, 0x85, 0x00, 0x06, 0x66, 0x11, + 0x11, 0x1a, 0xa3, 0x37, 0x77, 0x72, 0x22, 0x77, + 0x73, 0x33, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x33, + 0x33, 0x33, 0x33, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x55, 0x00, 0x00, 0x06, 0x66, 0x66, + 0x66, 0x66, 0x11, 0x1a, 0xa3, 0x77, 0x72, 0x22, + 0x77, 0x73, 0x3a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x33, 0x33, + 0x33, 0x33, 0x33, 0xa0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x11, + 0x66, 0x66, 0x66, 0x66, 0x11, 0xa3, 0x77, 0x22, + 0x22, 0x77, 0x33, 0x33, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x33, 0x33, 0x33, + 0x33, 0x3a, 0xa1, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x33, + 0xaa, 0x11, 0x16, 0x66, 0x66, 0x61, 0x1a, 0x37, + 0x22, 0x22, 0x77, 0x33, 0x3a, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xa3, 0x33, 0x33, 0x33, + 0x3a, 0xa1, 0x11, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x02, 0x22, + 0x22, 0x77, 0x3a, 0x11, 0x66, 0x66, 0x66, 0x1a, + 0x37, 0x22, 0x22, 0x77, 0x33, 0x3a, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0x33, 0x33, 0x33, 0x3a, + 0xa1, 0x11, 0x11, 0x10, 0x00, 0x00, 0x50, 0x00, + 0x00, 0x05, 0x80, 0x50, 0x00, 0x00, 0x07, 0x72, + 0x22, 0x22, 0x22, 0x73, 0xa1, 0x66, 0x66, 0x61, + 0x1a, 0x77, 0x22, 0x27, 0x73, 0x33, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0x33, 0x33, 0x3a, 0xaa, + 0x11, 0x11, 0x1a, 0xa0, 0x08, 0x71, 0x05, 0x00, + 0x00, 0x12, 0x22, 0x50, 0x00, 0x00, 0x07, 0x77, + 0x77, 0x72, 0x22, 0x22, 0x27, 0x31, 0x16, 0x66, + 0x61, 0x13, 0x77, 0x22, 0x77, 0x33, 0x3a, 0xaa, + 0xaa, 0xaa, 0xaa, 0xa3, 0x33, 0x33, 0xaa, 0xa1, + 0x11, 0x1a, 0x33, 0x70, 0x07, 0x2e, 0x70, 0x00, + 0x01, 0x44, 0x42, 0x60, 0x00, 0x00, 0x02, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x27, 0x31, 0x66, + 0x66, 0x61, 0xa3, 0x72, 0x22, 0x77, 0x33, 0xaa, + 0xaa, 0xaa, 0xa3, 0x33, 0x33, 0xaa, 0xaa, 0x11, + 0x1a, 0x33, 0x77, 0x30, 0x04, 0x82, 0x40, 0x00, + 0x54, 0x48, 0x54, 0x40, 0x00, 0x00, 0x01, 0xaa, + 0x32, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x31, + 0x66, 0x66, 0x11, 0x37, 0x22, 0x27, 0x73, 0x3a, + 0xaa, 0xaa, 0xa3, 0x33, 0x3a, 0xaa, 0xaa, 0xaa, + 0xa3, 0x77, 0xaa, 0x10, 0x50, 0x08, 0x46, 0x05, + 0x54, 0x80, 0x50, 0x42, 0x00, 0x00, 0x08, 0x66, + 0x66, 0x1a, 0x32, 0x22, 0x22, 0x22, 0x22, 0x27, + 0x31, 0x66, 0x66, 0x13, 0x72, 0x22, 0x77, 0x33, + 0xaa, 0xaa, 0xaa, 0x33, 0xaa, 0xa1, 0xaa, 0xa3, + 0x37, 0xa1, 0x1a, 0x30, 0x50, 0x06, 0x26, 0x00, + 0x54, 0x00, 0x00, 0x44, 0x00, 0x00, 0x08, 0xe2, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0x22, 0x22, + 0x27, 0xa6, 0x66, 0x61, 0xa7, 0x72, 0x27, 0x73, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x33, + 0x31, 0x11, 0x37, 0x70, 0x02, 0x00, 0xab, 0xbb, + 0xb6, 0x00, 0x00, 0xf4, 0x00, 0x00, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0x22, + 0x22, 0x23, 0x16, 0x66, 0x1a, 0x37, 0x22, 0x77, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa3, 0x3a, + 0x11, 0xa7, 0x33, 0x10, 0x04, 0x09, 0xbd, 0xdd, + 0xbd, 0xd0, 0x04, 0x45, 0x00, 0x0e, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0x22, + 0x22, 0x22, 0x71, 0x66, 0x66, 0x13, 0x72, 0x27, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x33, 0x11, + 0xa3, 0x73, 0xa1, 0x60, 0x08, 0xbd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdb, 0x90, 0x00, 0x02, 0xec, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xce, 0x22, + 0x22, 0x22, 0x27, 0xa6, 0x66, 0x61, 0x37, 0x27, + 0x1a, 0xaa, 0xaa, 0xaa, 0xaa, 0xa3, 0xa1, 0x1a, + 0x33, 0xa1, 0x16, 0x60, 0x0b, 0xbd, 0xdd, 0xdd, + 0xcd, 0xdd, 0xdd, 0xd9, 0x00, 0x00, 0xec, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xce, 0xa2, + 0x22, 0x22, 0x22, 0x7a, 0x66, 0x66, 0x13, 0x77, + 0x1a, 0xaa, 0xaa, 0xaa, 0xaa, 0x3a, 0x11, 0x33, + 0xaa, 0x11, 0x66, 0x60, 0x9b, 0xdd, 0xdd, 0xdd, + 0xcd, 0xdd, 0xdb, 0xb9, 0x00, 0x00, 0xec, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xee, 0x61, + 0x72, 0x22, 0x22, 0x22, 0xa1, 0x66, 0x61, 0x37, + 0x1a, 0xaa, 0xaa, 0xaa, 0xa3, 0xa1, 0x13, 0x3a, + 0x11, 0x11, 0x11, 0x10, 0x5b, 0xdd, 0xdd, 0xdc, + 0xdd, 0xdd, 0xbd, 0xd9, 0x00, 0x00, 0xec, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xee, 0x86, + 0x17, 0x22, 0x22, 0x22, 0x23, 0x16, 0x66, 0xaa, + 0xaa, 0xa3, 0x3a, 0xaa, 0xaa, 0x1a, 0x3a, 0xa1, + 0x11, 0x11, 0x1a, 0x70, 0x05, 0xbd, 0xdd, 0xdd, + 0xdb, 0x5b, 0xdd, 0xb0, 0x00, 0x60, 0x2e, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xe6, 0x88, + 0x66, 0x32, 0x22, 0x22, 0x22, 0x36, 0x66, 0x11, + 0x33, 0x33, 0x3a, 0xaa, 0x11, 0xaa, 0xaa, 0xa1, + 0x11, 0x1a, 0x3a, 0x60, 0x02, 0x99, 0xbb, 0xb9, + 0x9b, 0xbb, 0xbc, 0x22, 0x00, 0x86, 0x5e, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xe1, 0x68, + 0x86, 0x63, 0x22, 0x22, 0x22, 0x2a, 0x66, 0x66, + 0x33, 0x33, 0xaa, 0xaa, 0x1a, 0xaa, 0xaa, 0x11, + 0x1a, 0xa7, 0x68, 0x80, 0x02, 0x2b, 0xbd, 0xbb, + 0xbb, 0xb9, 0x22, 0x22, 0x00, 0x06, 0x6e, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xc7, 0xa6, + 0x88, 0x86, 0x32, 0x22, 0x22, 0x27, 0xa6, 0x66, + 0x33, 0x3a, 0xaa, 0xa1, 0xaa, 0xaa, 0xa1, 0x11, + 0xa3, 0xa6, 0x88, 0x80, 0x02, 0x22, 0x9b, 0xbb, + 0xbb, 0x22, 0x24, 0xf4, 0x60, 0x00, 0x0c, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xc2, 0x21, + 0x68, 0x88, 0x63, 0x22, 0x22, 0x22, 0x71, 0x66, + 0x33, 0x3a, 0x11, 0x11, 0xaa, 0xaa, 0x11, 0xaa, + 0x71, 0x88, 0x88, 0x00, 0x02, 0xe2, 0x26, 0x99, + 0x22, 0x22, 0x4f, 0xf4, 0x40, 0x00, 0x0c, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x22, 0x22, + 0x16, 0x88, 0x86, 0xa2, 0x22, 0x22, 0x27, 0x11, + 0x33, 0xa1, 0x11, 0x11, 0xaa, 0x31, 0x1a, 0xa3, + 0x68, 0x88, 0x81, 0x00, 0x54, 0x42, 0x22, 0x22, + 0x22, 0x44, 0xff, 0xff, 0x48, 0x00, 0x00, 0x99, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x99, 0x22, 0x22, + 0x21, 0x88, 0x88, 0x6a, 0x22, 0x22, 0x22, 0x31, + 0x3a, 0xa1, 0x11, 0x1a, 0xa3, 0x11, 0x33, 0x36, + 0x88, 0x86, 0x30, 0x00, 0x4f, 0x44, 0x22, 0x22, + 0x24, 0xff, 0xff, 0xff, 0x44, 0x00, 0x00, 0x99, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x95, 0x22, 0x72, + 0x22, 0x18, 0x88, 0x86, 0x32, 0x22, 0x22, 0x27, + 0xaa, 0x11, 0x11, 0x1a, 0x31, 0x13, 0x33, 0x68, + 0x88, 0x6a, 0x00, 0x02, 0x4f, 0x4f, 0x42, 0x24, + 0x4f, 0xff, 0xff, 0xff, 0xf4, 0x50, 0x00, 0x99, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x99, 0x22, 0x73, + 0x72, 0x26, 0x88, 0x88, 0x63, 0x22, 0x22, 0x22, + 0x11, 0x11, 0x11, 0xa3, 0xa1, 0x73, 0xa6, 0x88, + 0x81, 0xa5, 0x00, 0x04, 0x4f, 0x4f, 0x44, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x40, 0x00, 0x99, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x99, 0x12, 0x27, + 0xaa, 0x22, 0x68, 0x55, 0x86, 0x72, 0x22, 0x22, + 0x11, 0x11, 0x1a, 0x33, 0x13, 0x3a, 0x18, 0x88, + 0x1a, 0x10, 0x00, 0x44, 0x4f, 0x4f, 0xff, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x99, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x99, 0x61, 0x22, + 0x3a, 0xa2, 0x26, 0x85, 0x58, 0x67, 0x22, 0x22, + 0x61, 0x61, 0x1a, 0x7a, 0x37, 0x31, 0x88, 0x81, + 0x11, 0x00, 0x05, 0xe4, 0x44, 0xff, 0xff, 0xff, + 0x4f, 0xf4, 0x44, 0xff, 0xff, 0xf5, 0x00, 0x99, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x99, 0x88, 0x12, + 0x2a, 0xaa, 0x72, 0x68, 0x55, 0x81, 0x22, 0x22, + 0x66, 0x61, 0xa3, 0x33, 0x73, 0x16, 0x88, 0x11, + 0x10, 0x00, 0x08, 0x74, 0x44, 0x4f, 0x44, 0x44, + 0xf4, 0xf4, 0x44, 0x44, 0xe2, 0x44, 0x00, 0x99, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x99, 0x88, 0x81, + 0x22, 0xaa, 0xa7, 0x26, 0x85, 0x88, 0x12, 0x22, + 0x66, 0x61, 0x37, 0xa7, 0x3a, 0x66, 0x66, 0x11, + 0x80, 0x00, 0x0a, 0x72, 0x44, 0x4f, 0x44, 0x4f, + 0xff, 0x44, 0x44, 0x22, 0x22, 0x24, 0x00, 0x99, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x99, 0x85, 0x88, + 0x12, 0x2a, 0xaa, 0x22, 0x68, 0x58, 0x63, 0x22, + 0x66, 0x1a, 0x73, 0x77, 0x31, 0x66, 0x61, 0x11, + 0x00, 0x00, 0x07, 0x44, 0xff, 0x4f, 0xf4, 0x4f, + 0xff, 0x4f, 0x44, 0xf4, 0x42, 0x22, 0x40, 0x9b, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb9, 0x85, 0x55, + 0x81, 0x27, 0xaa, 0xa2, 0x78, 0x88, 0x86, 0x72, + 0x66, 0x13, 0x77, 0x73, 0x11, 0x66, 0x61, 0x76, + 0x00, 0x50, 0x84, 0xf4, 0xff, 0x4f, 0xf4, 0xff, + 0xff, 0x4f, 0x44, 0xff, 0x4f, 0x42, 0x40, 0x9b, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb9, 0x68, 0x55, + 0x58, 0x12, 0x3a, 0xaa, 0x23, 0x88, 0x88, 0xa7, + 0x66, 0xa7, 0x77, 0x7a, 0x16, 0x66, 0x1a, 0x15, + 0x05, 0x00, 0x4f, 0xf4, 0xff, 0x4f, 0xf4, 0xff, + 0xff, 0x4f, 0x44, 0xff, 0x4f, 0x44, 0x24, 0x9b, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb9, 0x26, 0x55, + 0x55, 0x81, 0x23, 0xaa, 0x32, 0x18, 0x88, 0x6a, + 0x61, 0x37, 0x77, 0x31, 0x66, 0x66, 0x17, 0x60, + 0x05, 0x08, 0x4f, 0xf4, 0xff, 0x4f, 0xf4, 0xff, + 0xff, 0x4f, 0x44, 0xff, 0x4f, 0x4f, 0x4e, 0x99, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x99, 0xa2, 0x65, + 0x55, 0x58, 0xa2, 0x7a, 0xa2, 0x26, 0x88, 0x61, + 0x61, 0x32, 0x27, 0xa1, 0x66, 0x61, 0x31, 0x60, + 0x00, 0x04, 0x4f, 0xf4, 0xff, 0x44, 0x44, 0xff, + 0xff, 0x4f, 0x44, 0xff, 0x4f, 0x44, 0xf4, 0x99, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x9b, 0xaa, 0x26, + 0x55, 0x55, 0x87, 0x27, 0x33, 0x27, 0x68, 0x61, + 0x1a, 0x72, 0x27, 0xa6, 0x66, 0x6a, 0x71, 0x00, + 0x80, 0x84, 0xff, 0xf4, 0xff, 0x44, 0x44, 0xff, + 0xff, 0x4f, 0x44, 0xff, 0x4f, 0x44, 0xf4, 0x99, + 0x9b, 0x9b, 0x99, 0xb9, 0xb9, 0x99, 0xaa, 0xa2, + 0x85, 0x55, 0x56, 0x22, 0x27, 0x22, 0x36, 0x66, + 0x13, 0x22, 0x23, 0x16, 0x86, 0x63, 0x73, 0x00, + 0x00, 0x44, 0xf4, 0xf4, 0xff, 0x44, 0x44, 0xff, + 0xff, 0x4f, 0x44, 0xff, 0x4f, 0x4f, 0x4f, 0x99, + 0x9b, 0x99, 0x99, 0x99, 0xb9, 0x99, 0xaa, 0xaa, + 0x28, 0x55, 0x58, 0x12, 0x22, 0x22, 0x21, 0x11, + 0xa3, 0x27, 0x7a, 0x66, 0x86, 0x17, 0x75, 0x05, + 0x05, 0xff, 0xf4, 0xf4, 0xff, 0x44, 0x44, 0xff, + 0xff, 0x4f, 0x44, 0x4f, 0x4f, 0x44, 0x4f, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x3a, 0xaa, + 0xa2, 0x85, 0x58, 0x67, 0x72, 0x22, 0x27, 0xa1, + 0x37, 0x27, 0x7a, 0x68, 0x86, 0xa2, 0x70, 0x00, + 0x02, 0xff, 0xf4, 0xf4, 0xff, 0x44, 0x44, 0x4f, + 0xff, 0x4f, 0x44, 0xf4, 0xf4, 0xf4, 0xf4, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x23, 0xaa, + 0xa7, 0x78, 0x88, 0x81, 0x77, 0x22, 0x27, 0x3a, + 0x72, 0x73, 0x71, 0x68, 0x66, 0x32, 0x50, 0x00, + 0x04, 0x4f, 0xf4, 0xf4, 0xff, 0x44, 0x44, 0x4f, + 0xff, 0x4f, 0x44, 0xf4, 0xf4, 0xf4, 0x44, 0x95, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x55, 0x12, 0x3a, + 0xaa, 0x21, 0x88, 0x81, 0x77, 0x27, 0x73, 0x73, + 0x72, 0x33, 0x36, 0x86, 0x61, 0x72, 0x00, 0x00, + 0x04, 0x44, 0xf4, 0xf4, 0xf4, 0x44, 0x44, 0x4f, + 0xff, 0x4f, 0x44, 0xff, 0x4f, 0x4f, 0x44, 0x55, + 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x8a, 0x27, + 0xaa, 0x77, 0x68, 0x61, 0x23, 0x71, 0x11, 0x3a, + 0x27, 0xa3, 0x36, 0x86, 0x61, 0x20, 0x00, 0x00, + 0x04, 0xf4, 0xf4, 0xf4, 0xf4, 0x44, 0x44, 0x4f, + 0xff, 0x4f, 0x44, 0xff, 0x4f, 0x4f, 0x41, 0x59, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x95, 0x58, 0x77, + 0x27, 0x32, 0x36, 0x63, 0x23, 0x71, 0x66, 0x11, + 0x27, 0x13, 0xa6, 0x86, 0x6a, 0x20, 0x00, 0x50, + 0x04, 0x4f, 0x4f, 0x4f, 0x4f, 0x44, 0x44, 0x4f, + 0xff, 0x4f, 0x44, 0xff, 0x4f, 0x4f, 0x41, 0x99, + 0x9b, 0xbb, 0xbb, 0xbb, 0xb9, 0x99, 0x68, 0x13, + 0x32, 0x22, 0x73, 0xa7, 0x2a, 0x31, 0x88, 0x66, + 0x7a, 0x13, 0x18, 0x66, 0x63, 0x20, 0x00, 0x06, + 0x0f, 0x4f, 0x4f, 0x4f, 0x4f, 0x44, 0x44, 0x4f, + 0xff, 0x4f, 0x44, 0xff, 0x4f, 0x4f, 0x49, 0x95, + 0xa9, 0xa9, 0x99, 0x97, 0x92, 0x99, 0x65, 0x6a, + 0x17, 0x22, 0x23, 0x72, 0x27, 0xaa, 0x88, 0x88, + 0xa1, 0x17, 0x68, 0x66, 0x67, 0x70, 0x00, 0x05, + 0x0f, 0x4f, 0x4f, 0x4f, 0x4f, 0x44, 0x44, 0x4f, + 0xff, 0x4f, 0x44, 0xff, 0xf4, 0xf4, 0x49, 0x9c, + 0x2e, 0xee, 0xee, 0xee, 0xee, 0xa9, 0x65, 0x8a, + 0x1a, 0xaa, 0x37, 0x72, 0x27, 0x37, 0x88, 0x88, + 0x11, 0x17, 0x68, 0x66, 0x67, 0x10, 0x9d, 0xd0, + 0x84, 0x44, 0xff, 0x4f, 0x4f, 0x44, 0xf4, 0x4f, + 0xff, 0x4f, 0x44, 0xff, 0xf4, 0xf4, 0x4f, 0x69, + 0xcc, 0xee, 0xee, 0xee, 0xec, 0x99, 0x88, 0x63, + 0x61, 0x68, 0x61, 0x72, 0x22, 0x7a, 0x68, 0x88, + 0x11, 0x17, 0x88, 0x66, 0x12, 0x1b, 0xdd, 0xdd, + 0x02, 0x44, 0x4f, 0x4f, 0x4f, 0x44, 0x44, 0x4f, + 0xff, 0x4f, 0x44, 0xff, 0xff, 0x4f, 0x4c, 0xc5, + 0x0c, 0xc1, 0x11, 0x1c, 0xc0, 0x26, 0x66, 0x17, + 0x66, 0x88, 0x88, 0x12, 0x22, 0x23, 0xa8, 0x88, + 0x11, 0x13, 0x88, 0x66, 0x17, 0xbb, 0xdd, 0xdd, + 0xd0, 0x8f, 0xff, 0xf4, 0xf4, 0x44, 0xf4, 0x4f, + 0xff, 0x4f, 0x44, 0xf4, 0x4f, 0x44, 0xdd, 0xdd, + 0x00, 0x00, 0x00, 0x05, 0x9d, 0x21, 0x66, 0x27, + 0xa6, 0x65, 0x58, 0x67, 0x22, 0x27, 0x28, 0x88, + 0x11, 0xaa, 0x86, 0x68, 0x1a, 0xbb, 0xdd, 0xdd, + 0xdb, 0x05, 0xf4, 0xf4, 0xf4, 0xf4, 0x44, 0x4f, + 0xff, 0x4f, 0x44, 0xf4, 0xf4, 0xf4, 0xdd, 0xdb, + 0x00, 0x00, 0x00, 0x00, 0xdd, 0xda, 0x66, 0x22, + 0x71, 0x15, 0x55, 0x81, 0x22, 0x22, 0x76, 0x88, + 0x11, 0x31, 0x88, 0x88, 0xab, 0xbd, 0xdd, 0xdd, + 0xdd, 0x00, 0x04, 0x44, 0xff, 0xff, 0x4f, 0x4f, + 0xff, 0x4f, 0x44, 0xf4, 0xf4, 0x44, 0xdd, 0xdb, + 0x00, 0x00, 0x00, 0x0b, 0xdd, 0xda, 0x11, 0x22, + 0x23, 0x68, 0x55, 0x86, 0x22, 0x22, 0x7a, 0x88, + 0x1a, 0x71, 0x88, 0x89, 0xbb, 0xdd, 0xdd, 0xdd, + 0xdd, 0xd0, 0x00, 0x4f, 0x44, 0xff, 0x4f, 0x4f, + 0xff, 0x4f, 0x44, 0xf4, 0xff, 0xe2, 0xdd, 0xdb, + 0x90, 0x00, 0x05, 0xbd, 0xdd, 0xb8, 0x63, 0x22, + 0x27, 0xa6, 0x55, 0x88, 0x77, 0x22, 0x22, 0x88, + 0x1a, 0x28, 0xbd, 0xdb, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdb, 0x00, 0x07, 0x44, 0x4f, 0x4f, 0x4f, + 0xff, 0x4f, 0x44, 0x4f, 0x4f, 0x22, 0xdd, 0xdb, + 0xbb, 0x9b, 0xbb, 0xbd, 0xdd, 0xd5, 0x86, 0x22, + 0x22, 0x77, 0x85, 0x88, 0x17, 0x22, 0x22, 0x88, + 0xaa, 0x2b, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0x00, 0x00, 0x54, 0x4f, 0x4f, 0x4f, + 0xff, 0x4f, 0x44, 0xf4, 0x44, 0x22, 0xbd, 0xdd, + 0xbb, 0xbb, 0xbb, 0xdd, 0xdd, 0xdd, 0x88, 0x72, + 0x27, 0x22, 0x88, 0x88, 0x67, 0x72, 0x22, 0x18, + 0x33, 0x2d, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xd0, 0x00, 0x05, 0x4f, 0x4f, 0x4f, + 0xff, 0x4f, 0x44, 0x44, 0x4f, 0x22, 0xbd, 0xdd, + 0xdb, 0xbb, 0xdd, 0xdd, 0xdd, 0xdd, 0x88, 0x17, + 0x27, 0x72, 0x68, 0x88, 0x87, 0x32, 0x22, 0x36, + 0x37, 0x2d, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xd5, 0x00, 0x00, 0x4f, 0x4f, 0x4f, + 0xff, 0xf4, 0xf4, 0xf4, 0xf4, 0x22, 0xbb, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd8, 0x67, + 0x72, 0x77, 0x38, 0x88, 0x83, 0x37, 0x22, 0x26, + 0x72, 0x2b, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0x00, 0x00, 0x4f, 0x4f, 0x4f, + 0xff, 0xf4, 0xf4, 0xf4, 0x44, 0x25, 0xbb, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd3, + 0x32, 0x73, 0x76, 0x88, 0x81, 0x33, 0x22, 0x2a, + 0x22, 0x2b, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xb0, 0x54, 0x4f, 0x4f, 0x4f, + 0xff, 0xf4, 0xf4, 0xff, 0x44, 0x00, 0xbb, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xa7, 0x73, 0x26, 0x88, 0x86, 0x7a, 0x72, 0x27, + 0x22, 0x2b, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdb, 0x44, 0xff, 0x4f, 0x4f, + 0xff, 0xf4, 0xf4, 0x44, 0x40, 0x05, 0xbb, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0x13, 0x23, 0x21, 0x68, 0x86, 0x17, 0x72, 0x22, + 0x22, 0x2b, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdb, 0x44, 0x4f, 0x4f, 0x4f, + 0xff, 0xff, 0x44, 0x42, 0x00, 0x05, 0xbd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0x87, 0x27, 0x27, 0x16, 0x66, 0x67, 0x22, 0x22, + 0x72, 0x7b, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0x94, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x00, 0x00, 0x05, 0xbb, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xb8, + 0x86, 0x22, 0x22, 0x7a, 0x68, 0x81, 0x22, 0x22, + 0x37, 0x7b, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdb, 0xb5, 0x44, 0x44, 0x44, + 0x44, 0x47, 0x00, 0x00, 0x00, 0x05, 0xbd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd8, 0x68, + 0x58, 0x72, 0x22, 0x27, 0x18, 0x86, 0x72, 0x22, + 0x1a, 0xbb, 0xbd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdb, 0xb5, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xbb, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xb9, 0x18, 0x85, + 0x58, 0x12, 0x22, 0x36, 0x18, 0x88, 0x32, 0x22, + 0x61, 0x3b, 0xbb, 0xbb, 0xbd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdb, 0xb9, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xbb, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xb9, 0x7a, 0x68, 0x85, + 0x88, 0x62, 0x27, 0x16, 0x18, 0x88, 0x12, 0x27, + 0x86, 0x18, 0x9b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbd, + 0xdd, 0xdd, 0xdd, 0xbb, 0xb5, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xbb, 0xbd, + 0xdd, 0xdd, 0xdb, 0xbb, 0x87, 0x31, 0x68, 0x65, + 0x88, 0x82, 0x23, 0x16, 0x18, 0x88, 0x12, 0x23, + 0x88, 0x67, 0x27, 0xa8, 0x9b, 0xbb, 0xbb, 0xbb, + 0xbd, 0xdd, 0xbb, 0xbb, 0x95, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x9b, 0xbb, + 0xbb, 0xbb, 0xbb, 0x96, 0x87, 0x16, 0x68, 0x18, + 0x88, 0x62, 0x31, 0x66, 0x18, 0x88, 0x62, 0x73, + 0x88, 0x63, 0x27, 0x33, 0x65, 0x55, 0x99, 0x9b, + 0xbb, 0xbb, 0xbb, 0x99, 0x55, 0x0a, 0xa1, 0x86, + 0x81, 0x68, 0x88, 0x55, 0x58, 0x85, 0x9b, 0xbb, + 0xbb, 0xbb, 0x95, 0x88, 0x83, 0x66, 0x66, 0x18, + 0x66, 0x82, 0xa1, 0x66, 0x18, 0x88, 0x62, 0x33, + 0x88, 0x81, 0x27, 0x7a, 0x18, 0x58, 0x86, 0x85, + 0x99, 0x99, 0x99, 0x95, 0x53, 0x2a, 0xaa, 0x88, + 0x67, 0x31, 0x68, 0x55, 0x58, 0x85, 0x59, 0xbb, + 0xbb, 0xb9, 0x58, 0x68, 0x83, 0x66, 0x61, 0x16, + 0x66, 0x62, 0x16, 0x66, 0x68, 0x88, 0x62, 0xaa, + 0x88, 0x86, 0x27, 0x77, 0x78, 0x55, 0x88, 0x22, + 0x25, 0x55, 0x95, 0x55, 0x6a, 0xa2, 0x2a, 0x88, + 0x62, 0x27, 0x37, 0x38, 0x88, 0x87, 0x55, 0x59, + 0x95, 0x58, 0x16, 0x88, 0x8a, 0x66, 0x63, 0x68, + 0x86, 0x67, 0x66, 0x66, 0x68, 0x88, 0x12, 0x11, + 0x88, 0x88, 0x72, 0x77, 0x78, 0x85, 0x58, 0x17, + 0x23, 0x32, 0x55, 0x55, 0x81, 0x13, 0x73, 0x66, + 0x62, 0x7a, 0xaa, 0x38, 0x88, 0x58, 0x27, 0x55, + 0x58, 0x32, 0x38, 0x88, 0x81, 0x66, 0xa2, 0x88, + 0x86, 0x61, 0x66, 0x61, 0x66, 0x68, 0x13, 0x11, + 0x88, 0x88, 0x12, 0x22, 0x71, 0x85, 0x58, 0x62, + 0x23, 0xa2, 0x68, 0x88, 0x81, 0x66, 0x88, 0x88, + 0x63, 0x2a, 0xaa, 0x28, 0x88, 0x55, 0x86, 0x61, + 0x66, 0x66, 0x68, 0x88, 0x66, 0x66, 0x77, 0x88, + 0x68, 0x16, 0x66, 0x62, 0x66, 0x68, 0xa1, 0x61, + 0x88, 0x88, 0x62, 0x22, 0x22, 0x85, 0x55, 0x83, + 0x72, 0x37, 0xa8, 0x88, 0x61, 0x66, 0x85, 0x55, + 0x86, 0x23, 0xaa, 0x71, 0x88, 0x85, 0x88, 0x66, + 0x88, 0x86, 0x88, 0x88, 0x16, 0x61, 0x21, 0x88, + 0x66, 0xa6, 0x86, 0x17, 0x66, 0x66, 0x31, 0x61, + 0x88, 0x88, 0x87, 0x72, 0x22, 0x68, 0x55, 0x86, + 0x77, 0x77, 0x36, 0x88, 0x13, 0x68, 0x85, 0x55, + 0x58, 0x12, 0x73, 0x72, 0x76, 0x88, 0x88, 0x68, + 0x88, 0x88, 0x88, 0x66, 0x36, 0x63, 0x26, 0x86, + 0x86, 0x36, 0x86, 0x11, 0x66, 0x66, 0x76, 0x61, + 0x88, 0x88, 0x81, 0x22, 0x22, 0x38, 0x85, 0x58, + 0x37, 0x22, 0x21, 0x68, 0xa2, 0x31, 0x68, 0x55, + 0x55, 0x81, 0x22, 0x22, 0xa8, 0x88, 0x88, 0x68, + 0x86, 0x88, 0x68, 0x81, 0x36, 0x17, 0x21, 0x68, + 0x86, 0x16, 0x66, 0x26, 0x66, 0x61, 0x36, 0x66, + 0x68, 0x88, 0x86, 0x27, 0x22, 0x28, 0x88, 0x88, + 0x17, 0x72, 0x2a, 0x66, 0xa2, 0x22, 0x36, 0x55, + 0x55, 0x58, 0x37, 0x3a, 0x16, 0x66, 0x66, 0x66, + 0x66, 0x18, 0x88, 0x67, 0x16, 0x12, 0x71, 0x68, + 0x81, 0x68, 0x61, 0x76, 0x66, 0x6a, 0x16, 0x66, + 0x88, 0x88, 0x86, 0x77, 0x22, 0x26, 0x88, 0x88, + 0x13, 0x37, 0x71, 0x66, 0xa2, 0x33, 0x2a, 0x85, + 0x55, 0x55, 0x17, 0x73, 0x16, 0x66, 0x66, 0x68, + 0x63, 0x88, 0x88, 0xa2, 0x66, 0xa2, 0xa6, 0x88, + 0x61, 0x68, 0x6a, 0x76, 0x66, 0x6a, 0x66, 0x6a +}; + +#endif diff --git a/include/linux/msdos_fs_i.h b/include/linux/msdos_fs_i.h index 674999c58e72..1e677d5c7085 100644 --- a/include/linux/msdos_fs_i.h +++ b/include/linux/msdos_fs_i.h @@ -21,7 +21,7 @@ struct msdos_inode_info { I have not put it conditional. With the advent of loadable file system drivers, it would be very easy to compile - a MsDOS FS driver unaware of UMSDOS and then later to + a MS-DOS FS driver unaware of UMSDOS and then later to load a (then incompatible) UMSDOS FS driver. */ struct pipe_inode_info reserved; diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 64470ba580f6..8286b0974de2 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -251,7 +251,7 @@ struct device /* Protocol specific pointers */ - void *atalk_ptr; /* Appletalk link */ + void *atalk_ptr; /* AppleTalk link */ void *ip_ptr; /* IPv4 specific data */ void *dn_ptr; /* DECnet specific data */ diff --git a/include/linux/pci.h b/include/linux/pci.h index 8ce86417d973..601cf747c37f 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -764,6 +764,11 @@ #define PCI_DEVICE_ID_ALLIANCE_AT24 0x6424 #define PCI_DEVICE_ID_ALLIANCE_AT3D 0x643d +#define PCI_VENDOR_ID_SK 0x1148 +#define PCI_DEVICE_ID_SK_FP 0x4000 +#define PCI_DEVICE_ID_SK_TR 0x4200 +#define PCI_DEVICE_ID_SK_GE 0x4300 + #define PCI_VENDOR_ID_VMIC 0x114a #define PCI_DEVICE_ID_VMIC_VME 0x7587 diff --git a/include/linux/sched.h b/include/linux/sched.h index 0a3af99e3b03..e920ed3ee25e 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -351,7 +351,7 @@ struct task_struct { /* timeout */ 0,SCHED_OTHER,0,0,0,0,0,0,0, \ /* timer */ { NULL, NULL, 0, 0, it_real_fn }, \ /* utime */ {0,0,0,0},0, \ -/* per cpu times */ {0, }, {0, }, \ +/* per CPU times */ {0, }, {0, }, \ /* flt */ 0,0,0,0,0,0, \ /* swp */ 0,0,0,0,0, \ /* process credentials */ \ diff --git a/include/linux/sdla_x25.h b/include/linux/sdla_x25.h index 4c0f4372587f..58214a0891e1 100644 --- a/include/linux/sdla_x25.h +++ b/include/linux/sdla_x25.h @@ -18,7 +18,7 @@ /*---------------------------------------------------------------------------- * Notes: * ------ - * 1. All structures defined in this file are byte-alined. To ensure + * 1. All structures defined in this file are byte-aligned. To ensure * portability of this code between different platforms and compilers, one * of the following defines must be defined before including this file: * @@ -104,7 +104,7 @@ typedef struct X25Cmd #define X25_READ 0x22 /* read X.25 packet */ #define X25_WRITE 0x23 /* send X.25 packet */ #define X25_PLACE_CALL 0x30 /* place a call on SVC */ -#define X25_ACCEPT_CALL 0x31 /* accept incomming call */ +#define X25_ACCEPT_CALL 0x31 /* accept incoming call */ #define X25_CLEAR_CALL 0x32 /* clear call */ #define X25_CLEAR_CONFRM 0x33 /* send clear confirmation packet */ #define X25_RESET 0x34 /* send reset request packet */ @@ -116,14 +116,14 @@ typedef struct X25Cmd #define X25_REGISTRATION_RQST 0x3A /* send registration request packet */ #define X25_REGISTRATION_CONFRM 0x3B /* send registration confirmation */ #define X25_IS_DATA_AVAILABLE 0x40 /* querry receive queue */ -#define X25_INCOMMING_CALL_CTL 0x41 /* select incomming call options */ +#define X25_INCOMING_CALL_CTL 0x41 /* select incoming call options */ #define X25_CONFIGURE_PVC 0x42 /* configure PVC */ #define X25_GET_ACTIVE_CHANNELS 0x43 /* get a list of active circuits */ #define X25_READ_CHANNEL_CONFIG 0x44 /* read virt. circuit configuration */ #define X25_FLUSH_DATA_BUFFERS 0x45 /* flush X.25-level data buffers */ #define X25_READ_HISTORY_TABLE 0x46 /* read asynchronous event log */ #define X25_HISTORY_TABLE_CTL 0x47 /* control asynchronous event log */ -#define X25_GET_TX_D_BIT_STATUS 0x48 /* is packet with D-bit acknowleged */ +#define X25_GET_TX_D_BIT_STATUS 0x48 /* is packet with D-bit acknowledged */ #define X25_READ_STATISTICS 0x49 /* read X.25-level statistics */ #define X25_FLUSH_STATISTICS 0x4A /* flush X.25-level statistics */ #define X25_READ_CONFIGURATION 0x50 /* read HDLC & X.25 configuration */ @@ -139,7 +139,7 @@ typedef struct X25Cmd #define X25RES_LINK_CLOSED 0x03 #define X25RES_INVAL_LENGTH 0x04 #define X25RES_INVAL_CMD 0x05 -#define X25RES_UNNUMBERED_FRAME 0x06 /* unnunbered frame received */ +#define X25RES_UNNUMBERED_FRAME 0x06 /* unnumbered frame received */ #define X25RES_FRM_REJECT_MODE 0x07 /* link is in Frame Reject mode */ #define X25RES_MODEM_FAILURE 0x08 /* DCD and/or CTS dropped */ #define X25RES_N2_RETRY_LIMIT 0x09 /* N2 retry limit has been exceeded */ @@ -153,10 +153,10 @@ typedef struct X25Cmd #define X25RES_INVAL_FORMAT 0x37 /* invalid packet format */ #define X25RES_D_BIT_NOT_SUPPRT 0x38 /* D-bit pragmatics not supported */ #define X25RES_FACIL_NOT_SUPPRT 0x39 /* Call facility not supported */ -#define X25RES_INVAL_CALL_ARG 0x3A /* errorneous call arguments */ -#define X25RES_INVAL_CALL_DATA 0x3B /* errorneous call user data */ +#define X25RES_INVAL_CALL_ARG 0x3A /* erroneous call arguments */ +#define X25RES_INVAL_CALL_DATA 0x3B /* erroneous call user data */ #define X25RES_ASYNC_PACKET 0x40 /* asynchronous packet received */ -#define X25RES_PROTO_VIOLATION 0x41 /* protocol violation occured */ +#define X25RES_PROTO_VIOLATION 0x41 /* protocol violation occurred */ #define X25RES_PKT_TIMEOUT 0x42 /* X.25 packet time out */ #define X25RES_PKT_RETRY_LIMIT 0x43 /* X.25 packet retry limit exceeded */ /*----- Command-dependent results -----*/ @@ -167,7 +167,7 @@ typedef struct X25Cmd #define X25RES_LINK_IS_OPEN 0x01 /* HDLC_LINK_OPEN */ #define X25RES_LINK_IS_DISC 0x02 /* HDLC_LINK_DISC */ #define X25RES_LINK_IS_CLOSED 0x03 /* HDLC_LINK_CLOSE */ -#define X25RES_INVAL_PARAM 0x31 /* INCOMMING_CALL_CTL */ +#define X25RES_INVAL_PARAM 0x31 /* INCOMING_CALL_CTL */ #define X25RES_INVAL_CONFIG 0x35 /* REGISTR_RQST/CONFRM */ /* @@ -239,7 +239,7 @@ typedef struct X25TimeStamp typedef struct X25Status { unsigned short pvc_map PACKED; /* 00h: PVC map */ - unsigned short icc_map PACKED; /* 02h: Incomming Chan. map */ + unsigned short icc_map PACKED; /* 02h: Incoming Chan. map */ unsigned short twc_map PACKED; /* 04h: Two-way Cnan. map */ unsigned short ogc_map PACKED; /* 06h: Outgoing Chan. map */ TX25TimeStamp tstamp PACKED; /* 08h: timestamp (BCD) */ @@ -256,7 +256,7 @@ typedef struct X25Status #define X25_RX_INTR 0x01 /* receive interrupt */ #define X25_TX_INTR 0x02 /* transmit interrupt */ #define X25_MODEM_INTR 0x04 /* modem status interrupt (CTS/DCD) */ -#define X25_EVENT_INTR 0x10 /* asyncronous event encountered */ +#define X25_EVENT_INTR 0x10 /* asynchronous event encountered */ #define X25_CMD_INTR 0x08 /* interface command complete */ /* @@ -390,8 +390,8 @@ typedef struct X25Config unsigned short pktMTU PACKED; /* 0Fh: */ unsigned short loPVC PACKED; /* 11h: */ unsigned short hiPVC PACKED; /* 13h: */ - unsigned short loIncommingSVC PACKED; /* 15h: */ - unsigned short hiIncommingSVC PACKED; /* 17h: */ + unsigned short loIncomingSVC PACKED; /* 15h: */ + unsigned short hiIncomingSVC PACKED; /* 17h: */ unsigned short loTwoWaySVC PACKED; /* 19h: */ unsigned short hiTwoWaySVC PACKED; /* 1Bh: */ unsigned short loOutgoingSVC PACKED; /* 1Dh: */ @@ -421,8 +421,8 @@ typedef struct X25ChanAlloc /*----- Channel allocation -*/ { unsigned short loPVC PACKED; /* 00h: lowest PVC number */ unsigned short hiPVC PACKED; /* 02h: highest PVC number */ - unsigned short loIncommingSVC PACKED; /* 04h: lowest incoming SVC */ - unsigned short hiIncommingSVC PACKED; /* 06h: highest incoming SVC */ + unsigned short loIncomingSVC PACKED; /* 04h: lowest incoming SVC */ + unsigned short hiIncomingSVC PACKED; /* 06h: highest incoming SVC */ unsigned short loTwoWaySVC PACKED; /* 08h: lowest two-way SVC */ unsigned short hiTwoWaySVC PACKED; /* 0Ah: highest two-way SVC */ unsigned short loOutgoingSVC PACKED; /* 0Ch: lowest outgoing SVC */ @@ -499,7 +499,7 @@ typedef struct X25EventLog /* * Defines for the 'type' field. */ -#define X25LOG_INCOMMING 0x00 +#define X25LOG_INCOMING 0x00 #define X25LOG_APPLICATION 0x01 #define X25LOG_AUTOMATIC 0x02 #define X25LOG_ERROR 0x04 @@ -568,7 +568,7 @@ typedef struct X25Trace /*----- Trace data structure -------*/ #define X25_TRCERR_RX_BADCRC 0x20 /* receive CRC error */ #define X25_TRCERR_RX_OVERRUN 0x30 /* receiver overrun error */ #define X25_TRCERR_RX_TOO_LONG 0x40 /* excessive frame length error */ -#define X25_TRCERR_TX_ABORT 0x70 /* aborted frame transmittion error */ +#define X25_TRCERR_TX_ABORT 0x70 /* aborted frame transmission error */ #define X25_TRCERR_TX_UNDERRUN 0x80 /* transmit underrun error */ /***************************************************************************** @@ -582,7 +582,7 @@ typedef struct HDLCFrame /*----- DHLC Frame Format ----------*/ unsigned char data[0] PACKED; } THDLCFrame; -typedef struct X25Pkt /*----- X.25 Paket Format ----------*/ +typedef struct X25Pkt /*----- X.25 Packet Format ----------*/ { unsigned char lcn_hi PACKED; /* 4 MSB of Logical Channel Number */ unsigned char lcn_lo PACKED; /* 8 LSB of Logical Channel Number */ diff --git a/include/linux/selection.h b/include/linux/selection.h index adb896b6c81a..d96596368343 100644 --- a/include/linux/selection.h +++ b/include/linux/selection.h @@ -15,28 +15,13 @@ extern int sel_loadlut(const unsigned long arg); extern int mouse_reporting(void); extern void mouse_report(struct tty_struct * tty, int butt, int mrx, int mry); -#ifdef CONFIG_FB_CONSOLE -extern unsigned long get_video_num_columns(unsigned int console); -extern unsigned long get_video_num_lines(unsigned int console); -extern unsigned long get_video_size_row(unsigned int console); -#else -#define get_video_num_columns(dummy) video_num_columns -#define get_video_num_lines(dummy) video_num_lines -#define get_video_size_row(dummy) video_size_row -#endif - -extern unsigned long video_num_columns; -extern unsigned long video_num_lines; -extern unsigned long video_size_row; -extern unsigned char video_type; -extern unsigned long video_mem_base; -extern unsigned long video_mem_term; -extern unsigned long video_screen_size; -extern unsigned short video_port_reg; -extern unsigned short video_port_val; +#define video_num_columns (vc_cons[currcons].d->vc_cols) +#define video_num_lines (vc_cons[currcons].d->vc_rows) +#define video_size_row (vc_cons[currcons].d->vc_size_row) +#define video_screen_size (vc_cons[currcons].d->vc_screenbuf_size) +#define can_do_color (vc_cons[currcons].d->vc_can_do_color) extern int console_blanked; -extern int can_do_color; extern unsigned long video_font_height; extern unsigned long video_scan_lines; @@ -66,6 +51,8 @@ extern void invert_screen(int currcons, int offset, int count, int shift); (((a) & 0x7000) >> 4) | (((a) & 0x0700) << 4)) /* this latter line used to have masks 0xf000 and 0x0f00, but selection requires a self-inverse operation; moreover, the old version looks wrong */ +#define reverse_video_short_mono(a) ((a) ^ 0x800) +#define complement_video_short(a) ((a) ^ (can_do_color ? 0x7700 : 0x800)) extern void getconsxy(int currcons, char *p); extern void putconsxy(int currcons, char *p); @@ -73,64 +60,12 @@ extern void putconsxy(int currcons, char *p); /* how to access screen memory */ -#if defined(CONFIG_TGA_CONSOLE) - -extern int tga_blitc(unsigned int, unsigned long); -extern unsigned long video_mem_term; - -/* - * TGA console screen memory access - * - * TGA is *not* a character/attribute cell device; font bitmaps must be rendered - * to the screen pixels. - * - * We must test for an Alpha kernel virtual address that falls within - * the "shadow screen" memory. This condition indicates we really want - * to write to the screen, so, we do... :-) - * - * NOTE also: there's only *TWO* operations: to put/get a character/attribute. - * All the others needed by VGA support go away, as Not Applicable for TGA. - */ -static inline void scr_writew(unsigned short val, unsigned short * addr) -{ - /* - * always deposit the char/attr, then see if it was to "screen" mem. - * if so, then render the char/attr onto the real screen. - */ - *addr = val; - if ((unsigned long)addr < video_mem_term && - (unsigned long)addr >= video_mem_base) { - tga_blitc(val, (unsigned long) addr); - } -} - -static inline unsigned short scr_readw(unsigned short * addr) -{ - return *addr; -} - -#elif defined(CONFIG_SUN_CONSOLE) -#include -#include -extern int sun_blitc(unsigned int, unsigned long); -extern void memsetw(void * s, unsigned short c, unsigned int count); -extern void memcpyw(unsigned short *to, unsigned short *from, unsigned int count); -extern unsigned long video_mem_term; +#include -/* Basically the same as the TGA stuff. */ -static inline void scr_writew(unsigned short val, unsigned short * addr) +static inline void scr_writew(unsigned short val, unsigned short *addr) { - /* - * always deposit the char/attr, then see if it was to "screen" mem. - * if so, then render the char/attr onto the real screen. - */ - if (*addr != val) { - *addr = val; - if ((unsigned long)addr < video_mem_term && - (unsigned long)addr >= video_mem_base && - vt_cons [fg_console]->vc_mode == KD_TEXT) - sun_blitc(val, (unsigned long) addr); - } + /* simply store the value in the "shadow screen" memory */ + *addr = val; } static inline unsigned short scr_readw(unsigned short * addr) @@ -138,61 +73,6 @@ static inline unsigned short scr_readw(unsigned short * addr) return *addr; } -#else /* CONFIG_TGA_CONSOLE || CONFIG_SUN_CONSOLE */ - -/* - * normal VGA console access - * - */ - -#include - -/* - * NOTE: "(long) addr < 0" tests for an Alpha kernel virtual address; this - * indicates a VC's backing store; otherwise, it's a bus memory address, for - * the VGA's screen memory, so we do the Alpha "swizzle"... :-) - */ -static inline void scr_writeb(unsigned char val, unsigned char * addr) -{ - if ((long) addr < 0) - *addr = val; - else - writeb(val, (unsigned long) addr); -} - -static inline unsigned char scr_readb(unsigned char * addr) -{ - if ((long) addr < 0) - return *addr; - return readb((unsigned long) addr); -} - -static inline void scr_writew(unsigned short val, unsigned short * addr) -{ -#ifdef __powerpc__ - st_le16(addr, val); -#else - if ((long) addr < 0) - *addr = val; - else - writew(val, (unsigned long) addr); -#endif /* !__powerpc__ */ -} - -static inline unsigned short scr_readw(unsigned short * addr) -{ -#ifdef __powerpc__ - return ld_le16(addr); -#else - if ((long) addr < 0) - return *addr; - return readw((unsigned long) addr); -#endif /* !__powerpc__ */ -} - -#endif /* CONFIG_TGA_CONSOLE */ - -#ifndef CONFIG_SUN_CONSOLE static inline void memsetw(void * s, unsigned short c, unsigned int count) { unsigned short * addr = (unsigned short *) s; @@ -213,4 +93,3 @@ static inline void memcpyw(unsigned short *to, unsigned short *from, scr_writew(scr_readw(from++), to++); } } -#endif /* CONFIG_SUN_CONSOLE */ diff --git a/include/linux/socket.h b/include/linux/socket.h index 35a7629b6b70..87b175b994d4 100644 --- a/include/linux/socket.h +++ b/include/linux/socket.h @@ -141,7 +141,7 @@ struct ucred { #define AF_INET 2 /* Internet IP Protocol */ #define AF_AX25 3 /* Amateur Radio AX.25 */ #define AF_IPX 4 /* Novell IPX */ -#define AF_APPLETALK 5 /* Appletalk DDP */ +#define AF_APPLETALK 5 /* AppleTalk DDP */ #define AF_NETROM 6 /* Amateur Radio NET/ROM */ #define AF_BRIDGE 7 /* Multiprotocol bridge */ #define AF_ATMPVC 8 /* ATM PVCs */ diff --git a/include/linux/tty.h b/include/linux/tty.h index ea8bae2a105f..394d22588364 100644 --- a/include/linux/tty.h +++ b/include/linux/tty.h @@ -40,18 +40,36 @@ */ struct screen_info { - unsigned char orig_x; - unsigned char orig_y; - unsigned char unused1[2]; - unsigned short orig_video_page; - unsigned char orig_video_mode; - unsigned char orig_video_cols; - unsigned short unused2; - unsigned short orig_video_ega_bx; - unsigned short unused3; - unsigned char orig_video_lines; - unsigned char orig_video_isVGA; - unsigned short orig_video_points; + unsigned char orig_x; /* 0x00 */ + unsigned char orig_y; /* 0x01 */ + unsigned short dontuse1; /* 0x02 -- EXT_MEM_K sits here */ + unsigned short orig_video_page; /* 0x04 */ + unsigned char orig_video_mode; /* 0x06 */ + unsigned char orig_video_cols; /* 0x07 */ + unsigned short unused2; /* 0x08 */ + unsigned short orig_video_ega_bx; /* 0x0a */ + unsigned short unused3; /* 0x0c */ + unsigned char orig_video_lines; /* 0x0e */ + unsigned char orig_video_isVGA; /* 0x0f */ + unsigned short orig_video_points; /* 0x10 */ + + /* VESA graphic mode -- linear frame buffer */ + unsigned short lfb_width; /* 0x12 */ + unsigned short lfb_height; /* 0x14 */ + unsigned short lfb_depth; /* 0x16 */ + unsigned long lfb_base; /* 0x18 */ + unsigned long lfb_size; /* 0x1c */ + unsigned short dontuse2, dontuse3; /* 0x20 -- CL_MAGIC and CL_OFFSET here */ + unsigned short lfb_linelength; /* 0x24 */ + unsigned char red_size; /* 0x26 */ + unsigned char red_pos; /* 0x27 */ + unsigned char green_size; /* 0x28 */ + unsigned char green_pos; /* 0x29 */ + unsigned char blue_size; /* 0x2a */ + unsigned char blue_pos; /* 0x2b */ + unsigned char rsvd_size; /* 0x2c */ + unsigned char rsvd_pos; /* 0x2d */ + /* 0x2e -- 0x3f reserved for future expansion */ }; extern struct screen_info screen_info; @@ -70,6 +88,7 @@ extern struct screen_info screen_info; #define VIDEO_TYPE_EGAM 0x20 /* EGA/VGA in Monochrome Mode */ #define VIDEO_TYPE_EGAC 0x21 /* EGA in Color Mode */ #define VIDEO_TYPE_VGAC 0x22 /* VGA+ in Color Mode */ +#define VIDEO_TYPE_VLFB 0x23 /* VESA VGA in graphic mode */ #define VIDEO_TYPE_TGAC 0x40 /* DEC TGA */ diff --git a/include/linux/vt_kern.h b/include/linux/vt_kern.h index 1692f991c815..d15cb92da6d0 100644 --- a/include/linux/vt_kern.h +++ b/include/linux/vt_kern.h @@ -34,6 +34,8 @@ void (*kd_mksound)(unsigned int hz, unsigned int ticks); int vc_allocate(unsigned int console); int vc_cons_allocated(unsigned int console); int vc_resize(unsigned long lines, unsigned long cols); +void vc_resize_con(unsigned long lines, unsigned long cols, + unsigned int currcons); void vc_disallocate(unsigned int console); #endif /* _VT_KERN_H */ diff --git a/init/main.c b/init/main.c index 956899b25e65..19fe9dd1e8bb 100644 --- a/init/main.c +++ b/init/main.c @@ -530,7 +530,7 @@ static struct kernel_param cooked_params[] __initdata = { { "noinitrd", no_initrd }, #endif #endif -#if defined (CONFIG_AMIGA) || defined (CONFIG_ATARI) +#ifdef CONFIG_FB { "video=", video_setup }, #endif { "panic=", panic_setup }, diff --git a/kernel/acct.c b/kernel/acct.c index 6a00f3571177..c5b161ae0873 100644 --- a/kernel/acct.c +++ b/kernel/acct.c @@ -257,7 +257,7 @@ int acct_process(long exitcode) /* * First check to see if there is enough free_space to continue the process - * accounting system. Check_free_space toggle's the acct_active flag so we + * accounting system. Check_free_space toggles the acct_active flag so we * need to check that after check_free_space. */ check_free_space(); diff --git a/kernel/kmod.c b/kernel/kmod.c index f1da4b9e6172..5fd597a30d1c 100644 --- a/kernel/kmod.c +++ b/kernel/kmod.c @@ -15,7 +15,6 @@ #include #include #include -#include #include /* @@ -23,7 +22,6 @@ */ char modprobe_path[256] = "/sbin/modprobe"; static char * envp[] = { "HOME=/", "TERM=linux", "PATH=/usr/bin:/bin", NULL }; -static struct semaphore kmod_sem = MUTEX; /* exec_modprobe is spawned from a kernel-mode user process, @@ -103,20 +101,15 @@ int request_module(const char * module_name) return -EPERM; } - down(&kmod_sem); - pid = kernel_thread(exec_modprobe, (void*) module_name, CLONE_FS); if (pid < 0) { printk(KERN_ERR "kmod: fork failed, errno %d\n", -pid); - goto out; + return pid; } waitpid_result = waitpid(pid, NULL, __WCLONE); if (waitpid_result != pid) { printk (KERN_ERR "kmod: waitpid(%d,NULL,0) failed, returning %d.\n", pid, waitpid_result); } - pid = 0; -out: - up(&kmod_sem); - return pid; + return 0; } diff --git a/kernel/resource.c b/kernel/resource.c index ff7c7492a341..dc23b159b994 100644 --- a/kernel/resource.c +++ b/kernel/resource.c @@ -143,7 +143,7 @@ unsigned long occupy_region(unsigned long base, unsigned long end, if (iotable[i].num == 0) break; if (i == IOTABLE_SIZE) { - /* Driver prints a warning typicaly. */ + /* Driver prints a warning typically. */ return 0; } diff --git a/kernel/sched.c b/kernel/sched.c index aa943eb1aca2..363b65563c46 100644 --- a/kernel/sched.c +++ b/kernel/sched.c @@ -169,7 +169,7 @@ static inline void move_first_runqueue(struct task_struct * p) * The run-queue lock locks the parts that actually access * and change the run-queues, and have to be interrupt-safe. */ -spinlock_t scheduler_lock = SPIN_LOCK_UNLOCKED; /* should be aquired first */ +spinlock_t scheduler_lock = SPIN_LOCK_UNLOCKED; /* should be acquired first */ spinlock_t runqueue_lock = SPIN_LOCK_UNLOCKED; /* second */ rwlock_t tasklist_lock = RW_LOCK_UNLOCKED; /* third */ @@ -1249,9 +1249,9 @@ asmlinkage int sys_nice(int increment) newprio = 40; /* * do a "normalization" of the priority (traditionally - * unix nice values are -20..20, linux doesn't really + * Unix nice values are -20 to 20; Linux doesn't really * use that kind of thing, but uses the length of the - * timeslice instead (default 150 msec). The rounding is + * timeslice instead (default 150 ms). The rounding is * why we want to avoid negative values. */ newprio = (newprio * DEF_PRIORITY + 10) / 20; diff --git a/kernel/signal.c b/kernel/signal.c index e0cf6a943629..6c7c7b50cef9 100644 --- a/kernel/signal.c +++ b/kernel/signal.c @@ -255,7 +255,7 @@ printk("SIG queue (%s:%d): %d ", t->comm, t->pid, sig); t->exit_code = 0; sigdelsetmask(&t->signal, (sigmask(SIGSTOP)|sigmask(SIGTSTP)| sigmask(SIGTTOU)|sigmask(SIGTTIN))); - /* Inflict this corner case with recalculaions, not mainline */ + /* Inflict this corner case with recalculations, not mainline */ recalc_sigpending(t); break; @@ -263,7 +263,7 @@ printk("SIG queue (%s:%d): %d ", t->comm, t->pid, sig); case SIGTTIN: case SIGTTOU: /* If we're stopping again, cancel SIGCONT */ sigdelset(&t->signal, SIGCONT); - /* Inflict this corner case with recalculaions, not mainline */ + /* Inflict this corner case with recalculations, not mainline */ recalc_sigpending(t); break; } diff --git a/kernel/sys.c b/kernel/sys.c index e50c82c355c8..169f4d699b24 100644 --- a/kernel/sys.c +++ b/kernel/sys.c @@ -259,9 +259,9 @@ void ctrl_alt_del(void) * * The general idea is that a program which uses just setregid() will be * 100% compatible with BSD. A program which uses just setgid() will be - * 100% compatible with POSIX w/ Saved ID's. + * 100% compatible with POSIX with saved IDs. * - * SMP: There are not races, the gid's are checked only by filesystem + * SMP: There are not races, the GIDs are checked only by filesystem * operations (as far as semantic preservation is concerned). */ asmlinkage int sys_setregid(gid_t rgid, gid_t egid) @@ -366,7 +366,7 @@ extern inline void cap_emulate_setxuid(int old_ruid, int old_euid, * * The general idea is that a program which uses just setreuid() will be * 100% compatible with BSD. A program which uses just setuid() will be - * 100% compatible with POSIX w/ Saved ID's. + * 100% compatible with POSIX with saved IDs. */ asmlinkage int sys_setreuid(uid_t ruid, uid_t euid) { @@ -421,7 +421,7 @@ asmlinkage int sys_setreuid(uid_t ruid, uid_t euid) /* - * setuid() is implemented like SysV w/ SAVED_IDS + * setuid() is implemented like SysV with SAVED_IDS * * Note that SAVED_ID's is deficient in that a setuid root program * like sendmail, for example, cannot set its uid to be a normal @@ -465,7 +465,7 @@ asmlinkage int sys_setuid(uid_t uid) /* - * This function implementes a generic ability to update ruid, euid, + * This function implements a generic ability to update ruid, euid, * and suid. This allows you to implement the 4.4 compatible seteuid(). */ asmlinkage int sys_setresuid(uid_t ruid, uid_t euid, uid_t suid) @@ -763,7 +763,7 @@ out: } /* - * Supplementary group ID's + * Supplementary group IDs */ asmlinkage int sys_getgroups(int gidsetsize, gid_t *grouplist) { diff --git a/lib/inflate.c b/lib/inflate.c index 6d7a637953ad..011d382840b0 100644 --- a/lib/inflate.c +++ b/lib/inflate.c @@ -11,7 +11,7 @@ /* Inflate deflated (PKZIP's method 8 compressed) data. The compression method searches for as much of the current string of bytes (up to a - length of 258) in the previous 32K bytes. If it doesn't find any + length of 258) in the previous 32 K bytes. If it doesn't find any matches (of at least length 3), it codes the next byte. Otherwise, it codes the length of the matched string and its distance backwards from the current position. There is a single Huffman code that codes both @@ -28,7 +28,7 @@ There are (currently) three kinds of inflate blocks: stored, fixed, and dynamic. The compressor deals with some chunk of data at a time, and decides which method to use on a chunk-by-chunk basis. A chunk might - typically be 32K or 64K. If the chunk is uncompressible, then the + typically be 32 K or 64 K. If the chunk is incompressible, then the "stored" method is used. In this case, the bytes are simply stored as is, eight bits per byte, with none of the above coding. The bytes are preceded by a count, since there is no longer an EOB code. @@ -143,11 +143,11 @@ STATIC int inflate_block OF((int *)); STATIC int inflate OF((void)); -/* The inflate algorithm uses a sliding 32K byte window on the uncompressed +/* The inflate algorithm uses a sliding 32 K byte window on the uncompressed stream to find repeated byte strings. This is implemented here as a circular buffer. The index is updated simply by incrementing and then - and'ing with 0x7fff (32K-1). */ -/* It is left to other modules to supply the 32K area. It is assumed + ANDing with 0x7fff (32K-1). */ +/* It is left to other modules to supply the 32 K area. It is assumed to be usable as if it were declared "uch slide[32768];" or as just "uch *slide;" and then malloc'ed in the latter case. The definition must be in unzip.h, included above. */ @@ -1044,7 +1044,7 @@ makecrc(void) } /* gzip flag byte */ -#define ASCII_FLAG 0x01 /* bit 0 set: file probably ascii text */ +#define ASCII_FLAG 0x01 /* bit 0 set: file probably ASCII text */ #define CONTINUATION 0x02 /* bit 1 set: continuation of multi-part gzip file */ #define EXTRA_FIELD 0x04 /* bit 2 set: extra field present */ #define ORIG_NAME 0x08 /* bit 3 set: original file name present */ diff --git a/mm/filemap.c b/mm/filemap.c index 44c9d8b018d7..f44d1c0ac61a 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -901,7 +901,7 @@ page_read_error: goto success; /* - * Uhhuh.. Things didn't work out. Return zero to tell the + * Things didn't work out. Return zero to tell the * mm layer so, possibly freeing the page cache page first. */ failure: @@ -1412,7 +1412,7 @@ page_wait: set_bit(PG_uptodate, &page->flags); do_update_page: - /* Alright, the page is there. Now update it. */ + /* All right, the page is there. Now update it. */ status = inode->i_op->updatepage(file, page, buf, offset, bytes, sync); done_with_page: diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 2079fc7d47ce..5d5be64e07c5 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -101,7 +101,7 @@ static inline void remove_mem_queue(struct page * entry) spinlock_t page_alloc_lock = SPIN_LOCK_UNLOCKED; /* - * This routine is used by the kernel swap deamon to determine + * This routine is used by the kernel swap daemon to determine * whether we have "enough" free pages. It is fairly arbitrary, * but this had better return false if any reasonable "get_free_page()" * allocation could currently fail.. diff --git a/mm/page_io.c b/mm/page_io.c index eb436f7b7c10..fa404b1b32e4 100644 --- a/mm/page_io.c +++ b/mm/page_io.c @@ -142,7 +142,7 @@ void rw_swap_page(int rw, unsigned long entry, char * buf, int wait) if (swapf->i_op->bmap == NULL && swapf->i_op->smap != NULL){ /* - With MsDOS, we use msdos_smap which return + With MS-DOS, we use msdos_smap which return a sector number (not a cluster or block number). It is a patch to enable the UMSDOS project. Other people are working on better solution. diff --git a/mm/slab.c b/mm/slab.c index ae7734a4c979..5b7029aa30e2 100644 --- a/mm/slab.c +++ b/mm/slab.c @@ -70,7 +70,7 @@ * * Calls to printk() are not 100% safe (the function is not threaded). However, * printk() is only used under an error condition, and the risk is v. small (not - * sure if the console write functions 'enjoy' executing multiple contextes in + * sure if the console write functions 'enjoy' executing multiple contexts in * parallel. I guess they don't...). * Note, for most calls to printk() any held cache-lock is dropped. This is not * always done for text size reasons - having *_unlock() everywhere is bloat. @@ -92,11 +92,11 @@ * index to hold the bufctls. This allows the bufctl structure to * be small (one word), but limits the number of objects a slab (not * a cache) can contain when off-slab bufctls are used. The limit is the - * size of the largest general-cache that does not use off-slab bufctls, + * size of the largest general cache that does not use off-slab bufctls, * divided by the size of a bufctl. For 32bit archs, is this 256/4 = 64. * This is not serious, as it is only for large objects, when it is unwise * to have too many per slab. - * Note: This limit can be raised by introducing a general-cache whose size + * Note: This limit can be raised by introducing a general cache whose size * is less than 512 (PAGE_SIZE<<3), but greater than 256. */ @@ -124,12 +124,12 @@ * * SLAB_DEBUG_SUPPORT - 1 for kmem_cache_create() to honour; SLAB_DEBUG_FREE, * SLAB_DEBUG_INITIAL, SLAB_RED_ZONE & SLAB_POISON. - * 0 for faster, smaller, code (espically in the critical paths). + * 0 for faster, smaller, code (especially in the critical paths). * * SLAB_STATS - 1 to collect stats for /proc/slabinfo. - * 0 for faster, smaller, code (espically in the critical paths). + * 0 for faster, smaller, code (especially in the critical paths). * - * SLAB_SELFTEST - 1 to perform a few tests, mainly for developement. + * SLAB_SELFTEST - 1 to perform a few tests, mainly for development. */ #define SLAB_MGMT_CHECKS 1 #define SLAB_DEBUG_SUPPORT 0 @@ -180,7 +180,7 @@ typedef struct kmem_slab_s { s_dma:1; } kmem_slab_t; -/* When the slab mgmt is on-slab, this gives the size to use. */ +/* When the slab management is on-slab, this gives the size to use. */ #define slab_align_size (L1_CACHE_ALIGN(sizeof(kmem_slab_t))) /* Test for end of slab chain. */ @@ -188,7 +188,7 @@ typedef struct kmem_slab_s { /* s_magic */ #define SLAB_MAGIC_ALLOC 0xA5C32F2BUL /* slab is alive */ -#define SLAB_MAGIC_DESTROYED 0xB2F23C5AUL /* slab has been destoryed */ +#define SLAB_MAGIC_DESTROYED 0xB2F23C5AUL /* slab has been destroyed */ /* Bufctl's are used for linking objs within a slab, identifying what slab an obj * is in, and the address of the associated obj (for sanity checking with off-slab @@ -260,9 +260,9 @@ struct kmem_cache_s { }; /* internal c_flags */ -#define SLAB_CFLGS_OFF_SLAB 0x010000UL /* slab mgmt in own cache */ +#define SLAB_CFLGS_OFF_SLAB 0x010000UL /* slab management in own cache */ #define SLAB_CFLGS_BUFCTL 0x020000UL /* bufctls in own cache */ -#define SLAB_CFLGS_GENERAL 0x080000UL /* a general-cache */ +#define SLAB_CFLGS_GENERAL 0x080000UL /* a general cache */ /* c_dflags (dynamic flags). Need to hold the spinlock to access this member */ #define SLAB_CFLGS_GROWN 0x000002UL /* don't reap a recently grown */ @@ -307,7 +307,7 @@ static void kmem_self_test(void); /* maximum num of pages for a slab (prevents large requests to the VM layer) */ #define SLAB_MAX_GFP_ORDER 5 /* 32 pages */ -/* the 'prefered' minimum num of objs per slab - maybe less for large objs */ +/* the 'preferred' minimum num of objs per slab - maybe less for large objs */ #define SLAB_MIN_OBJS_PER_SLAB 4 /* If the num of objs per slab is <= SLAB_MIN_OBJS_PER_SLAB, @@ -325,7 +325,7 @@ static void kmem_self_test(void); #define SLAB_SET_PAGE_SLAB(pg, x) ((pg)->prev = (struct page *)(x)) #define SLAB_GET_PAGE_SLAB(pg) ((kmem_slab_t *)(pg)->prev) -/* Size description struct for general-caches. */ +/* Size description struct for general caches. */ typedef struct cache_sizes { size_t cs_size; kmem_cache_t *cs_cachep; @@ -350,7 +350,7 @@ static cache_sizes_t cache_sizes[] = { {0, NULL} }; -/* Names for the general-caches. Not placed into the sizes struct for +/* Names for the general caches. Not placed into the sizes struct for * a good reason; the string ptr is not needed while searching in kmalloc(), * and would 'get-in-the-way' in the h/w cache. */ @@ -396,7 +396,7 @@ static struct semaphore cache_chain_sem; /* Place maintainer for reaping. */ static kmem_cache_t *clock_searchp = &cache_cache; -/* Internal slab mgmt cache, for when slab mgmt is off-slab. */ +/* Internal slab management cache, for when slab management is off-slab. */ static kmem_cache_t *cache_slabp = NULL; /* Max number of objs-per-slab for caches which use bufctl's. @@ -463,9 +463,9 @@ __initfunc(void kmem_cache_sizes_init(void)) char **names = cache_sizes_name; cache_sizes_t *sizes = cache_sizes; do { - /* For performance, all the general-caches are L1 aligned. + /* For performance, all the general caches are L1 aligned. * This should be particularly beneficial on SMP boxes, as it - * elimantes "false sharing". + * eliminates "false sharing". * Note for systems short on memory removing the alignment will * allow tighter packing of the smaller caches. */ if (!(sizes->cs_cachep = @@ -562,7 +562,7 @@ kmem_check_poison_obj(kmem_cache_t *cachep, void *addr) } #endif /* SLAB_DEBUG_SUPPORT */ -/* Three slab chain funcs - all called with ints disabled and the appropiate +/* Three slab chain funcs - all called with ints disabled and the appropriate * cache-lock held. */ static inline void @@ -630,7 +630,7 @@ kmem_slab_destroy(kmem_cache_t *cachep, kmem_slab_t *slabp) #if SLAB_DEBUG_SUPPORT else if (cachep->c_flags & SLAB_POISON) { if (kmem_check_poison_obj(cachep, objp)) - printk(KERN_ERR "kmem_slab_destory: " + printk(KERN_ERR "kmem_slab_destroy: " "Bad poison - %s\n", cachep->c_name); } if (cachep->c_flags & SLAB_RED_ZONE) @@ -714,7 +714,7 @@ kmem_cache_create(const char *name, size_t size, size_t offset, } if (offset < 0 || offset > size) { - printk("%sOffset weired %d - %s\n", func_nm, (int) offset, name); + printk("%sOffset weird %d - %s\n", func_nm, (int) offset, name); offset = 0; } @@ -781,11 +781,11 @@ kmem_cache_create(const char *name, size_t size, size_t offset, if (flags & SLAB_HWCACHE_ALIGN) align = L1_CACHE_BYTES; - /* Determine if the slab mgmt and/or bufclts are 'on' or 'off' slab. */ + /* Determine if the slab management and/or bufclts are 'on' or 'off' slab. */ extra = sizeof(kmem_bufctl_t); if (size < (PAGE_SIZE>>3)) { /* Size is small(ish). Use packing where bufctl size per - * obj is low, and slab mngmnt is on-slab. + * obj is low, and slab management is on-slab. */ #if 0 if ((flags & SLAB_HIGH_PACK)) { @@ -802,7 +802,7 @@ kmem_cache_create(const char *name, size_t size, size_t offset, } #endif } else { - /* Size is large, assume best to place the slab mngmnt obj + /* Size is large, assume best to place the slab management obj * off-slab (should allow better packing of objs). */ flags |= SLAB_CFLGS_OFF_SLAB; @@ -811,7 +811,7 @@ kmem_cache_create(const char *name, size_t size, size_t offset, /* To avoid waste the bufctls are off-slab... */ flags |= SLAB_CFLGS_BUFCTL; extra = 0; - } /* else slab mngmnt is off-slab, but freelist ptrs are on. */ + } /* else slab management is off-slab, but freelist pointers are on. */ } size += extra; @@ -1018,8 +1018,8 @@ kmem_cache_shrink(kmem_cache_t *cachep) printk(KERN_ERR "kmem_shrink: Invalid cache addr %p\n", cachep); return 2; found: - /* Relase the sempahore before getting the cache-lock. This could - * mean multiple engines are shrinking the cache, but so what... + /* Release the semaphore before getting the cache-lock. This could + * mean multiple engines are shrinking the cache, but so what. */ up(&cache_chain_sem); spin_lock_irq(&cachep->c_spinlock); @@ -1041,17 +1041,17 @@ found: return ret; } -/* Get the mem for a slab mgmt obj. */ +/* Get the memory for a slab management obj. */ static inline kmem_slab_t * kmem_cache_slabmgmt(kmem_cache_t *cachep, void *objp, int local_flags) { kmem_slab_t *slabp; if (SLAB_OFF_SLAB(cachep->c_flags)) { - /* Slab mgmt obj is off-slab. */ + /* Slab management obj is off-slab. */ slabp = kmem_cache_alloc(cache_slabp, local_flags); } else { - /* Slab mgmnt at end of slab mem, placed so that + /* Slab management at end of slab memory, placed so that * the position is 'coloured'. */ void *end; @@ -1199,7 +1199,7 @@ re_try: if (!(objp = kmem_getpages(cachep, flags, &dma))) goto failed; - /* Get slab mgmt. */ + /* Get slab management. */ if (!(slabp = kmem_cache_slabmgmt(cachep, objp+offset, local_flags))) goto opps1; if (dma) @@ -1253,7 +1253,7 @@ failed: if (local_flags != SLAB_ATOMIC && cachep->c_gfporder) { /* For large order (>0) slabs, we try again. * Needed because the gfp() functions are not good at giving - * out contigious pages unless pushed (but do not push too hard). + * out contiguous pages unless pushed (but do not push too hard). */ if (cachep->c_failures++ < 4 && cachep->c_freep == kmem_slab_end(cachep)) goto re_try; @@ -1632,19 +1632,19 @@ kfree(const void *objp) goto bad_ptr; /* Assume we own the page structure - hence no locking. - * If someone is misbehaving (eg. someone calling us with a bad + * If someone is misbehaving (for example, calling us with a bad * address), then access to the page structure can race with the - * kmem_slab_destory() code. Need to add a spin_lock to each page + * kmem_slab_destroy() code. Need to add a spin_lock to each page * structure, which would be useful in threading the gfp() functions.... */ page = &mem_map[nr]; if (PageSlab(page)) { kmem_cache_t *cachep; - /* Here, we (again) assume the obj address is good. + /* Here, we again assume the obj address is good. * If it isn't, and happens to map onto another - * general-cache page which has no active objs, then - * we race.... + * general cache page which has no active objs, then + * we race. */ cachep = SLAB_GET_PAGE_CACHE(page); if (cachep && (cachep->c_flags & SLAB_CFLGS_GENERAL)) { @@ -1698,9 +1698,9 @@ kmem_find_general_cachep(size_t size) { cache_sizes_t *csizep = cache_sizes; - /* This function could be moved to the header-file, and + /* This function could be moved to the header file, and * made inline so consumers can quickly determine what - * cache-ptr they require. + * cache pointer they require. */ for (; csizep->cs_size; csizep++) { if (size > csizep->cs_size) @@ -1729,7 +1729,7 @@ kmem_cache_reap(int gfp_mask) return; } - /* We really need a test semphore op so we can avoid sleeping when + /* We really need a test semaphore op so we can avoid sleeping when * !wait is true. */ down(&cache_chain_sem); @@ -1762,8 +1762,8 @@ kmem_cache_reap(int gfp_mask) dma_flag = 0; full_free = 0; - /* Count num of fully free slabs. Hopefully there are not many, - * we are holding the cache lock.... + /* Count the fully free slabs. There should not be not many, + * since we are holding the cache lock. */ slabp = searchp->c_lastp; while (!slabp->s_inuse && slabp != kmem_slab_end(searchp)) { @@ -1803,7 +1803,7 @@ next: up(&cache_chain_sem); if (!best_cachep) { - /* couldn't find anthying to reap */ + /* couldn't find anything to reap */ return; } diff --git a/mm/swap.c b/mm/swap.c index c760208da14e..6be5b48c2fd1 100644 --- a/mm/swap.c +++ b/mm/swap.c @@ -6,7 +6,7 @@ /* * This file contains the default values for the opereation of the - * Linux VM subsystem. Finetuning documentation can be found in + * Linux VM subsystem. Fine-tuning documentation can be found in * linux/Documentation/sysctl/vm.txt. * Started 18.12.91 * Swap aging added 23.2.95, Stephen Tweedie. diff --git a/mm/swapfile.c b/mm/swapfile.c index e987469618bb..d2d591bb0f18 100644 --- a/mm/swapfile.c +++ b/mm/swapfile.c @@ -177,7 +177,7 @@ bad_free: * that the page has been used or is no longer needed. * * Always set the resulting pte to be nowrite (the same as COW pages - * after one process has exited). We don't know just how many ptes will + * after one process has exited). We don't know just how many PTEs will * share this swap entry, so be cautious and let do_wp_page work out * what to do if a write is requested later. */ diff --git a/mm/vmscan.c b/mm/vmscan.c index e2b7b59ecf50..eb992abd28cd 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -88,7 +88,7 @@ static inline int try_to_swap_out(struct task_struct * tsk, struct vm_area_struc * pages, then delete the swap cache. We can only do this if * the swap page's reference count is one: ie. there are no * other references to it beyond the swap cache (as there must - * still be pte's pointing to it if count > 1). + * still be PTEs pointing to it if count > 1). * * If the page has NOT been touched, and its age reaches zero, * then we are swapping it out: diff --git a/net/appletalk/aarp.c b/net/appletalk/aarp.c index 511c65970492..9b9ab3a94088 100644 --- a/net/appletalk/aarp.c +++ b/net/appletalk/aarp.c @@ -1,6 +1,6 @@ /* - * AARP: An implementation of the Appletalk aarp protocol for - * ethernet 'ELAP'. + * AARP: An implementation of the AppleTalk AARP protocol for + * Ethernet 'ELAP'. * * Alan Cox * @@ -20,7 +20,7 @@ * * * References: - * Inside Appletalk (2nd Ed). + * Inside AppleTalk (2nd Ed). */ #include @@ -430,7 +430,7 @@ int aarp_send_ddp(struct device *dev,struct sk_buff *skb, struct at_addr *sa, vo skb->nh.raw=skb->data; /* - * Check for localtalk first + * Check for LocalTalk first */ @@ -645,7 +645,7 @@ static void aarp_resolved(struct aarp_entry **list, struct aarp_entry *a, int ha /* * This is called by the SNAP driver whenever we see an AARP SNAP - * frame. We currently only support ethernet. + * frame. We currently only support Ethernet. */ static int aarp_rcv(struct sk_buff *skb, struct device *dev, struct packet_type *pt) { @@ -658,7 +658,7 @@ static int aarp_rcv(struct sk_buff *skb, struct device *dev, struct packet_type /* - * We only do ethernet SNAP AARP + * We only do Ethernet SNAP AARP */ if(dev->type!=ARPHRD_ETHER) diff --git a/net/appletalk/ddp.c b/net/appletalk/ddp.c index 83dfa6741aef..247d54e8ba32 100644 --- a/net/appletalk/ddp.c +++ b/net/appletalk/ddp.c @@ -1,6 +1,6 @@ /* - * DDP: An implementation of the Appletalk DDP protocol for - * ethernet 'ELAP'. + * DDP: An implementation of the AppleTalk DDP protocol for + * Ethernet 'ELAP'. * * Alan Cox * @@ -18,17 +18,17 @@ * Alan Cox : Added firewall hooks. * Alan Cox : Supports new ARPHRD_LOOPBACK * Christer Weinigel : Routing and /proc fixes. - * Bradford Johnson : Localtalk. + * Bradford Johnson : LocalTalk. * Tom Dyas : Module support. * Alan Cox : Hooks for PPP (based on the - * localtalk hook). + * LocalTalk hook). * Alan Cox : Posix bits * Alan Cox/Mike Freeman : Possible fix to NBP problems * Bradford Johnson : IP-over-DDP (experimental) * Jay Schulist : Moved IP-over-DDP to its own * driver file. (ipddp.c & ipddp.h) * Jay Schulist : Made work as module with - * Appletalk drivers, cleaned it. + * AppleTalk drivers, cleaned it. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -197,7 +197,7 @@ int atalk_get_info(char *buffer, char **start, off_t offset, int length, int dum off_t begin=0; /* - * Output the appletalk data for the /proc virtual fs. + * Output the AppleTalk data for the /proc filesystem. */ len += sprintf(buffer,"Type local_addr remote_addr tx_queue rx_queue st uid\n"); @@ -241,7 +241,7 @@ int atalk_get_info(char *buffer, char **start, off_t offset, int length, int dum /**************************************************************************\ * * -* Routing tables for the Appletalk socket layer. * +* Routing tables for the AppleTalk socket layer. * * * \**************************************************************************/ @@ -250,7 +250,7 @@ static struct atalk_iface *atalk_iface_list = NULL; static struct atalk_route atrtr_default; /* For probing devices or in a routerless network */ /* - * Appletalk interface control + * AppleTalk interface control */ /* @@ -476,7 +476,7 @@ static struct atalk_iface *atalk_find_interface(int net, int node) /* - * Find a route for an appletalk packet. This ought to get cached in + * Find a route for an AppleTalk packet. This ought to get cached in * the socket (later on...). We know about host routes and the fact * that a route must be direct to broadcast. */ @@ -504,7 +504,7 @@ static struct atalk_route *atrtr_find(struct at_addr *target) /* - * Given an appletalk network find the device to use. This can be + * Given an AppleTalk network, find the device to use. This can be * a simple lookup. */ struct device *atrtr_get_dev(struct at_addr *sa) @@ -732,8 +732,8 @@ int atif_ioctl(int cmd, void *arg) nr=(struct netrange *)&sa->sat_zero[0]; /* - * Phase 1 is fine on Localtalk but we don't do - * Ethertalk phase 1. Anyone wanting to add it go ahead. + * Phase 1 is fine on LocalTalk but we don't do + * EtherTalk phase 1. Anyone wanting to add it go ahead. */ if(dev->type == ARPHRD_ETHER && nr->nr_phase != 2) return (-EPROTONOSUPPORT); @@ -947,7 +947,7 @@ int atalk_rt_get_info(char *buffer, char **start, off_t offset, int length, int /**************************************************************************\ * * * Handling for system calls applied via the various interfaces to an * -* Appletalk socket object. * +* AppleTalk socket object. * * * \**************************************************************************/ @@ -1201,7 +1201,7 @@ static int atalk_accept(struct socket *sock, struct socket *newsock, int flags) } /* - * Find the name of an appletalk socket. Just copy the right + * Find the name of an AppleTalk socket. Just copy the right * fields into the sockaddr. */ static int atalk_getname(struct socket *sock, struct sockaddr *uaddr, @@ -1299,7 +1299,7 @@ static int atalk_rcv(struct sk_buff *skb, struct device *dev, struct packet_type */ if(ddp->deh_sum && atalk_checksum(ddp, ddp->deh_len) != ddp->deh_sum) { - /* Not a valid appletalk frame - dustbin time */ + /* Not a valid AppleTalk frame - dustbin time */ kfree_skb(skb); return (0); } @@ -1318,7 +1318,7 @@ static int atalk_rcv(struct sk_buff *skb, struct device *dev, struct packet_type atif = atalk_find_interface(ddp->deh_dnet, ddp->deh_dnode); /* - * Not ours, so we route the packet via the correct Appletalk interface. + * Not ours, so we route the packet via the correct AppleTalk interface. */ if(atif == NULL) { @@ -1377,7 +1377,7 @@ static int atalk_rcv(struct sk_buff *skb, struct device *dev, struct packet_type * Send the buffer onwards * * Now we must always be careful. If it's come from - * localtalk to ethertalk it might not fit + * LocalTalk to EtherTalk it might not fit * * Order matters here: If a packet has to be copied * to make a new headroom (rare hopefully) then it @@ -1458,7 +1458,7 @@ static int atalk_rcv(struct sk_buff *skb, struct device *dev, struct packet_type } /* - * Receive a localtalk frame. We make some demands on the caller here. + * Receive a LocalTalk frame. We make some demands on the caller here. * Caller must provide enough headroom on the packet to pull the short * header and append a long one. */ @@ -1765,7 +1765,7 @@ static int atalk_shutdown(struct socket *sk,int how) } /* - * Appletalk ioctl calls. + * AppleTalk ioctl calls. */ static int atalk_ioctl(struct socket *sock,unsigned int cmd, unsigned long arg) { @@ -1910,7 +1910,7 @@ struct packet_type ppptalk_packet_type= static char ddp_snap_id[] = {0x08, 0x00, 0x07, 0x80, 0x9B}; /* - * Export symbols for use by drivers when Appletalk is a module. + * Export symbols for use by drivers when AppleTalk is a module. */ EXPORT_SYMBOL(aarp_send_ddp); EXPORT_SYMBOL(atrtr_get_dev); @@ -1969,7 +1969,7 @@ __initfunc(void atalk_proto_init(struct net_proto *pro)) atalk_register_sysctl(); #endif /* CONFIG_SYSCTL */ - printk(KERN_INFO "Appletalk 0.18 for Linux NET3.037\n"); + printk(KERN_INFO "AppleTalk 0.18 for Linux NET3.037\n"); } #ifdef MODULE @@ -1986,10 +1986,10 @@ int init_module(void) * Use counts are incremented/decremented when * sockets are created/deleted. * - * Appletalk interfaces are not incremented untill atalkd is run + * AppleTalk interfaces are not incremented untill atalkd is run * and are only decremented when they are downed. * - * Ergo, before the appletalk module can be removed, all Appletalk + * Ergo, before the AppleTalk module can be removed, all AppleTalk * sockets be closed from user space. */ diff --git a/net/appletalk/sysctl_net_atalk.c b/net/appletalk/sysctl_net_atalk.c index 77690288926e..8d9fe232ed9f 100644 --- a/net/appletalk/sysctl_net_atalk.c +++ b/net/appletalk/sysctl_net_atalk.c @@ -1,5 +1,5 @@ /* -*- linux-c -*- - * sysctl_net_atalk.c: sysctl interface to net Appletalk subsystem. + * sysctl_net_atalk.c: sysctl interface to net AppleTalk subsystem. * * Begun April 1, 1996, Mike Shaver. * Added /proc/sys/net/atalk directory entry (empty =) ). [MS] diff --git a/net/wanrouter/wanmain.c b/net/wanrouter/wanmain.c index 10e4ad5b9a24..8116db9d52dc 100644 --- a/net/wanrouter/wanmain.c +++ b/net/wanrouter/wanmain.c @@ -5,7 +5,7 @@ * the following common services for the WAN Link Drivers: * o WAN device managenment (registering, unregistering) * o Network interface management -* o Physical connection management (dial-up, incomming calls) +* o Physical connection management (dial-up, incoming calls) * o Logical connection management (switched virtual circuits) * o Protocol encapsulation/decapsulation * diff --git a/scripts/Configure b/scripts/Configure index 3b05916e6a3f..e65b3f73d988 100644 --- a/scripts/Configure +++ b/scripts/Configure @@ -1,7 +1,7 @@ #! /bin/sh # -# This script is used to configure the linux kernel. +# This script is used to configure the Linux kernel. # # It was inspired by the challenge in the original Configure script # to ``do something better'', combined with the actual need to ``do @@ -525,7 +525,7 @@ mv .tmpconfig .config mv .tmpconfig.h include/linux/autoconf.h echo -echo "The linux kernel is now hopefully configured for your setup." +echo "The Linux kernel should now be configured for your setup." echo "Check the top-level Makefile for additional configuration," echo "and do a 'make dep ; make clean' if you want to be sure all" echo "the files are correctly re-made" diff --git a/scripts/header.tk b/scripts/header.tk index 76b576097a02..028aede3db32 100644 --- a/scripts/header.tk +++ b/scripts/header.tk @@ -431,7 +431,7 @@ proc wrapup {w } { catch {destroy $w} toplevel $w -class Dialog message $w.m -width 400 -aspect 300 -text \ - "The linux kernel is now hopefully configured for your setup. Check the top-level Makefile for additional configuration, and do a 'make dep ; make clean' if you want to be sure all the files are correctly re-made." -relief raised + "The Linux kernel should now be configured for your setup. Check the top-level Makefile for additional configuration, and do a 'make dep ; make clean' if you want to be sure all the files are correctly re-made." -relief raised label $w.bm -bitmap info pack $w.bm $w.m -pady 10 -side top -padx 10 wm title $w "Kernel build instructions" -- 2.39.5