From anemo@mba.ocn.ne.jp Sun Jul  1 15:39:44 2007
Received: with ECARTIS (v1.0.0; list linux-mips); Sun, 01 Jul 2007 15:39:46 +0100 (BST)
Received: from mba.ocn.ne.jp ([122.1.175.29]:14323 "HELO smtp.mba.ocn.ne.jp")
	by ftp.linux-mips.org with SMTP id S20022238AbXGAOjo (ORCPT
	<rfc822;linux-mips@linux-mips.org>); Sun, 1 Jul 2007 15:39:44 +0100
Received: from localhost (p2185-ipad205funabasi.chiba.ocn.ne.jp [222.146.97.185])
	by smtp.mba.ocn.ne.jp (Postfix) with ESMTP
	id 89525B722; Sun,  1 Jul 2007 23:39:39 +0900 (JST)
Date:	Sun, 01 Jul 2007 23:40:27 +0900 (JST)
Message-Id: <20070701.234027.07645149.anemo@mba.ocn.ne.jp>
To:	david-b@pacbell.net
Cc:	linux-mips@linux-mips.org, ralf@linux-mips.org,
	sshtylyov@ru.mvista.com, mlachwani@mvista.com,
	spi-devel-general@lists.sourceforge.net
Subject: Re: [PATCH] TXx9 SPI controller driver (take 2)
From:	Atsushi Nemoto <anemo@mba.ocn.ne.jp>
In-Reply-To: <200706301046.20826.david-b@pacbell.net>
References: <200706300953.20156.david-b@pacbell.net>
	<20070701.023414.71085498.anemo@mba.ocn.ne.jp>
	<200706301046.20826.david-b@pacbell.net>
X-Fingerprint: 6ACA 1623 39BD 9A94 9B1A  B746 CA77 FE94 2874 D52F
X-Pgp-Public-Key: http://wwwkeys.pgp.net/pks/lookup?op=get&search=0x2874D52F
X-Mailer: Mew version 5.2 on Emacs 21.4 / Mule 5.0 (SAKAKI)
Mime-Version: 1.0
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Return-Path: <anemo@mba.ocn.ne.jp>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 15587
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: anemo@mba.ocn.ne.jp
Precedence: bulk
X-list: linux-mips

On Sat, 30 Jun 2007 10:46:20 -0700, David Brownell <david-b@pacbell.net> wrote:
> > The compiler will optimize "1000000000 / 2 / spi->max_speed_hz" into
> > "500000000 / spi->max_speed_hz", so it can be treat as one "/", no?
> 
> Sure it's deterministic.  But that doesn't prevent me from
> needing a double-take to figure what it does ... it's best
> to avoid confusing idioms in code.  At the very least, put
> parentheses there ...

OK, I will use parentheses while I think 1000000000 is important part.
Well, maybe NSEC_PER_SEC would be better.
---
Atsushi Nemoto

From kumba@gentoo.org Sun Jul  1 17:57:18 2007
Received: with ECARTIS (v1.0.0; list linux-mips); Sun, 01 Jul 2007 17:57:21 +0100 (BST)
Received: from rwcrmhc15.comcast.net ([216.148.227.155]:4573 "EHLO
	rwcrmhc15.comcast.net") by ftp.linux-mips.org with ESMTP
	id S20022304AbXGAQ5S (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Sun, 1 Jul 2007 17:57:18 +0100
Received: from [192.168.1.4] (c-69-140-18-238.hsd1.md.comcast.net[69.140.18.238])
          by comcast.net (rwcrmhc15) with ESMTP
          id <20070701165711m15009gtt5e>; Sun, 1 Jul 2007 16:57:11 +0000
Message-ID: <4687DCE2.8070302@gentoo.org>
Date:	Sun, 01 Jul 2007 12:57:06 -0400
From:	Kumba <kumba@gentoo.org>
User-Agent: Thunderbird 2.0.0.4 (Windows/20070604)
MIME-Version: 1.0
To:	Linux MIPS List <linux-mips@linux-mips.org>
Subject: O2 RM7000 Issues
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Return-Path: <kumba@gentoo.org>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 15588
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: kumba@gentoo.org
Precedence: bulk
X-list: linux-mips


So I finally managed to get my hands on one of those super-rare RM7000 CPU's for 
the SGI O2, and, as expected, there are some problems.

For the most part, the system will boot into userland, but it seems userland 
isn't at all very happy.  It seems bash is the unhappiest customer so far (or 
rather, the only userland program I've seen fail repeatedly).  Running the 
Gentoo init scripts at startup, several scripts will terminate will a variety of 
messages, from Trace/breakpoint traps, to bus errors to illegal instructions. 
However, in the init scripts, they happen at specific points; usually when 
booting our network startup scripts (neth.eth0, net.lo), and usually on an 
exit() function in the script.  Our emerge process, while python at heart, seems 
to fail sporadically on the bash sections (parsing the ebuild code) as well.

I've got a feeling this is likely a problem in the kernel more than it is a 
problem in the userland, but the question is how to go about determining which 
and where.  The RM7K's are pretty rare, so I imagine there's probably a few 
undiscovered quirks in the code (notably the SC code in arch/mips/mm/sc-rm7k.c). 
  Not to mention, we can't even use the 1MB tertiary cache these things have.

For reference, system info:

 > hinv
                    System: IP32
                 Processor: 350 Mhz RM7000, with FPU
      Primary I-cache size: 16 Kbytes
      Primary D-cache size: 16 Kbytes
      Secondary cache size: 256 Kbytes
        Ternary cache size: 1024 Kbytes
               Memory size: 512 Mbytes
                  Graphics: CRM, Rev C
                     Audio: A3 version 1
                 SCSI Disk: scsi(0)disk(2)
                 SCSI Disk: scsi(0)disk(3)
                SCSI CDROM: scsi(0)cdrom(4)


# cat /proc/cpuinfo
system type             : SGI O2
processor               : 0
cpu model               : RM7000 V3.3  FPU V2.0
BogoMIPS                : 350.20
byteorder               : big endian
wait instruction        : yes
microsecond timers      : yes
tlb_entries             : 48
extra interrupt vector  : no
hardware watchpoint     : no
ASEs implemented        :
VCED exceptions         : not available
VCEI exceptions         : not available





And errors (from various points in the execution and multiple reboots):

  * Starting eth0
/sbin/runscript.sh: line 428:  2475 Illegal instruction     ( function exit ()

  * Starting lo
/sbin/runscript.sh: line 428:  1464 Illegal instruction     ( function exit ()


  * Starting eth0
/etc/init.d/net.eth0: line 248:  1650 Bus error               ( u=0; 
module_load_minimum "${MODULES[i]}" || u=1; if [[ ${u} == 0 ]]; then

/sbin/runscript.sh: line 428:  2779 Bus error               ( function exit ()
{

  * Stopping syslog-ng ...                                                 [ ok ]
/lib/rcscripts/sh/rc-services.sh: line 444:  4093 Illegal instruction     ( 
"/etc/init.d/${service}" stop )

/lib/rcscripts/sh/rc-services.sh: line 384:  1095 Trace/breakpoint trap 
"/etc/init.d/${service}" start



So if anyone's got some old rm7k patches sitting around they want tested, or 
spots where to look/debug options to turn on, let me know.  I'll try switching 
back to an RM5200 and rebuild bash with -g and make sure gdb is installed, them 
change back to the RM7000 to try and capture some asm call or something that's 
causing these exit() failures in bash (which seem to be the primary symptom)


Cheers,


--Kumba

-- 
Gentoo/MIPS Team Lead

"Such is oft the course of deeds that move the wheels of the world: small hands 
do them because they must, while the eyes of the great are elsewhere."  --Elrond

From freshy98@gmx.net Sun Jul  1 23:08:12 2007
Received: with ECARTIS (v1.0.0; list linux-mips); Sun, 01 Jul 2007 23:08:14 +0100 (BST)
Received: from mail.gmx.net ([213.165.64.20]:54430 "HELO mail.gmx.net")
	by ftp.linux-mips.org with SMTP id S20022546AbXGAWIM (ORCPT
	<rfc822;linux-mips@linux-mips.org>); Sun, 1 Jul 2007 23:08:12 +0100
Received: (qmail invoked by alias); 01 Jul 2007 22:08:06 -0000
Received: from 53545F91.cable.casema.nl (EHLO [192.168.1.250]) [83.84.95.145]
  by mail.gmx.net (mp040) with SMTP; 02 Jul 2007 00:08:06 +0200
X-Authenticated: #11016536
X-Provags-ID: V01U2FsdGVkX1+y4u4J3USy8umZkX0UDDcK5bqCzym0lKsBLt3cVx
	hauODqbDJ9/ojd
Message-ID: <468825BE.6090001@gmx.net>
Date:	Mon, 02 Jul 2007 00:07:58 +0200
From:	freshy98 <freshy98@gmx.net>
User-Agent: Thunderbird 1.5.0.10 (Windows/20070221)
MIME-Version: 1.0
To:	Kumba <kumba@gentoo.org>
CC:	Linux MIPS List <linux-mips@linux-mips.org>
Subject: Re: O2 RM7000 Issues
References: <4687DCE2.8070302@gentoo.org>
In-Reply-To: <4687DCE2.8070302@gentoo.org>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
X-Y-GMX-Trusted: 0
Return-Path: <freshy98@gmx.net>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 15589
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: freshy98@gmx.net
Precedence: bulk
X-list: linux-mips

Ah, finally someone else got a hold of these things :-)
Still got mine unused at all.
Not done much linux at al for the past few years, but always interested 
to see how things might work out for either R5K or RM7K O2's.

Tom


Kumba wrote:
> 
> So I finally managed to get my hands on one of those super-rare RM7000 
> CPU's for the SGI O2, and, as expected, there are some problems.
> 
> For the most part, the system will boot into userland, but it seems 
> userland isn't at all very happy.  It seems bash is the unhappiest 
> customer so far (or rather, the only userland program I've seen fail 
> repeatedly).  Running the Gentoo init scripts at startup, several 
> scripts will terminate will a variety of messages, from Trace/breakpoint 
> traps, to bus errors to illegal instructions. However, in the init 
> scripts, they happen at specific points; usually when booting our 
> network startup scripts (neth.eth0, net.lo), and usually on an exit() 
> function in the script.  Our emerge process, while python at heart, 
> seems to fail sporadically on the bash sections (parsing the ebuild 
> code) as well.
> 
> I've got a feeling this is likely a problem in the kernel more than it 
> is a problem in the userland, but the question is how to go about 
> determining which and where.  The RM7K's are pretty rare, so I imagine 
> there's probably a few undiscovered quirks in the code (notably the SC 
> code in arch/mips/mm/sc-rm7k.c).  Not to mention, we can't even use the 
> 1MB tertiary cache these things have.
> 
> For reference, system info:
> 
>  > hinv
>                    System: IP32
>                 Processor: 350 Mhz RM7000, with FPU
>      Primary I-cache size: 16 Kbytes
>      Primary D-cache size: 16 Kbytes
>      Secondary cache size: 256 Kbytes
>        Ternary cache size: 1024 Kbytes
>               Memory size: 512 Mbytes
>                  Graphics: CRM, Rev C
>                     Audio: A3 version 1
>                 SCSI Disk: scsi(0)disk(2)
>                 SCSI Disk: scsi(0)disk(3)
>                SCSI CDROM: scsi(0)cdrom(4)
> 
> 
> # cat /proc/cpuinfo
> system type             : SGI O2
> processor               : 0
> cpu model               : RM7000 V3.3  FPU V2.0
> BogoMIPS                : 350.20
> byteorder               : big endian
> wait instruction        : yes
> microsecond timers      : yes
> tlb_entries             : 48
> extra interrupt vector  : no
> hardware watchpoint     : no
> ASEs implemented        :
> VCED exceptions         : not available
> VCEI exceptions         : not available
> 
> 
> 
> 
> 
> And errors (from various points in the execution and multiple reboots):
> 
>  * Starting eth0
> /sbin/runscript.sh: line 428:  2475 Illegal instruction     ( function 
> exit ()
> 
>  * Starting lo
> /sbin/runscript.sh: line 428:  1464 Illegal instruction     ( function 
> exit ()
> 
> 
>  * Starting eth0
> /etc/init.d/net.eth0: line 248:  1650 Bus error               ( u=0; 
> module_load_minimum "${MODULES[i]}" || u=1; if [[ ${u} == 0 ]]; then
> 
> /sbin/runscript.sh: line 428:  2779 Bus error               ( function 
> exit ()
> {
> 
>  * Stopping syslog-ng 
> ...                                                 [ ok ]
> /lib/rcscripts/sh/rc-services.sh: line 444:  4093 Illegal 
> instruction     ( "/etc/init.d/${service}" stop )
> 
> /lib/rcscripts/sh/rc-services.sh: line 384:  1095 Trace/breakpoint trap 
> "/etc/init.d/${service}" start
> 
> 
> 
> So if anyone's got some old rm7k patches sitting around they want 
> tested, or spots where to look/debug options to turn on, let me know.  
> I'll try switching back to an RM5200 and rebuild bash with -g and make 
> sure gdb is installed, them change back to the RM7000 to try and capture 
> some asm call or something that's causing these exit() failures in bash 
> (which seem to be the primary symptom)
> 
> 
> Cheers,
> 
> 
> --Kumba
> 

From michael@frogfoot.com Mon Jul  2 09:21:49 2007
Received: with ECARTIS (v1.0.0; list linux-mips); Mon, 02 Jul 2007 09:21:51 +0100 (BST)
Received: from marmite.frogfoot.net ([196.1.58.49]:59876 "EHLO
	marmite.frogfoot.net") by ftp.linux-mips.org with ESMTP
	id S20022470AbXGBIVt (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Mon, 2 Jul 2007 09:21:49 +0100
Received: from michael by marmite.frogfoot.net with local (Exim 4.63)
	(envelope-from <michael@frogfoot.com>)
	id 1I5H78-0004f9-Sd; Mon, 02 Jul 2007 10:18:30 +0200
Date:	Mon, 2 Jul 2007 10:18:30 +0200
To:	Atsushi Nemoto <anemo@mba.ocn.ne.jp>
Cc:	linux-mips@linux-mips.org
Subject: Re: Unhandled kernel unaligned access debugging
Message-ID: <20070702081830.GH5929@marmite.frogfoot.net>
References: <20070629163951.GG5929@marmite.frogfoot.net> <20070701.014454.126142904.anemo@mba.ocn.ne.jp>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <20070701.014454.126142904.anemo@mba.ocn.ne.jp>
User-Agent: Mutt/1.5.13 (2006-08-11)
From:	Michael Wood <michael@frogfoot.com>
Return-Path: <michael@frogfoot.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 15590
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: michael@frogfoot.com
Precedence: bulk
X-list: linux-mips

On Sun, Jul 01, 2007 at 01:44:54AM +0900, Atsushi Nemoto wrote:
> On Fri, 29 Jun 2007 18:39:51 +0200, Michael Wood <michael@frogfoot.com> wrote:
> > I think understand more or less what this means, but am unsure of how to
> > debug it.  I think OpenWRT is using the vanilla kernel, but maybe I'm
> > missing something.  Is this because I'm not using the kernel from
> > linux-mips.org?
> 
> It is not vanilla kernel.  squashfs is not merged mainline yet.

Sorry, I should have said that they start with a vanilla kernel, rather
than starting with a kernel from linux-mips.org before adding in
squashfs-lzma etc.

> > Unhandled kernel unaligned access[#1]:
> > Cpu 0
> > $ 0   : 00000000 10008400 69725020 94001b90
> > $ 4   : 94003200 7265746e 00000002 00000000
> > $ 8   : 94016338 940162b0 94016228 940161a0
> > $12   : 94e5653c 943a0000 943a0000 94e5659c
> > $16   : 94001b80 00000000 94003200 00000002
> > $20   : 00000000 00000000 00000000 00000000
> > $24   : 00000000 9410b8a0
> > $28   : 943e4000 943e5ec0 00000000 94175e40
> > Hi    : 00000003
> > Lo    : 00000002
> > epc   : 941742bc drain_freelist+0x6c/0xf8     Not tainted
> > ra    : 94175e40 cache_reap+0xc0/0x124
> > Status: 10008402    KERNEL EXL
> > Cause : 10800010
> > BadVA : 7265746e
> > PrId  : 00018448
> ...
> > 0xffffffff941742bc <drain_freelist+108>:        lw      v1,0(a1)
> 
> The value of a1 (0x7265746e) is not a kernel address and I do not
> think drain_freelist use such an address.  So it would not be an
> "unaligned access" problem.  I support it would be some sort of memory
> corruption.

OK thanks.

-- 
Michael Wood <michael@frogfoot.com>

From michael@frogfoot.com Mon Jul  2 09:24:34 2007
Received: with ECARTIS (v1.0.0; list linux-mips); Mon, 02 Jul 2007 09:24:36 +0100 (BST)
Received: from marmite.frogfoot.net ([196.1.58.49]:53178 "EHLO
	marmite.frogfoot.net") by ftp.linux-mips.org with ESMTP
	id S20022463AbXGBIYe (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Mon, 2 Jul 2007 09:24:34 +0100
Received: from michael by marmite.frogfoot.net with local (Exim 4.63)
	(envelope-from <michael@frogfoot.com>)
	id 1I5HCo-0004kk-8s; Mon, 02 Jul 2007 10:24:22 +0200
Date:	Mon, 2 Jul 2007 10:24:21 +0200
To:	Florian Fainelli <florian.fainelli@telecomint.eu>
Cc:	Atsushi Nemoto <anemo@mba.ocn.ne.jp>, linux-mips@linux-mips.org
Subject: Re: Unhandled kernel unaligned access debugging
Message-ID: <20070702082420.GI5929@marmite.frogfoot.net>
References: <20070629163951.GG5929@marmite.frogfoot.net> <20070701.014454.126142904.anemo@mba.ocn.ne.jp> <200706301854.01564.florian.fainelli@telecomint.eu>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <200706301854.01564.florian.fainelli@telecomint.eu>
User-Agent: Mutt/1.5.13 (2006-08-11)
From:	Michael Wood <michael@frogfoot.com>
Return-Path: <michael@frogfoot.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 15591
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: michael@frogfoot.com
Precedence: bulk
X-list: linux-mips

On Sat, Jun 30, 2007 at 06:53:59PM +0200, Florian Fainelli wrote:
> Hello Michael,
> 
> The OpenWrt kernel is based on the mainline kernel plus some other patches we 
> maintain for memory footprint or features. 
> 
> I suggets you disable mini_fo in the kernel configuration because it was 
> responsible for some memory corruption.

Thanks for the suggestion.

> You could also have reported the bug to our bug tracking system at 
> https://dev.openwrt.org. You will see that there a lot of other people trying 
> to get AR7 work (better ?).

I am suitably chastised ;)

I was really looking for details on what I could do to track it down,
instead of just reporting it and sitting back while someone else fixes
it, but I'll open a new ticket.

Thanks.

-- 
Michael Wood <michael@frogfoot.com>

From sknauert@wesleyan.edu Mon Jul  2 14:08:50 2007
Received: with ECARTIS (v1.0.0; list linux-mips); Mon, 02 Jul 2007 14:08:53 +0100 (BST)
Received: from post2.wesleyan.edu ([129.133.6.128]:20905 "EHLO
	post2.wesleyan.edu") by ftp.linux-mips.org with ESMTP
	id S20022701AbXGBNIu (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Mon, 2 Jul 2007 14:08:50 +0100
Received: from pony1.wesleyan.edu (pony1.wesleyan.edu [129.133.6.192])
	by courier2.wesleyan.edu (8.13.6/8.13.6) with ESMTP id l62D8htn029218
	for <linux-mips@linux-mips.org>; Mon, 2 Jul 2007 09:08:43 -0400
Received: (from apache@localhost)
	by pony1.wesleyan.edu (8.12.11.20060308/8.12.11/Submit) id l62D8hj2006914;
	Mon, 2 Jul 2007 09:08:43 -0400
Received: from 70.107.91.207
        (SquirrelMail authenticated user sknauert)
        by webmail.wesleyan.edu with HTTP;
        Mon, 2 Jul 2007 09:08:43 -0400 (EDT)
Message-ID: <50451.70.107.91.207.1183381723.squirrel@webmail.wesleyan.edu>
In-Reply-To: <468825BE.6090001@gmx.net>
References: <4687DCE2.8070302@gentoo.org> <468825BE.6090001@gmx.net>
Date:	Mon, 2 Jul 2007 09:08:43 -0400 (EDT)
Subject: Re: O2 RM7000 Issues
From:	sknauert@wesleyan.edu
To:	"Linux MIPS List" <linux-mips@linux-mips.org>
User-Agent: SquirrelMail/1.4.9a
MIME-Version: 1.0
Content-Type: text/plain;charset=UTF-8
Content-Transfer-Encoding: 8bit
X-Priority: 3 (Normal)
Importance: Normal
X-Wesleyan-MailScanner-Information: Please contact the ISP for more information
X-Wesleyan-MailScanner:	Found to be clean
X-Originating-IP: 129.133.6.192
X-MailScanner-From: sknauert@wesleyan.edu
Return-Path: <sknauert@wesleyan.edu>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 15592
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: sknauert@wesleyan.edu
Precedence: bulk
X-list: linux-mips

I have one of the 600 Mhz RM7000s, i.e. no tertiary cache since the module
was originally a 300 Mhz RM5200. However, mine hasn't given any problems
with Debian or Gentoo.

What kernel and target are you compiling for? I'm using 2.6.21.3 compiled
for R5K. All my userspace is compiled for R5K too. I'll compile a new
kernel for RM7000 and see if I have any issue then poke around to see what
kernel code gets changed. I'm not 100% sure, but I didn't think it was
that much so my gut reaction is this might be a gcc issue since the RM7000
isn't a common processor.

> Ah, finally someone else got a hold of these things :-)
> Still got mine unused at all.
> Not done much linux at al for the past few years, but always interested
> to see how things might work out for either R5K or RM7K O2's.
>
> Tom
>
>
> Kumba wrote:
>>
>> So I finally managed to get my hands on one of those super-rare RM7000
>> CPU's for the SGI O2, and, as expected, there are some problems.
>>
>> For the most part, the system will boot into userland, but it seems
>> userland isn't at all very happy.  It seems bash is the unhappiest
>> customer so far (or rather, the only userland program I've seen fail
>> repeatedly).  Running the Gentoo init scripts at startup, several
>> scripts will terminate will a variety of messages, from Trace/breakpoint
>> traps, to bus errors to illegal instructions. However, in the init
>> scripts, they happen at specific points; usually when booting our
>> network startup scripts (neth.eth0, net.lo), and usually on an exit()
>> function in the script.  Our emerge process, while python at heart,
>> seems to fail sporadically on the bash sections (parsing the ebuild
>> code) as well.
>>
>> I've got a feeling this is likely a problem in the kernel more than it
>> is a problem in the userland, but the question is how to go about
>> determining which and where.  The RM7K's are pretty rare, so I imagine
>> there's probably a few undiscovered quirks in the code (notably the SC
>> code in arch/mips/mm/sc-rm7k.c).  Not to mention, we can't even use the
>> 1MB tertiary cache these things have.
>>
>> For reference, system info:
>>
>>  > hinv
>>                    System: IP32
>>                 Processor: 350 Mhz RM7000, with FPU
>>      Primary I-cache size: 16 Kbytes
>>      Primary D-cache size: 16 Kbytes
>>      Secondary cache size: 256 Kbytes
>>        Ternary cache size: 1024 Kbytes
>>               Memory size: 512 Mbytes
>>                  Graphics: CRM, Rev C
>>                     Audio: A3 version 1
>>                 SCSI Disk: scsi(0)disk(2)
>>                 SCSI Disk: scsi(0)disk(3)
>>                SCSI CDROM: scsi(0)cdrom(4)
>>
>>
>> # cat /proc/cpuinfo
>> system type             : SGI O2
>> processor               : 0
>> cpu model               : RM7000 V3.3  FPU V2.0
>> BogoMIPS                : 350.20
>> byteorder               : big endian
>> wait instruction        : yes
>> microsecond timers      : yes
>> tlb_entries             : 48
>> extra interrupt vector  : no
>> hardware watchpoint     : no
>> ASEs implemented        :
>> VCED exceptions         : not available
>> VCEI exceptions         : not available
>>
>>
>>
>>
>>
>> And errors (from various points in the execution and multiple reboots):
>>
>>  * Starting eth0
>> /sbin/runscript.sh: line 428:  2475 Illegal instruction     ( function
>> exit ()
>>
>>  * Starting lo
>> /sbin/runscript.sh: line 428:  1464 Illegal instruction     ( function
>> exit ()
>>
>>
>>  * Starting eth0
>> /etc/init.d/net.eth0: line 248:  1650 Bus error               ( u=0;
>> module_load_minimum "${MODULES[i]}" || u=1; if [[ ${u} == 0 ]]; then
>>
>> /sbin/runscript.sh: line 428:  2779 Bus error               ( function
>> exit ()
>> {
>>
>>  * Stopping syslog-ng
>> ...                                                 [ ok ]
>> /lib/rcscripts/sh/rc-services.sh: line 444:  4093 Illegal
>> instruction     ( "/etc/init.d/${service}" stop )
>>
>> /lib/rcscripts/sh/rc-services.sh: line 384:  1095 Trace/breakpoint trap
>> "/etc/init.d/${service}" start
>>
>>
>>
>> So if anyone's got some old rm7k patches sitting around they want
>> tested, or spots where to look/debug options to turn on, let me know.
>> I'll try switching back to an RM5200 and rebuild bash with -g and make
>> sure gdb is installed, them change back to the RM7000 to try and capture
>> some asm call or something that's causing these exit() failures in bash
>> (which seem to be the primary symptom)
>>
>>
>> Cheers,
>>
>>
>> --Kumba
>>
>
>
>


From sknauert@wesleyan.edu Mon Jul  2 14:11:58 2007
Received: with ECARTIS (v1.0.0; list linux-mips); Mon, 02 Jul 2007 14:12:01 +0100 (BST)
Received: from post2.wesleyan.edu ([129.133.6.128]:34729 "EHLO
	post2.wesleyan.edu") by ftp.linux-mips.org with ESMTP
	id S20022726AbXGBNL6 (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Mon, 2 Jul 2007 14:11:58 +0100
Received: from pony1.wesleyan.edu (pony1.wesleyan.edu [129.133.6.192])
	by courier2.wesleyan.edu (8.13.6/8.13.6) with ESMTP id l62D8cT9029208
	for <linux-mips@linux-mips.org>; Mon, 2 Jul 2007 09:08:42 -0400
Received: (from apache@localhost)
	by pony1.wesleyan.edu (8.12.11.20060308/8.12.11/Submit) id l62D8XGg006901;
	Mon, 2 Jul 2007 09:08:33 -0400
Received: from 70.107.91.207
        (SquirrelMail authenticated user sknauert)
        by webmail.wesleyan.edu with HTTP;
        Mon, 2 Jul 2007 09:08:33 -0400 (EDT)
Message-ID: <50447.70.107.91.207.1183381713.squirrel@webmail.wesleyan.edu>
In-Reply-To: <468825BE.6090001@gmx.net>
References: <4687DCE2.8070302@gentoo.org> <468825BE.6090001@gmx.net>
Date:	Mon, 2 Jul 2007 09:08:33 -0400 (EDT)
Subject: Re: O2 RM7000 Issues
From:	sknauert@wesleyan.edu
To:	"Linux MIPS List" <linux-mips@linux-mips.org>
User-Agent: SquirrelMail/1.4.9a
MIME-Version: 1.0
Content-Type: text/plain;charset=UTF-8
Content-Transfer-Encoding: 8bit
X-Priority: 3 (Normal)
Importance: Normal
X-Wesleyan-MailScanner-Information: Please contact the ISP for more information
X-Wesleyan-MailScanner:	Found to be clean
X-Originating-IP: 129.133.6.192
X-MailScanner-From: sknauert@wesleyan.edu
Return-Path: <sknauert@wesleyan.edu>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 15593
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: sknauert@wesleyan.edu
Precedence: bulk
X-list: linux-mips

I have one of the 600 Mhz RM7000s, i.e. no tertiary cache since the module
was originally a 300 Mhz RM5200. However, mine hasn't given any problems
with Debian or Gentoo.

What kernel and target are you compiling for? I'm using 2.6.21.3 compiled
for R5K. All my userspace is compiled for R5K too. I'll compile a new
kernel for RM7000 and see if I have any issue then poke around to see what
kernel code gets changed. I'm not 100% sure, but I didn't think it was
that much so my gut reaction is this might be a gcc issue since the RM7000
isn't a common processor.

> Ah, finally someone else got a hold of these things :-)
> Still got mine unused at all.
> Not done much linux at al for the past few years, but always interested
> to see how things might work out for either R5K or RM7K O2's.
>
> Tom
>
>
> Kumba wrote:
>>
>> So I finally managed to get my hands on one of those super-rare RM7000
>> CPU's for the SGI O2, and, as expected, there are some problems.
>>
>> For the most part, the system will boot into userland, but it seems
>> userland isn't at all very happy.  It seems bash is the unhappiest
>> customer so far (or rather, the only userland program I've seen fail
>> repeatedly).  Running the Gentoo init scripts at startup, several
>> scripts will terminate will a variety of messages, from Trace/breakpoint
>> traps, to bus errors to illegal instructions. However, in the init
>> scripts, they happen at specific points; usually when booting our
>> network startup scripts (neth.eth0, net.lo), and usually on an exit()
>> function in the script.  Our emerge process, while python at heart,
>> seems to fail sporadically on the bash sections (parsing the ebuild
>> code) as well.
>>
>> I've got a feeling this is likely a problem in the kernel more than it
>> is a problem in the userland, but the question is how to go about
>> determining which and where.  The RM7K's are pretty rare, so I imagine
>> there's probably a few undiscovered quirks in the code (notably the SC
>> code in arch/mips/mm/sc-rm7k.c).  Not to mention, we can't even use the
>> 1MB tertiary cache these things have.
>>
>> For reference, system info:
>>
>>  > hinv
>>                    System: IP32
>>                 Processor: 350 Mhz RM7000, with FPU
>>      Primary I-cache size: 16 Kbytes
>>      Primary D-cache size: 16 Kbytes
>>      Secondary cache size: 256 Kbytes
>>        Ternary cache size: 1024 Kbytes
>>               Memory size: 512 Mbytes
>>                  Graphics: CRM, Rev C
>>                     Audio: A3 version 1
>>                 SCSI Disk: scsi(0)disk(2)
>>                 SCSI Disk: scsi(0)disk(3)
>>                SCSI CDROM: scsi(0)cdrom(4)
>>
>>
>> # cat /proc/cpuinfo
>> system type             : SGI O2
>> processor               : 0
>> cpu model               : RM7000 V3.3  FPU V2.0
>> BogoMIPS                : 350.20
>> byteorder               : big endian
>> wait instruction        : yes
>> microsecond timers      : yes
>> tlb_entries             : 48
>> extra interrupt vector  : no
>> hardware watchpoint     : no
>> ASEs implemented        :
>> VCED exceptions         : not available
>> VCEI exceptions         : not available
>>
>>
>>
>>
>>
>> And errors (from various points in the execution and multiple reboots):
>>
>>  * Starting eth0
>> /sbin/runscript.sh: line 428:  2475 Illegal instruction     ( function
>> exit ()
>>
>>  * Starting lo
>> /sbin/runscript.sh: line 428:  1464 Illegal instruction     ( function
>> exit ()
>>
>>
>>  * Starting eth0
>> /etc/init.d/net.eth0: line 248:  1650 Bus error               ( u=0;
>> module_load_minimum "${MODULES[i]}" || u=1; if [[ ${u} == 0 ]]; then
>>
>> /sbin/runscript.sh: line 428:  2779 Bus error               ( function
>> exit ()
>> {
>>
>>  * Stopping syslog-ng
>> ...                                                 [ ok ]
>> /lib/rcscripts/sh/rc-services.sh: line 444:  4093 Illegal
>> instruction     ( "/etc/init.d/${service}" stop )
>>
>> /lib/rcscripts/sh/rc-services.sh: line 384:  1095 Trace/breakpoint trap
>> "/etc/init.d/${service}" start
>>
>>
>>
>> So if anyone's got some old rm7k patches sitting around they want
>> tested, or spots where to look/debug options to turn on, let me know.
>> I'll try switching back to an RM5200 and rebuild bash with -g and make
>> sure gdb is installed, them change back to the RM7000 to try and capture
>> some asm call or something that's causing these exit() failures in bash
>> (which seem to be the primary symptom)
>>
>>
>> Cheers,
>>
>>
>> --Kumba
>>
>
>
>


From anemo@mba.ocn.ne.jp Mon Jul  2 14:42:24 2007
Received: with ECARTIS (v1.0.0; list linux-mips); Mon, 02 Jul 2007 14:42:26 +0100 (BST)
Received: from mba.ocn.ne.jp ([122.1.175.29]:17864 "HELO smtp.mba.ocn.ne.jp")
	by ftp.linux-mips.org with SMTP id S20022856AbXGBNmY (ORCPT
	<rfc822;linux-mips@linux-mips.org>); Mon, 2 Jul 2007 14:42:24 +0100
Received: from localhost (p4019-ipad24funabasi.chiba.ocn.ne.jp [220.104.82.19])
	by smtp.mba.ocn.ne.jp (Postfix) with ESMTP
	id 67653A3A1; Mon,  2 Jul 2007 22:42:18 +0900 (JST)
Date:	Mon, 02 Jul 2007 22:43:06 +0900 (JST)
Message-Id: <20070702.224306.59464033.anemo@mba.ocn.ne.jp>
To:	linux-mips@linux-mips.org
Cc:	ralf@linux-mips.org, sshtylyov@ru.mvista.com, mlachwani@mvista.com,
	jeff@garzik.org
Subject: Re: [PATCH] rbtx4938: Fix secondary PCIC and glue internal NICs
From:	Atsushi Nemoto <anemo@mba.ocn.ne.jp>
In-Reply-To: <20070629.223501.93206611.anemo@mba.ocn.ne.jp>
References: <20070629.223501.93206611.anemo@mba.ocn.ne.jp>
X-Fingerprint: 6ACA 1623 39BD 9A94 9B1A  B746 CA77 FE94 2874 D52F
X-Pgp-Public-Key: http://wwwkeys.pgp.net/pks/lookup?op=get&search=0x2874D52F
X-Mailer: Mew version 5.2 on Emacs 21.4 / Mule 5.0 (SAKAKI)
Mime-Version: 1.0
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Return-Path: <anemo@mba.ocn.ne.jp>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 15594
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: anemo@mba.ocn.ne.jp
Precedence: bulk
X-list: linux-mips

On Fri, 29 Jun 2007 22:35:01 +0900 (JST), Atsushi Nemoto <anemo@mba.ocn.ne.jp> wrote:
> * Use platform_device to provide ethernet addresses for internal NICs.

Oops, a calculation of checksum was wrong --- revised.


Subject: [PATCH] rbtx4938: Fix secondary PCIC and glue internal NICs

* Fix pci ops for secondary PCIC
* Do not reserve 1MB for PCI MEM region (leave PCIBIOS_MIN_MEM zero)
* Use platform_device to provide ethernet addresses for internal NICs.
  (background: TX49XX SoCs include PCI NIC (TC35815 compatible)
  connected via its internal PCI bus, but the NIC's PROM interface is
  not connected to SEEPROM.  So we must provide its ethernet address
  by another way.)
* Check return value of early_read_config_word()

Signed-off-by: Atsushi Nemoto <anemo@mba.ocn.ne.jp>
---
A driver side of this patch is:
"[PATCH] tc35815: Load MAC address via platform_device"

 arch/mips/pci/ops-tx4938.c                |   80 +++++++++++++++++-----------
 arch/mips/tx4938/toshiba_rbtx4938/setup.c |   53 ++++++++-----------
 2 files changed, 70 insertions(+), 63 deletions(-)

diff --git a/arch/mips/pci/ops-tx4938.c b/arch/mips/pci/ops-tx4938.c
index 4450070..a450c40 100644
--- a/arch/mips/pci/ops-tx4938.c
+++ b/arch/mips/pci/ops-tx4938.c
@@ -46,50 +46,63 @@ struct resource tx4938_pcic1_pci_mem_resource = {
 	.flags	= IORESOURCE_MEM
 };
 
-static int mkaddr(int bus, int dev_fn, int where, int *flagsp)
+static int mkaddr(int bus, int dev_fn, int where,
+		  struct tx4938_pcic_reg *pcicptr)
 {
 	if (bus > 0) {
 		/* Type 1 configuration */
-		tx4938_pcicptr->g2pcfgadrs = ((bus & 0xff) << 0x10) |
+		pcicptr->g2pcfgadrs = ((bus & 0xff) << 0x10) |
 		    ((dev_fn & 0xff) << 0x08) | (where & 0xfc) | 1;
 	} else {
 		if (dev_fn >= PCI_DEVFN(TX4938_PCIC_MAX_DEVNU, 0))
 			return -1;
 
 		/* Type 0 configuration */
-		tx4938_pcicptr->g2pcfgadrs = ((bus & 0xff) << 0x10) |
+		pcicptr->g2pcfgadrs = ((bus & 0xff) << 0x10) |
 		    ((dev_fn & 0xff) << 0x08) | (where & 0xfc);
 	}
 	/* clear M_ABORT and Disable M_ABORT Int. */
-	tx4938_pcicptr->pcistatus =
-	    (tx4938_pcicptr->pcistatus & 0x0000ffff) |
+	pcicptr->pcistatus =
+	    (pcicptr->pcistatus & 0x0000ffff) |
 	    (PCI_STATUS_REC_MASTER_ABORT << 16);
-	tx4938_pcicptr->pcimask &= ~PCI_STATUS_REC_MASTER_ABORT;
+	pcicptr->pcimask &= ~PCI_STATUS_REC_MASTER_ABORT;
 
 	return 0;
 }
 
-static int check_abort(int flags)
+static int check_abort(struct tx4938_pcic_reg *pcicptr)
 {
 	int code = PCIBIOS_SUCCESSFUL;
 	/* wait write cycle completion before checking error status */
-	while (tx4938_pcicptr->pcicstatus & TX4938_PCIC_PCICSTATUS_IWB)
+	while (pcicptr->pcicstatus & TX4938_PCIC_PCICSTATUS_IWB)
 				;
-	if (tx4938_pcicptr->pcistatus & (PCI_STATUS_REC_MASTER_ABORT << 16)) {
-		tx4938_pcicptr->pcistatus =
-		    (tx4938_pcicptr->
+	if (pcicptr->pcistatus & (PCI_STATUS_REC_MASTER_ABORT << 16)) {
+		pcicptr->pcistatus =
+		    (pcicptr->
 		     pcistatus & 0x0000ffff) | (PCI_STATUS_REC_MASTER_ABORT
 						<< 16);
-		tx4938_pcicptr->pcimask |= PCI_STATUS_REC_MASTER_ABORT;
+		pcicptr->pcimask |= PCI_STATUS_REC_MASTER_ABORT;
 		code = PCIBIOS_DEVICE_NOT_FOUND;
 	}
 	return code;
 }
 
+extern struct pci_controller tx4938_pci_controller[];
+extern struct tx4938_pcic_reg *get_tx4938_pcicptr(int ch);
+
+static struct tx4938_pcic_reg *pci_bus_to_pcicptr(struct pci_bus *bus)
+{
+	struct pci_controller *channel = bus->sysdata;
+	return get_tx4938_pcicptr(channel - &tx4938_pci_controller[0]);
+}
+
 static int tx4938_pcibios_read_config(struct pci_bus *bus, unsigned int devfn,
 					int where, int size, u32 * val)
 {
-	int flags, retval, dev, busno, func;
+	int retval, dev, busno, func;
+	struct tx4938_pcic_reg *pcicptr = pci_bus_to_pcicptr(bus);
+	void __iomem *cfgdata =
+		(void __iomem *)(unsigned long)&pcicptr->g2pcfgdata;
 
 	dev = PCI_SLOT(devfn);
 	func = PCI_FUNC(devfn);
@@ -101,32 +114,32 @@ static int tx4938_pcibios_read_config(struct pci_bus *bus, unsigned int devfn,
 		busno = 0;
 	}
 
-	if (mkaddr(busno, devfn, where, &flags))
+	if (mkaddr(busno, devfn, where, pcicptr))
 		return -1;
 
 	switch (size) {
 	case 1:
-		*val = *(volatile u8 *) ((unsigned long) & tx4938_pcicptr->g2pcfgdata |
 #ifdef __BIG_ENDIAN
-			      ((where & 3) ^ 3));
+		cfgdata += (where & 3) ^ 3;
 #else
-			      (where & 3));
+		cfgdata += where & 3;
 #endif
+		*val = __raw_readb(cfgdata);
 		break;
 	case 2:
-		*val = *(volatile u16 *) ((unsigned long) & tx4938_pcicptr->g2pcfgdata |
 #ifdef __BIG_ENDIAN
-				((where & 3) ^ 2));
+		cfgdata += (where & 2) ^ 2;
 #else
-				(where & 3));
+		cfgdata += where & 2;
 #endif
+		*val = __raw_readw(cfgdata);
 		break;
 	case 4:
-		*val = tx4938_pcicptr->g2pcfgdata;
+		*val = __raw_readl(cfgdata);
 		break;
 	}
 
-	retval = check_abort(flags);
+	retval = check_abort(pcicptr);
 	if (retval == PCIBIOS_DEVICE_NOT_FOUND)
 		*val = 0xffffffff;
 
@@ -136,7 +149,10 @@ static int tx4938_pcibios_read_config(struct pci_bus *bus, unsigned int devfn,
 static int tx4938_pcibios_write_config(struct pci_bus *bus, unsigned int devfn, int where,
 						int size, u32 val)
 {
-	int flags, dev, busno, func;
+	int dev, busno, func;
+	struct tx4938_pcic_reg *pcicptr = pci_bus_to_pcicptr(bus);
+	void __iomem *cfgdata =
+		(void __iomem *)(unsigned long)&pcicptr->g2pcfgdata;
 
 	busno = bus->number;
 	dev = PCI_SLOT(devfn);
@@ -149,32 +165,32 @@ static int tx4938_pcibios_write_config(struct pci_bus *bus, unsigned int devfn,
 		busno = 0;
 	}
 
-	if (mkaddr(busno, devfn, where, &flags))
+	if (mkaddr(busno, devfn, where, pcicptr))
 		return -1;
 
 	switch (size) {
 	case 1:
-		*(volatile u8 *) ((unsigned long) & tx4938_pcicptr->g2pcfgdata |
 #ifdef __BIG_ENDIAN
-			  ((where & 3) ^ 3)) = val;
+		cfgdata += (where & 3) ^ 3;
 #else
-			  (where & 3)) = val;
+		cfgdata += where & 3;
 #endif
+		__raw_writeb(val, cfgdata);
 		break;
 	case 2:
-		*(volatile u16 *) ((unsigned long) & tx4938_pcicptr->g2pcfgdata |
 #ifdef __BIG_ENDIAN
-			((where & 0x3) ^ 0x2)) = val;
+		cfgdata += (where & 2) ^ 2;
 #else
-			(where & 3)) = val;
+		cfgdata += where & 2;
 #endif
+		__raw_writew(val, cfgdata);
 		break;
 	case 4:
-		tx4938_pcicptr->g2pcfgdata = val;
+		__raw_writel(val, cfgdata);
 		break;
 	}
 
-	return check_abort(flags);
+	return check_abort(pcicptr);
 }
 
 struct pci_ops tx4938_pci_ops = {
diff --git a/arch/mips/tx4938/toshiba_rbtx4938/setup.c b/arch/mips/tx4938/toshiba_rbtx4938/setup.c
index 361d89a..6ed39a5 100644
--- a/arch/mips/tx4938/toshiba_rbtx4938/setup.c
+++ b/arch/mips/tx4938/toshiba_rbtx4938/setup.c
@@ -352,7 +352,7 @@ static struct pci_dev *fake_pci_dev(struct pci_controller *hose,
 	static struct pci_dev dev;
 	static struct pci_bus bus;
 
-	dev.sysdata = (void *)hose;
+	dev.sysdata = bus.sysdata = hose;
 	dev.devfn = devfn;
 	bus.number = busnr;
 	bus.ops = hose->pci_ops;
@@ -385,8 +385,10 @@ int txboard_pci66_check(struct pci_controller *hose, int top_bus, int current_bu
 	printk("PCI: Checking 66MHz capabilities...\n");
 
 	for (pci_devfn=devfn_start; pci_devfn<devfn_stop; pci_devfn++) {
-		early_read_config_word(hose, top_bus, current_bus, pci_devfn,
-				       PCI_VENDOR_ID, &vid);
+		if (early_read_config_word(hose, top_bus, current_bus,
+					   pci_devfn, PCI_VENDOR_ID,
+					   &vid) != PCIBIOS_SUCCESSFUL)
+			continue;
 
 		if (vid == 0xffff) continue;
 
@@ -463,7 +465,6 @@ static int __init tx4938_pcibios_init(void)
 	int extarb = !(tx4938_ccfgptr->ccfg & TX4938_CCFG_PCIXARB);
 
 	PCIBIOS_MIN_IO = 0x00001000UL;
-	PCIBIOS_MIN_MEM = 0x01000000UL;
 
 	mem_base[0] = txboard_request_phys_region_shrink(&mem_size[0]);
 	io_base[0] = txboard_request_phys_region_shrink(&io_size[0]);
@@ -578,18 +579,17 @@ arch_initcall(tx4938_pcibios_init);
 #define	SRTC_CS	2	/* IOC */
 
 #ifdef CONFIG_PCI
-static unsigned char rbtx4938_ethaddr[17];
 static int __init rbtx4938_ethaddr_init(void)
 {
+	unsigned char dat[17];
 	unsigned char sum;
 	int i;
 
 	/* 0-3: "MAC\0", 4-9:eth0, 10-15:eth1, 16:sum */
-	if (spi_eeprom_read(SEEPROM1_CS, 0,
-			    rbtx4938_ethaddr, sizeof(rbtx4938_ethaddr)))
+	if (spi_eeprom_read(SEEPROM1_CS, 0, dat, sizeof(dat))) {
 		printk(KERN_ERR "seeprom: read error.\n");
-	else {
-		unsigned char *dat = rbtx4938_ethaddr;
+		return -ENODEV;
+	} else {
 		if (strcmp(dat, "MAC") != 0)
 			printk(KERN_WARNING "seeprom: bad signature.\n");
 		for (i = 0, sum = 0; i < sizeof(dat); i++)
@@ -597,31 +597,22 @@ static int __init rbtx4938_ethaddr_init(void)
 		if (sum)
 			printk(KERN_WARNING "seeprom: bad checksum.\n");
 	}
-	return 0;
-}
-device_initcall(rbtx4938_ethaddr_init);
-
-int rbtx4938_get_tx4938_ethaddr(struct pci_dev *dev, unsigned char *addr)
-{
-	struct pci_controller *channel = (struct pci_controller *)dev->bus->sysdata;
-	int ch = 0;
-
-	if (channel != &tx4938_pci_controller[1])
-		return -ENODEV;
-	/* TX4938 PCIC1 */
-	switch (PCI_SLOT(dev->devfn)) {
-	case TX4938_PCIC_IDSEL_AD_TO_SLOT(31):
-		ch = 0;
-		break;
-	case TX4938_PCIC_IDSEL_AD_TO_SLOT(30):
-		ch = 1;
-		break;
-	default:
-		return -ENODEV;
+	for (i = 0; i < 2; i++) {
+		unsigned int slot = TX4938_PCIC_IDSEL_AD_TO_SLOT(31 - i);
+		unsigned int id = (1 << 8) | PCI_DEVFN(slot, 0); /* bus 1 */
+		struct platform_device *pdev;
+		if (!(tx4938_ccfgptr->pcfg &
+		      (i ? TX4938_PCFG_ETH1_SEL : TX4938_PCFG_ETH0_SEL)))
+			continue;
+		pdev = platform_device_alloc("tc35815-mac", id);
+		if (!pdev ||
+		    platform_device_add_data(pdev, &dat[4 + 6 * i], 6) ||
+		    platform_device_add(pdev))
+			platform_device_put(pdev);
 	}
-	memcpy(addr, &rbtx4938_ethaddr[4 + 6 * ch], 6);
 	return 0;
 }
+device_initcall(rbtx4938_ethaddr_init);
 #endif /* CONFIG_PCI */
 
 static void __init rbtx4938_spi_setup(void)

From anemo@mba.ocn.ne.jp Mon Jul  2 15:01:22 2007
Received: with ECARTIS (v1.0.0; list linux-mips); Mon, 02 Jul 2007 15:01:24 +0100 (BST)
Received: from mba.ocn.ne.jp ([122.1.175.29]:15333 "HELO smtp.mba.ocn.ne.jp")
	by ftp.linux-mips.org with SMTP id S20022859AbXGBOBW (ORCPT
	<rfc822;linux-mips@linux-mips.org>); Mon, 2 Jul 2007 15:01:22 +0100
Received: from localhost (p4019-ipad24funabasi.chiba.ocn.ne.jp [220.104.82.19])
	by smtp.mba.ocn.ne.jp (Postfix) with ESMTP
	id D7507B73C; Mon,  2 Jul 2007 23:00:01 +0900 (JST)
Date:	Mon, 02 Jul 2007 23:00:50 +0900 (JST)
Message-Id: <20070702.230050.59033318.anemo@mba.ocn.ne.jp>
To:	david-b@pacbell.net
Cc:	linux-mips@linux-mips.org, ralf@linux-mips.org,
	sshtylyov@ru.mvista.com, mlachwani@mvista.com,
	spi-devel-general@lists.sourceforge.net
Subject: Re: [PATCH] TXx9 SPI controller driver (take 2)
From:	Atsushi Nemoto <anemo@mba.ocn.ne.jp>
In-Reply-To: <200706300953.20156.david-b@pacbell.net>
References: <20070627.222458.27955527.anemo@mba.ocn.ne.jp>
	<200706300953.20156.david-b@pacbell.net>
X-Fingerprint: 6ACA 1623 39BD 9A94 9B1A  B746 CA77 FE94 2874 D52F
X-Pgp-Public-Key: http://wwwkeys.pgp.net/pks/lookup?op=get&search=0x2874D52F
X-Mailer: Mew version 5.2 on Emacs 21.4 / Mule 5.0 (SAKAKI)
Mime-Version: 1.0
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Return-Path: <anemo@mba.ocn.ne.jp>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 15595
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: anemo@mba.ocn.ne.jp
Precedence: bulk
X-list: linux-mips

On Sat, 30 Jun 2007 09:53:19 -0700, David Brownell <david-b@pacbell.net> wrote:
> > +	txx9spi_cs_func(spi, c, 0, 1000000000 / 2 / spi->max_speed_hz);
> 
> You still use this confusing A/2/B syntax.  Please
> rewrite that using one "/" and one "*".  (And there
> is similar usage elsewhere.)

Replaced with "(NSEC_PER_SEC / 2) / spi->max_speed_hz".

> These checks here should be in txx9_spi_transfer(), where
> returning EINVAL will do some good.  The single caller to
> this routine doesn't even look at its return value ... and
> returning without issuing the message's completion callback
> is just a bug.

Oh it was really a bug.  Fixed.

> That speed check is wrong.  There's no reason two transfers
> shouldn't have different speeds ... e.g. flash chips often
> have speed limits in certain bulk reads, which don't apply
> to other operations.

Done.

> Also, you can't replace per-transfer speed checks with one
> for the overall message... each transfer could have a
> very different speed.

Done.  Now per-transfer speed_hz and bits_per_word are really supported.

> Here's where the (corrected) checks for each spi_transfer in the
> message belong:  if the message is invalid, don't even queue it,
> just return -EINVAL.

Done.

> > +	if (clk_enable(c->clk)) {
> 
> Minor comment:  if power management is a concern, you might
> consider leaving the clock disabled except when transfers
> are active or you're accessing controller registers.  On
> most chips, leaving a clock enabled all the time (like this)
> means power is needlessly consumed.  (This isn't wrong, just
> sub-optimal in terms of power reduction.)

Well, I did not change this since we can not really stop the
"spi-baseclk" anyway.  But thank you for comment.

> > +	master->num_chipselect = 0;	/* unlimited: any GPIO numbers */
> 
> No, actually it means "no chipselects" as I said before;
> the fact that this works right now is a bug that will be
> fixed at some point.  INT_MAX would allow any GPIO.

Done.  I chose "(u16)INT_MAX" to silence a sparse warning.

> ... almost mergeable!

Let's go take3 !

---
Atsushi Nemoto

From anemo@mba.ocn.ne.jp Mon Jul  2 15:02:42 2007
Received: with ECARTIS (v1.0.0; list linux-mips); Mon, 02 Jul 2007 15:02:44 +0100 (BST)
Received: from mba.ocn.ne.jp ([122.1.175.29]:3265 "HELO smtp.mba.ocn.ne.jp")
	by ftp.linux-mips.org with SMTP id S28573705AbXGBOCm (ORCPT
	<rfc822;linux-mips@linux-mips.org>); Mon, 2 Jul 2007 15:02:42 +0100
Received: from localhost (p4019-ipad24funabasi.chiba.ocn.ne.jp [220.104.82.19])
	by smtp.mba.ocn.ne.jp (Postfix) with ESMTP
	id DA940A369; Mon,  2 Jul 2007 23:01:21 +0900 (JST)
Date:	Mon, 02 Jul 2007 23:02:10 +0900 (JST)
Message-Id: <20070702.230210.130241293.anemo@mba.ocn.ne.jp>
To:	linux-mips@linux-mips.org
Cc:	ralf@linux-mips.org, sshtylyov@ru.mvista.com, mlachwani@mvista.com,
	david-b@pacbell.net, spi-devel-general@lists.sourceforge.net
Subject: [PATCH] TXx9 SPI controller driver (take 3)
From:	Atsushi Nemoto <anemo@mba.ocn.ne.jp>
X-Fingerprint: 6ACA 1623 39BD 9A94 9B1A  B746 CA77 FE94 2874 D52F
X-Pgp-Public-Key: http://wwwkeys.pgp.net/pks/lookup?op=get&search=0x2874D52F
X-Mailer: Mew version 5.2 on Emacs 21.4 / Mule 5.0 (SAKAKI)
Mime-Version: 1.0
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Return-Path: <anemo@mba.ocn.ne.jp>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 15596
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: anemo@mba.ocn.ne.jp
Precedence: bulk
X-list: linux-mips

This is a driver for SPI controller built into TXx9 MIPS SoCs.
This driver is derived from arch/mips/tx4938/toshiba_rbtx4938/spi_txx9.c.

Signed-off-by: Atsushi Nemoto <anemo@mba.ocn.ne.jp>
---
Changes from previous version:

* Support per-transfer bits_per_word and speed_hz.
* Check per-transfer parameters before queueing.
* Fix num_chipselect.

 drivers/spi/Kconfig    |    6 +
 drivers/spi/Makefile   |    1 +
 drivers/spi/spi_txx9.c |  472 ++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 479 insertions(+), 0 deletions(-)

diff --git a/drivers/spi/Kconfig b/drivers/spi/Kconfig
index 5e3f748..36911b6 100644
--- a/drivers/spi/Kconfig
+++ b/drivers/spi/Kconfig
@@ -156,6 +156,12 @@ config SPI_S3C24XX_GPIO
 	  GPIO lines to provide the SPI bus. This can be used where
 	  the inbuilt hardware cannot provide the transfer mode, or
 	  where the board is using non hardware connected pins.
+
+config SPI_TXX9
+	tristate "Toshiba TXx9 SPI controller"
+	depends on SPI_MASTER && GENERIC_GPIO && CPU_TX49XX
+	help
+	  SPI driver for Toshiba TXx9 MIPS SoCs
 #
 # Add new SPI master controllers in alphabetical order above this line
 #
diff --git a/drivers/spi/Makefile b/drivers/spi/Makefile
index 5788d86..7869eb5 100644
--- a/drivers/spi/Makefile
+++ b/drivers/spi/Makefile
@@ -23,6 +23,7 @@ obj-$(CONFIG_SPI_MPC52xx_PSC)		+= mpc52xx_psc_spi.o
 obj-$(CONFIG_SPI_MPC83xx)		+= spi_mpc83xx.o
 obj-$(CONFIG_SPI_S3C24XX_GPIO)		+= spi_s3c24xx_gpio.o
 obj-$(CONFIG_SPI_S3C24XX)		+= spi_s3c24xx.o
+obj-$(CONFIG_SPI_TXX9)			+= spi_txx9.o
 # 	... add above this line ...
 
 # SPI protocol drivers (device/link on bus)
diff --git a/drivers/spi/spi_txx9.c b/drivers/spi/spi_txx9.c
new file mode 100644
index 0000000..35e7de5
--- /dev/null
+++ b/drivers/spi/spi_txx9.c
@@ -0,0 +1,472 @@
+/*
+ * spi_txx9.c - TXx9 SPI controller driver.
+ *
+ * Based on linux/arch/mips/tx4938/toshiba_rbtx4938/spi_txx9.c
+ * Copyright (C) 2000-2001 Toshiba Corporation
+ *
+ * 2003-2005 (c) MontaVista Software, Inc. This file is licensed under the
+ * terms of the GNU General Public License version 2. This program is
+ * licensed "as is" without any warranty of any kind, whether express
+ * or implied.
+ *
+ * Support for TX4938 in 2.6 - Manish Lachwani (mlachwani@mvista.com)
+ *
+ * Convert to generic SPI framework - Atsushi Nemoto (anemo@mba.ocn.ne.jp)
+ */
+#include <linux/init.h>
+#include <linux/delay.h>
+#include <linux/errno.h>
+#include <linux/interrupt.h>
+#include <linux/platform_device.h>
+#include <linux/sched.h>
+#include <linux/spinlock.h>
+#include <linux/workqueue.h>
+#include <linux/spi/spi.h>
+#include <linux/err.h>
+#include <linux/clk.h>
+#include <asm/gpio.h>
+
+
+#define SPI_FIFO_SIZE 4
+
+#define TXx9_SPMCR		0x00
+#define TXx9_SPCR0		0x04
+#define TXx9_SPCR1		0x08
+#define TXx9_SPFS		0x0c
+#define TXx9_SPSR		0x14
+#define TXx9_SPDR		0x18
+
+/* SPMCR : SPI Master Control */
+#define TXx9_SPMCR_OPMODE	0xc0
+#define TXx9_SPMCR_CONFIG	0x40
+#define TXx9_SPMCR_ACTIVE	0x80
+#define TXx9_SPMCR_SPSTP	0x02
+#define TXx9_SPMCR_BCLR		0x01
+
+/* SPCR0 : SPI Control 0 */
+#define TXx9_SPCR0_TXIFL_MASK	0xc000
+#define TXx9_SPCR0_RXIFL_MASK	0x3000
+#define TXx9_SPCR0_SIDIE	0x0800
+#define TXx9_SPCR0_SOEIE	0x0400
+#define TXx9_SPCR0_RBSIE	0x0200
+#define TXx9_SPCR0_TBSIE	0x0100
+#define TXx9_SPCR0_IFSPSE	0x0010
+#define TXx9_SPCR0_SBOS		0x0004
+#define TXx9_SPCR0_SPHA		0x0002
+#define TXx9_SPCR0_SPOL		0x0001
+
+/* SPSR : SPI Status */
+#define TXx9_SPSR_TBSI		0x8000
+#define TXx9_SPSR_RBSI		0x4000
+#define TXx9_SPSR_TBS_MASK	0x3800
+#define TXx9_SPSR_RBS_MASK	0x0700
+#define TXx9_SPSR_SPOE		0x0080
+#define TXx9_SPSR_IFSD		0x0008
+#define TXx9_SPSR_SIDLE		0x0004
+#define TXx9_SPSR_STRDY		0x0002
+#define TXx9_SPSR_SRRDY		0x0001
+
+
+struct txx9spi {
+	struct workqueue_struct	*workqueue;
+	struct work_struct work;
+	spinlock_t lock;	/* protect 'queue' */
+	struct list_head queue;
+	wait_queue_head_t waitq;
+	void __iomem *membase;
+	int irq;
+	int baseclk;
+	struct clk *clk;
+	u32 max_speed_hz, min_speed_hz;
+	int last_chipselect;
+	int last_chipselect_val;
+};
+
+static u32 txx9spi_rd(struct txx9spi *c, int reg)
+{
+	return __raw_readl(c->membase + reg);
+}
+static void txx9spi_wr(struct txx9spi *c, u32 val, int reg)
+{
+	__raw_writel(val, c->membase + reg);
+}
+
+static void txx9spi_cs_func(struct spi_device *spi, struct txx9spi *c,
+			    int on, unsigned int cs_delay)
+{
+	int val = (spi->mode & SPI_CS_HIGH) ? on : !on;
+	if (on) {
+		/* deselect the chip with cs_change hint in last transfer */
+		if (c->last_chipselect >= 0)
+			gpio_set_value(c->last_chipselect,
+				       !c->last_chipselect_val);
+		c->last_chipselect = spi->chip_select;
+		c->last_chipselect_val = val;
+	} else {
+		c->last_chipselect = -1;
+		ndelay(cs_delay);	/* CS Hold Time */
+	}
+	gpio_set_value(spi->chip_select, val);
+	ndelay(cs_delay);	/* CS Setup Time / CS Recovery Time */
+}
+
+/* the spi->mode bits understood by this driver: */
+#define MODEBITS	(SPI_CS_HIGH|SPI_CPOL|SPI_CPHA)
+
+static int txx9spi_setup(struct spi_device *spi)
+{
+	struct txx9spi *c = spi_master_get_devdata(spi->master);
+	u8 bits_per_word;
+
+	if (spi->mode & ~MODEBITS)
+		return -EINVAL;
+
+	if (!spi->max_speed_hz ||
+	    spi->max_speed_hz > c->max_speed_hz ||
+	    spi->max_speed_hz < c->min_speed_hz)
+		return -EINVAL;
+
+	bits_per_word = spi->bits_per_word ?: 8;
+	if (bits_per_word != 8 && bits_per_word != 16)
+		return -EINVAL;
+
+	if (gpio_direction_output(spi->chip_select,
+				  !(spi->mode & SPI_CS_HIGH))) {
+		dev_err(&spi->dev, "Cannot setup GPIO for chipselect.\n");
+		return -EINVAL;
+	}
+
+	/* deselect chip */
+	spin_lock(&c->lock);
+	txx9spi_cs_func(spi, c, 0, (NSEC_PER_SEC / 2) / spi->max_speed_hz);
+	spin_unlock(&c->lock);
+
+	return 0;
+}
+
+static irqreturn_t txx9spi_interrupt(int irq, void *dev_id)
+{
+	struct txx9spi *c = dev_id;
+
+	/* disable rx intr */
+	txx9spi_wr(c, txx9spi_rd(c, TXx9_SPCR0) & ~TXx9_SPCR0_RBSIE,
+		   TXx9_SPCR0);
+	wake_up(&c->waitq);
+	return IRQ_HANDLED;
+}
+
+static void txx9spi_work_one(struct txx9spi *c, struct spi_message *m)
+{
+	struct spi_device *spi = m->spi;
+	struct spi_transfer *t;
+	unsigned int cs_delay;
+	unsigned int cs_change = 1;
+	int status = 0;
+	u32 mcr;
+	u32 prev_speed_hz = 0;
+	u8 prev_bits_per_word = 0;
+
+	/* CS setup/hold/recovery time in nsec */
+	cs_delay = 100 + (NSEC_PER_SEC / 2) / spi->max_speed_hz;
+
+	mcr = txx9spi_rd(c, TXx9_SPMCR);
+	if (unlikely((mcr & TXx9_SPMCR_OPMODE) == TXx9_SPMCR_ACTIVE)) {
+		dev_err(&spi->dev, "Bad mode.\n");
+		status = -EIO;
+		goto exit;
+	}
+	mcr &= ~(TXx9_SPMCR_OPMODE | TXx9_SPMCR_SPSTP | TXx9_SPMCR_BCLR);
+
+	/* enter config mode */
+	txx9spi_wr(c, mcr | TXx9_SPMCR_CONFIG | TXx9_SPMCR_BCLR, TXx9_SPMCR);
+	txx9spi_wr(c, TXx9_SPCR0_SBOS |
+		   ((spi->mode & SPI_CPOL) ? TXx9_SPCR0_SPOL : 0) |
+		   ((spi->mode & SPI_CPHA) ? TXx9_SPCR0_SPHA : 0) |
+		   0x08,
+		   TXx9_SPCR0);
+
+	list_for_each_entry (t, &m->transfers, transfer_list) {
+		const void *txbuf = t->tx_buf;
+		void *rxbuf = t->rx_buf;
+		u32 data;
+		unsigned int len = t->len;
+		unsigned int wsize;
+		u32 speed_hz = t->speed_hz ?: spi->max_speed_hz;
+		u8 bits_per_word = t->bits_per_word ?: spi->bits_per_word;
+		bits_per_word = bits_per_word ?: 8;
+		wsize = bits_per_word >> 3; /* in bytes */
+
+		if (prev_speed_hz != speed_hz ||
+		    prev_bits_per_word != bits_per_word) {
+			u32 n = (c->baseclk + speed_hz - 1) / speed_hz;
+			if (n < 1)
+				n = 1;
+			else if (n > 0xff)
+				n = 0xff;
+			/* enter config mode */
+			txx9spi_wr(c, mcr |
+				   TXx9_SPMCR_CONFIG | TXx9_SPMCR_BCLR,
+				   TXx9_SPMCR);
+			txx9spi_wr(c, (n << 8) | bits_per_word, TXx9_SPCR1);
+			/* enter active mode */
+			txx9spi_wr(c, mcr | TXx9_SPMCR_ACTIVE, TXx9_SPMCR);
+
+			prev_speed_hz = speed_hz;
+			prev_bits_per_word = bits_per_word;
+		}
+
+		if (cs_change)
+			txx9spi_cs_func(spi, c, 1, cs_delay);
+		cs_change = t->cs_change;
+		while (len) {
+			unsigned int count = SPI_FIFO_SIZE;
+			int i;
+			u32 cr0;
+			if (len < count * wsize)
+				count = len / wsize;
+			/* now tx must be idle... */
+			while (!(txx9spi_rd(c, TXx9_SPSR) & TXx9_SPSR_SIDLE))
+				cpu_relax();
+			cr0 = txx9spi_rd(c, TXx9_SPCR0);
+			cr0 &= ~TXx9_SPCR0_RXIFL_MASK;
+			cr0 |= (count - 1) << 12;
+			/* enable rx intr */
+			cr0 |= TXx9_SPCR0_RBSIE;
+			txx9spi_wr(c, cr0, TXx9_SPCR0);
+			/* send */
+			for (i = 0; i < count; i++) {
+				if (txbuf) {
+					data = wsize == 1 ?
+						*(const u8 *)txbuf :
+						*(const u16 *)txbuf;
+					txx9spi_wr(c, data, TXx9_SPDR);
+					txbuf += wsize;
+				} else
+					txx9spi_wr(c, 0, TXx9_SPDR);
+			}
+			/* wait all rx data */
+			wait_event(c->waitq,
+				   txx9spi_rd(c, TXx9_SPSR) & TXx9_SPSR_RBSI);
+			/* receive */
+			for (i = 0; i < count; i++) {
+				data = txx9spi_rd(c, TXx9_SPDR);
+				if (rxbuf) {
+					if (wsize == 1)
+						*(u8 *)rxbuf = data;
+					else
+						*(u16 *)rxbuf = data;
+					rxbuf += wsize;
+				}
+			}
+			len -= count * wsize;
+		}
+		m->actual_length += t->len;
+		if (t->delay_usecs)
+			udelay(t->delay_usecs);
+
+		if (!cs_change)
+			continue;
+		if (t->transfer_list.next == &m->transfers)
+			break;
+		/* sometimes a short mid-message deselect of the chip
+		 * may be needed to terminate a mode or command
+		 */
+		txx9spi_cs_func(spi, c, 0, cs_delay);
+	}
+
+exit:
+	m->status = status;
+	m->complete(m->context);
+
+	/* normally deactivate chipselect ... unless no error and
+	 * cs_change has hinted that the next message will probably
+	 * be for this chip too.
+	 */
+	if (!(status == 0 && cs_change))
+		txx9spi_cs_func(spi, c, 0, cs_delay);
+
+	/* enter config mode */
+	txx9spi_wr(c, mcr | TXx9_SPMCR_CONFIG | TXx9_SPMCR_BCLR, TXx9_SPMCR);
+}
+
+static void txx9spi_work(struct work_struct *work)
+{
+	struct txx9spi *c = container_of(work, struct txx9spi, work);
+	unsigned long flags;
+
+	spin_lock_irqsave(&c->lock, flags);
+	while (!list_empty(&c->queue)) {
+		struct spi_message *m;
+
+		m = container_of(c->queue.next, struct spi_message, queue);
+		list_del_init(&m->queue);
+		spin_unlock_irqrestore(&c->lock, flags);
+
+		txx9spi_work_one(c, m);
+
+		spin_lock_irqsave(&c->lock, flags);
+	}
+	spin_unlock_irqrestore(&c->lock, flags);
+}
+
+static int txx9spi_transfer(struct spi_device *spi, struct spi_message *m)
+{
+	struct spi_master *master = spi->master;
+	struct txx9spi *c = spi_master_get_devdata(master);
+	struct spi_transfer *t;
+	unsigned long flags;
+
+	m->actual_length = 0;
+
+	/* check each transter parameters */
+	list_for_each_entry (t, &m->transfers, transfer_list) {
+		u32 speed_hz = t->speed_hz ?: spi->max_speed_hz;
+		u8 bits_per_word = t->bits_per_word ?: spi->bits_per_word;
+		bits_per_word = bits_per_word ?: 8;
+		if (!t->tx_buf && !t->rx_buf && t->len)
+			return -EINVAL;
+		if (bits_per_word != 8 && bits_per_word != 16)
+			return -EINVAL;
+		if (t->len & ((bits_per_word >> 3) - 1))
+			return -EINVAL;
+		if (speed_hz < c->min_speed_hz || speed_hz > c->max_speed_hz)
+			return -EINVAL;
+	}
+
+	spin_lock_irqsave(&c->lock, flags);
+	list_add_tail(&m->queue, &c->queue);
+	queue_work(c->workqueue, &c->work);
+	spin_unlock_irqrestore(&c->lock, flags);
+
+	return 0;
+}
+
+static int __init txx9spi_probe(struct platform_device *dev)
+{
+	struct spi_master *master;
+	struct txx9spi *c;
+	struct resource *res;
+	int ret = -ENODEV;
+	u32 mcr;
+
+	master = spi_alloc_master(&dev->dev, sizeof(*c));
+	if (!master)
+		return ret;
+	c = spi_master_get_devdata(master);
+	c->irq = -1;
+	platform_set_drvdata(dev, master);
+
+	INIT_WORK(&c->work, txx9spi_work);
+	spin_lock_init(&c->lock);
+	INIT_LIST_HEAD(&c->queue);
+	init_waitqueue_head(&c->waitq);
+
+	c->clk = clk_get(&dev->dev, "spi-baseclk");
+	if (IS_ERR(c->clk)) {
+		ret = PTR_ERR(c->clk);
+		c->clk = NULL;
+		goto exit;
+	}
+	ret = clk_enable(c->clk);
+	if (ret) {
+		clk_put(c->clk);
+		c->clk = NULL;
+		goto exit;
+	}
+	c->baseclk = clk_get_rate(c->clk);
+	c->min_speed_hz = (c->baseclk + 0xff - 1) / 0xff;
+	c->max_speed_hz = c->baseclk;
+
+	res = platform_get_resource(dev, IORESOURCE_MEM, 0);
+	if (!res)
+		goto exit;
+	c->membase = ioremap(res->start, res->end - res->start + 1);
+	if (!c->membase)
+		goto exit;
+
+	/* enter config mode */
+	mcr = txx9spi_rd(c, TXx9_SPMCR);
+	mcr &= ~(TXx9_SPMCR_OPMODE | TXx9_SPMCR_SPSTP | TXx9_SPMCR_BCLR);
+	txx9spi_wr(c, mcr | TXx9_SPMCR_CONFIG | TXx9_SPMCR_BCLR, TXx9_SPMCR);
+
+	c->irq = platform_get_irq(dev, 0);
+	if (c->irq < 0)
+		goto exit;
+	ret = request_irq(c->irq, txx9spi_interrupt, 0, dev->name, c);
+	if (ret) {
+		c->irq = -1;
+		goto exit;
+	}
+
+	c->workqueue = create_singlethread_workqueue(master->cdev.dev->bus_id);
+	if (!c->workqueue)
+		goto exit;
+	c->last_chipselect = -1;
+
+	dev_info(&dev->dev, "at %#llx, irq %d, %dMHz\n",
+		 (unsigned long long)res->start, c->irq,
+		 (c->baseclk + 500000) / 1000000);
+
+	master->bus_num = dev->id;
+	master->setup = txx9spi_setup;
+	master->transfer = txx9spi_transfer;
+	master->num_chipselect = (u16)UINT_MAX; /* any GPIO numbers */
+
+	ret = spi_register_master(master);
+	if (ret)
+		goto exit;
+	return 0;
+exit:
+	if (c->workqueue)
+		destroy_workqueue(c->workqueue);
+	if (c->irq >= 0)
+		free_irq(c->irq, c);
+	if (c->membase)
+		iounmap(c->membase);
+	if (c->clk) {
+		clk_disable(c->clk);
+		clk_put(c->clk);
+	}
+	platform_set_drvdata(dev, NULL);
+	spi_master_put(master);
+	return ret;
+}
+
+static int __exit txx9spi_remove(struct platform_device *dev)
+{
+	struct spi_master *master = spi_master_get(platform_get_drvdata(dev));
+	struct txx9spi *c = spi_master_get_devdata(master);
+
+	spi_unregister_master(master);
+	platform_set_drvdata(dev, NULL);
+	destroy_workqueue(c->workqueue);
+	free_irq(c->irq, c);
+	iounmap(c->membase);
+	clk_disable(c->clk);
+	clk_put(c->clk);
+	spi_master_put(master);
+	return 0;
+}
+
+static struct platform_driver txx9spi_driver = {
+	.remove = __exit_p(txx9spi_remove),
+	.driver = {
+		.name = "txx9spi",
+		.owner = THIS_MODULE,
+	},
+};
+
+static int __init txx9spi_init(void)
+{
+	return platform_driver_probe(&txx9spi_driver, txx9spi_probe);
+}
+subsys_initcall(txx9spi_init);
+
+static void __exit txx9spi_exit(void)
+{
+	platform_driver_unregister(&txx9spi_driver);
+}
+module_exit(txx9spi_exit);
+
+MODULE_DESCRIPTION("TXx9 SPI Driver");
+MODULE_LICENSE("GPL");

From macro@linux-mips.org Mon Jul  2 15:34:43 2007
Received: with ECARTIS (v1.0.0; list linux-mips); Mon, 02 Jul 2007 15:34:45 +0100 (BST)
Received: from pollux.ds.pg.gda.pl ([153.19.208.7]:13828 "EHLO
	pollux.ds.pg.gda.pl") by ftp.linux-mips.org with ESMTP
	id S20022861AbXGBOen (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Mon, 2 Jul 2007 15:34:43 +0100
Received: from localhost (localhost [127.0.0.1])
	by pollux.ds.pg.gda.pl (Postfix) with ESMTP id B19C1E1CA3;
	Mon,  2 Jul 2007 16:34:32 +0200 (CEST)
X-Virus-Scanned: by amavisd-new at pollux.ds.pg.gda.pl
Received: from pollux.ds.pg.gda.pl ([127.0.0.1])
	by localhost (pollux.ds.pg.gda.pl [127.0.0.1]) (amavisd-new, port 10024)
	with ESMTP id GjcjJRgtplr7; Mon,  2 Jul 2007 16:34:32 +0200 (CEST)
Received: from piorun.ds.pg.gda.pl (piorun.ds.pg.gda.pl [153.19.208.8])
	by pollux.ds.pg.gda.pl (Postfix) with ESMTP id 618E6E1C6B;
	Mon,  2 Jul 2007 16:34:32 +0200 (CEST)
Received: from blysk.ds.pg.gda.pl (macro@blysk.ds.pg.gda.pl [153.19.208.6])
	by piorun.ds.pg.gda.pl (8.13.8/8.13.8) with ESMTP id l62EYi2A017930;
	Mon, 2 Jul 2007 16:34:45 +0200
Date:	Mon, 2 Jul 2007 15:34:40 +0100 (BST)
From:	"Maciej W. Rozycki" <macro@linux-mips.org>
To:	Kumba <kumba@gentoo.org>
cc:	Linux MIPS List <linux-mips@linux-mips.org>
Subject: Re: O2 RM7000 Issues
In-Reply-To: <4687DCE2.8070302@gentoo.org>
Message-ID: <Pine.LNX.4.64N.0707021531090.15096@blysk.ds.pg.gda.pl>
References: <4687DCE2.8070302@gentoo.org>
MIME-Version: 1.0
Content-Type: TEXT/PLAIN; charset=US-ASCII
X-Virus-Scanned: ClamAV 0.90.3/3574/Mon Jul  2 10:07:06 2007 on piorun.ds.pg.gda.pl
X-Virus-Status:	Clean
Return-Path: <macro@linux-mips.org>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 15597
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: macro@linux-mips.org
Precedence: bulk
X-list: linux-mips

On Sun, 1 Jul 2007, Kumba wrote:

> I've got a feeling this is likely a problem in the kernel more than it is a
> problem in the userland, but the question is how to go about determining which
> and where.  The RM7K's are pretty rare, so I imagine there's probably a few
> undiscovered quirks in the code (notably the SC code in
> arch/mips/mm/sc-rm7k.c). 

 FYI, I had problems with the secondary cache of this CPU the last time I 
tried it with a Malta too -- random hangs of user processes.  So far I 
have had no time to dig into it unfortunately.

  Maciej

From tiwai@suse.de Tue Jul  3 11:21:23 2007
Received: with ECARTIS (v1.0.0; list linux-mips); Tue, 03 Jul 2007 11:21:25 +0100 (BST)
Received: from cantor2.suse.de ([195.135.220.15]:58040 "EHLO mx2.suse.de")
	by ftp.linux-mips.org with ESMTP id S20021809AbXGCKVX (ORCPT
	<rfc822;linux-mips@linux-mips.org>); Tue, 3 Jul 2007 11:21:23 +0100
Received: from Relay1.suse.de (mail2.suse.de [195.135.221.8])
	(using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits))
	(No client certificate requested)
	by mx2.suse.de (Postfix) with ESMTP id 832F8217E6;
	Tue,  3 Jul 2007 12:20:09 +0200 (CEST)
Date:	Tue, 03 Jul 2007 12:20:05 +0200
Message-ID: <s5hejjpaiwa.wl%tiwai@suse.de>
From:	Takashi Iwai <tiwai@suse.de>
To:	TJ <tj.trevelyan@gmail.com>
Cc:	"Linux MIPS List" <linux-mips@linux-mips.org>,
	ALSA Dev List <alsa-devel@alsa-project.org>
Subject: Re: [alsa-devel] [RFC] SGI O2 MACE audio ALSA module
In-Reply-To: <6849c8890707020427q47704326od05ebb8241c3cf@mail.gmail.com>
References: <6849c8890707020427q47704326od05ebb8241c3cf@mail.gmail.com>
User-Agent: Wanderlust/2.15.5 (Almost Unreal) SEMI/1.14.6 (Maruoka)
 FLIM/1.14.7 (=?ISO-8859-4?Q?Sanj=F2?=) APEL/10.6 MULE XEmacs/21.5 (beta27)
 (fiddleheads) (+CVS-20060704) (i386-suse-linux)
MIME-Version: 1.0 (generated by SEMI 1.14.6 - "Maruoka")
Content-Type: text/plain; charset=US-ASCII
Return-Path: <tiwai@suse.de>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 15598
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: tiwai@suse.de
Precedence: bulk
X-list: linux-mips

At Mon, 2 Jul 2007 12:27:58 +0100,
TJ wrote:
> 
> Hi,
> 
> It's been a while since I last posted something. Here is the latest
> version of my code. It is somewhat of a mess at the moment, but I plan
> to tidy it all up when it works better, any // comments are not
> permanent features. I have been using trial and error to find why it
> play too fast.
> 
> I am glad to say that it does play sound correctly, bar one little
> issue that has me stuck at the moment, it plays too fast (for any
> sample frequency). Also how fast appears to depend on the player
> (tried aplay and ogg123).
> 
> I have cc the ALSA dev too in the hope that between the two lists
> someone may spot something. Please can anyone who replies cc me.
> 
> The patch was built against (applies to) linux-2.6.19.7 from
> linux-mips.org. It'll probably work on other versions.

The patch includes old typdefed structs which were already removed
from the upstream, such as, snd_card_t.  Please replace them
appropriately.  You can find the replacement in
include/sound/typedefs.h (in the old kernel tree).
Similarly, I'd recommend to avoid typedefs in your own code, too.
People don't like it :)

Other things I noticed through a quick glance:

- Follow the standard coding style, e.g. 80 chars in a line, don't put
  if-block in a single line, etc.
- Avoid non-ASCII letters, especially outside the comments
- You don't need *_irqsave() in get/put callbacks of the control API.
  It's always schedulable, so, spin_lock_irq() suffices.
- ad1843_lock could be better implemented with mutex if you have long
  delays inside the spinlock (except for the calls from irq handler)
- please remove uneeded debug printks.  If they are useful, keep it in
  another macro form.

Could you fix these and repost?

thanks,

Takashi

From ralf@linux-mips.org Tue Jul  3 19:31:48 2007
Received: with ECARTIS (v1.0.0; list linux-mips); Tue, 03 Jul 2007 19:31:50 +0100 (BST)
Received: from localhost.localdomain ([127.0.0.1]:37567 "EHLO
	dl5rb.ham-radio-op.net") by ftp.linux-mips.org with ESMTP
	id S20022363AbXGCSbs (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Tue, 3 Jul 2007 19:31:48 +0100
Received: from denk.linux-mips.net (denk.linux-mips.net [127.0.0.1])
	by dl5rb.ham-radio-op.net (8.14.1/8.13.8) with ESMTP id l63ITEt4017964;
	Tue, 3 Jul 2007 20:29:14 +0200
Received: (from ralf@localhost)
	by denk.linux-mips.net (8.14.1/8.14.1/Submit) id l63IT0oC017963;
	Tue, 3 Jul 2007 20:29:00 +0200
Date:	Tue, 3 Jul 2007 20:29:00 +0200
From:	Ralf Baechle <ralf@linux-mips.org>
To:	Jeff Garzik <jeff@garzik.org>
Cc:	Atsushi Nemoto <anemo@mba.ocn.ne.jp>, linux-mips@linux-mips.org,
	sshtylyov@ru.mvista.com, mlachwani@mvista.com
Subject: Re: [PATCH] tc35815: Load MAC address via platform_device
Message-ID: <20070703182900.GA17935@linux-mips.org>
References: <20070629.223453.106262827.anemo@mba.ocn.ne.jp> <46850C03.9030904@garzik.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <46850C03.9030904@garzik.org>
User-Agent: Mutt/1.5.14 (2007-02-12)
Return-Path: <ralf@linux-mips.org>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 15599
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: ralf@linux-mips.org
Precedence: bulk
X-list: linux-mips

On Fri, Jun 29, 2007 at 09:41:23AM -0400, Jeff Garzik wrote:

> ACK.
> 
> Due to platform dependency, I would prefer that Ralf push this upstream, 
> when he pushes the associated rbtx4938 patch.

Will do.

  Ralf

From david-b@pacbell.net Wed Jul  4 00:03:00 2007
Received: with ECARTIS (v1.0.0; list linux-mips); Wed, 04 Jul 2007 00:03:02 +0100 (BST)
Received: from smtp119.sbc.mail.sp1.yahoo.com ([69.147.64.92]:49788 "HELO
	smtp119.sbc.mail.sp1.yahoo.com") by ftp.linux-mips.org with SMTP
	id S20022489AbXGCXDA (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Wed, 4 Jul 2007 00:03:00 +0100
Received: (qmail 73057 invoked from network); 3 Jul 2007 23:02:52 -0000
DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws;
  s=s1024; d=pacbell.net;
  h=Received:X-YMail-OSG:From:To:Subject:Date:User-Agent:Cc:References:In-Reply-To:MIME-Version:Content-Type:Content-Transfer-Encoding:Content-Disposition:Message-Id;
  b=gE57zmHqly+bO4cQynB492vPilAE0qBL9or1gZWMoPWD+gztv2q8+iBf22klgc67eg/75xoE4955XQUtjgrt6OBh6EyG6ZNo8FTSkpPsuWh2M6jb9cw57P0PTyqoQEIP3ohcxN3osm11WH7VUTw7I9xwx63/X1uBsNaLsbcjOZU=  ;
Received: from unknown (HELO ascent) (david-b@pacbell.net@69.226.213.6 with plain)
  by smtp119.sbc.mail.sp1.yahoo.com with SMTP; 3 Jul 2007 23:02:52 -0000
X-YMail-OSG: EUB3pq0VM1ksXNUsdOT4sNN6XaF6wzzoaS4Vh40YYS4.MTHSRuqkiODucJFzSbrDEJvMuwMJVQ--
From:	David Brownell <david-b@pacbell.net>
To:	Atsushi Nemoto <anemo@mba.ocn.ne.jp>
Subject: Re: [PATCH] TXx9 SPI controller driver (take 3)
Date:	Tue, 3 Jul 2007 15:18:54 -0700
User-Agent: KMail/1.9.6
Cc:	linux-mips@linux-mips.org, ralf@linux-mips.org,
	sshtylyov@ru.mvista.com, mlachwani@mvista.com,
	spi-devel-general@lists.sourceforge.net
References: <20070702.230210.130241293.anemo@mba.ocn.ne.jp>
In-Reply-To: <20070702.230210.130241293.anemo@mba.ocn.ne.jp>
MIME-Version: 1.0
Content-Type: text/plain;
  charset="us-ascii"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
Message-Id: <200707031518.55506.david-b@pacbell.net>
Return-Path: <david-b@pacbell.net>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 15600
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: david-b@pacbell.net
Precedence: bulk
X-list: linux-mips

On Monday 02 July 2007, Atsushi Nemoto wrote:
> This is a driver for SPI controller built into TXx9 MIPS SoCs.
> This driver is derived from arch/mips/tx4938/toshiba_rbtx4938/spi_txx9.c.
> 
> Signed-off-by: Atsushi Nemoto <anemo@mba.ocn.ne.jp>

Thanks.  I fixed a few whitespace bugs (indents *ONLY* tabs etc)
and forwarded it for merging.

- Dave


From ralf@linux-mips.org Wed Jul  4 12:00:53 2007
Received: with ECARTIS (v1.0.0; list linux-mips); Wed, 04 Jul 2007 12:00:55 +0100 (BST)
Received: from localhost.localdomain ([127.0.0.1]:994 "EHLO
	dl5rb.ham-radio-op.net") by ftp.linux-mips.org with ESMTP
	id S20021819AbXGDLAx (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Wed, 4 Jul 2007 12:00:53 +0100
Received: from denk.linux-mips.net (denk.linux-mips.net [127.0.0.1])
	by dl5rb.ham-radio-op.net (8.14.1/8.13.8) with ESMTP id l64B0pu7026712;
	Wed, 4 Jul 2007 13:00:52 +0200
Received: (from ralf@localhost)
	by denk.linux-mips.net (8.14.1/8.14.1/Submit) id l64B0nq4026711;
	Wed, 4 Jul 2007 12:00:49 +0100
Date:	Wed, 4 Jul 2007 12:00:49 +0100
From:	Ralf Baechle <ralf@linux-mips.org>
To:	Atsushi Nemoto <anemo@mba.ocn.ne.jp>
Cc:	linux-mips@linux-mips.org, sshtylyov@ru.mvista.com,
	mlachwani@mvista.com, jeff@garzik.org
Subject: Re: [PATCH] rbtx4938: Fix secondary PCIC and glue internal NICs
Message-ID: <20070704110049.GA23103@linux-mips.org>
References: <20070629.223501.93206611.anemo@mba.ocn.ne.jp> <20070702.224306.59464033.anemo@mba.ocn.ne.jp>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <20070702.224306.59464033.anemo@mba.ocn.ne.jp>
User-Agent: Mutt/1.5.14 (2007-02-12)
Return-Path: <ralf@linux-mips.org>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 15601
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: ralf@linux-mips.org
Precedence: bulk
X-list: linux-mips

On Mon, Jul 02, 2007 at 10:43:06PM +0900, Atsushi Nemoto wrote:

> On Fri, 29 Jun 2007 22:35:01 +0900 (JST), Atsushi Nemoto <anemo@mba.ocn.ne.jp> wrote:
> > * Use platform_device to provide ethernet addresses for internal NICs.
> 
> Oops, a calculation of checksum was wrong --- revised.

Queued for 2.6.23.

  Ralf

From tj.trevelyan@gmail.com Wed Jul  4 09:25:37 2007
Received: with ECARTIS (v1.0.0; list linux-mips); Wed, 04 Jul 2007 12:17:06 +0100 (BST)
Received: from wa-out-1112.google.com ([209.85.146.178]:21113 "EHLO
	wa-out-1112.google.com") by ftp.linux-mips.org with ESMTP
	id S20021636AbXGDIZh (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Wed, 4 Jul 2007 09:25:37 +0100
Received: by wa-out-1112.google.com with SMTP id m16so3011273waf
        for <linux-mips@linux-mips.org>; Wed, 04 Jul 2007 01:25:22 -0700 (PDT)
DKIM-Signature:	a=rsa-sha1; c=relaxed/relaxed;
        d=gmail.com; s=beta;
        h=domainkey-signature:received:received:message-id:date:from:to:subject:in-reply-to:mime-version:content-type:references;
        b=PtWqmQmcqS/vHDxdmWqwLPzKPQ+n2MkyQ2jWF9sYkyYT3CPx97hVNZsPakjSZUAIyIBCJ+gzBIpaPDK4B7MHAIk5bfn4J55kOorpcJxZGHllPi1162qFfefQ3jQ/L0wAiBxe6fljpW+vAI8HoJPV5V3sAkK8TFfO1pgzLt1ZsyI=
DomainKey-Signature: a=rsa-sha1; c=nofws;
        d=gmail.com; s=beta;
        h=received:message-id:date:from:to:subject:in-reply-to:mime-version:content-type:references;
        b=gMmilwO+aj69ZHJB4WsDsEvSem33VqQwlVHspZzLjPDjX4ujYftB/I0ytPFq7T1BVyMxvnlZxMb6NRWil5n5Uq6BdJJtYP/zL7du2rYFzv26nZwZI0Zbwp6ST5+5IMHONqS+U2AEPHWTCVD88m4K1suB0g6hm+Csl6+vLtv3jtw=
Received: by 10.115.32.1 with SMTP id k1mr6995261waj.1183537520316;
        Wed, 04 Jul 2007 01:25:20 -0700 (PDT)
Received: by 10.114.108.4 with HTTP; Wed, 4 Jul 2007 01:25:20 -0700 (PDT)
Message-ID: <6849c8890707040125x34cb2b0jf7acfabfa0bf351f@mail.gmail.com>
Date:	Wed, 4 Jul 2007 09:25:20 +0100
From:	TJ <tj.trevelyan@gmail.com>
To:	"Linux MIPS List" <linux-mips@linux-mips.org>
Subject: Fwd: [RFC] SGI O2 MACE audio ALSA module
In-Reply-To: <6849c8890707020427q47704326od05ebb8241c3cf@mail.gmail.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; 
	boundary="----=_Part_132389_32726951.1183537520214"
References: <6849c8890707020427q47704326od05ebb8241c3cf@mail.gmail.com>
Return-Path: <tj.trevelyan@gmail.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 15602
X-Approved-By: ralf@linux-mips.org
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: tj.trevelyan@gmail.com
Precedence: bulk
X-list: linux-mips

------=_Part_132389_32726951.1183537520214
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

(third day, third attempt to send this, apologies if the other
attempts arrive too and spam the list, but since the replies from
other lists are reaching this list I thought it better I keep trying
or the conversation would seem rather one sided)

Hi,

It's been a while since I last posted something. Here is the latest
version of my code. It is somewhat of a mess at the moment, but I plan
to tidy it all up when it works better, any // comments are not
permanent features. I have been using trial and error to find why it
play too fast.

I am glad to say that it does play sound correctly, bar one little
issue that has me stuck at the moment, it plays too fast (for any
sample frequency). Also how fast appears to depend on the player
(tried aplay and ogg123).

I have cc the ALSA dev too in the hope that between the two lists
someone may spot something. Please can anyone who replies cc me.

The patch was built against (applies to) linux-2.6.19.7 from
linux-mips.org. It'll probably work on other versions.

Notes on the module it self...

There are two code 'paths' depending on sma_indirect=1|0, this var
will be made a module load argument. When 0 ALSA will be writing
directly to the MACE ring buffer, currently the state of this code is
believed very broken I have not been working on it for a while. When 1
ALSA will be writing to a bounce buffer and the module will copy data
to the ring buffer as per the original driver.

Currently sma_indirect is hard coded 1 and it is this 'path' i'm
currently interested in fixing.

The module has some proc files for debugging, the contents of the
ad1843 regs, and for values in in mace. There is a _spy version of the
module (which wont exist in my final patch) that provides just these
proc files without making any (init) changes to any of the hardware
(ie read only). This allowed me to see what state the O2 jingle left
the various bit in.

The module has a limited mixer, which I want to do a lot more with in
future, and the front volume buttons are supported.

DAC1/ADC map to dev0 on the card, while DAC2 maps to dev1.

I don't know what else to say, please have a listen and a look. It
will play any samples 8k to 48k, and any bit format that ALSA knows
about.

Regards,

Thorben

------=_Part_132389_32726951.1183537520214
Content-Type: text/x-patch; name=mace_audio-20070702.patch; 
	charset=ANSI_X3.4-1968
Content-Transfer-Encoding: base64
X-Attachment-Id: f_f3mugxi3
Content-Disposition: attachment; filename="mace_audio-20070702.patch"

LS0tIGxpbnV4LTIuNi4xOS43LW9yaWdpbmFsL2luY2x1ZGUvc291bmQvYWQxODQzLmgJMTk3MC0w
MS0wMSAwMTowMDowMC4wMDAwMDAwMDAgKzAxMDAKKysrIGxpbnV4LTIuNi4xOS43L2luY2x1ZGUv
c291bmQvYWQxODQzLmgJMjAwNy0wNC0yMSAwNjo0OToyNy4wMDAwMDAwMDAgKzAxMDAKQEAgLTAs
MCArMSw0OCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQg
Y29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRo
ZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisg
KiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAyMDAzIFZpdmllbiBDaGFwcGVs
aWVyIDx2aXZpZW4uY2hhcHBlbGllckBsaW51eC1taXBzLm9yZz4KKyAqLworCisjaWZuZGVmIF9f
U09VTkRfQUQxODQzX0gKKyNkZWZpbmUgX19TT1VORF9BRDE4NDNfSAorCit0eXBlZGVmIHN0cnVj
dCB7CisgIHZvaWQgKmNoaXA7CisgIGludCAoKiByZWFkKSh2b2lkICpjaGlwLCBpbnQgcmVnKTsK
KyAgaW50ICgqIHdyaXRlKSh2b2lkICpjaGlwLCBpbnQgcmVnLCBpbnQgdmFsKTsKK30gYWQxODQz
X3Q7CisKKyNkZWZpbmUgQUQxODQzX0dBSU5fUkVDTEVWIDAKKyNkZWZpbmUgQUQxODQzX0dBSU5f
TElORSAgIDEKKyNkZWZpbmUgQUQxODQzX0dBSU5fQ0QgICAgIDIKKyNkZWZpbmUgQUQxODQzX0dB
SU5fTUlDICAgIDMKKyNkZWZpbmUgQUQxODQzX0dBSU5fUENNXzAgIDQKKyNkZWZpbmUgQUQxODQz
X0dBSU5fUENNXzEgIDUKKyNkZWZpbmUgQUQxODQzX0dBSU5fU0laRSAgIEFEMTg0M19HQUlOX1BD
TV8xKzEKKworaW50IGFkMTg0M19nZXRfZ2FpbihhZDE4NDNfdCAqYWQxODQzLCBpbnQgaWQpOwor
aW50IGFkMTg0M19zZXRfZ2FpbihhZDE4NDNfdCAqYWQxODQzLCBpbnQgaWQsIGludCBuZXd2YWwp
OworaW50IGFkMTg0M19nZXRfcmVjc3JjKGFkMTg0M190ICphZDE4NDMpOwordm9pZCBhZDE4NDNf
c2V0X3Jlc2FtcGxlX21vZGUoYWQxODQzX3QgKmFkMTg0MywgaW50IG9ub2ZmKTsKK2ludCBhZDE4
NDNfc2V0X3JlY3NyYyhhZDE4NDNfdCAqYWQxODQzLCBpbnQgbmV3c3JjKTsKK2ludCBhZDE4NDNf
Z2V0X291dHNyYyhhZDE4NDNfdCAqYWQxODQzKTsKK2ludCBhZDE4NDNfc2V0X291dHNyYyhhZDE4
NDNfdCAqYWQxODQzLCBpbnQgbWFzayk7Cit2b2lkIGFkMTg0M19zZXR1cF9kYWMoYWQxODQzX3Qg
KmFkMTg0MywKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaWQsCisgICAgICAg
ICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZyYW1lcmF0ZSwKKyAgICAgICAgICAgICAgICAg
ICAgICBzbmRfcGNtX2Zvcm1hdF90IGZtdCwKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25l
ZCBpbnQgY2hhbm5lbHMpOwordm9pZCBhZDE4NDNfc2h1dGRvd25fZGFjKGFkMTg0M190ICphZDE4
NDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGlkKTsKK3ZvaWQgYWQx
ODQzX3NldHVwX2FkYyhhZDE4NDNfdCAqYWQxODQzLAorICAgICAgICAgICAgICAgICAgICAgIHVu
c2lnbmVkIGludCBmcmFtZXJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgc25kX3BjbV9mb3Jt
YXRfdCBmbXQsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNoYW5uZWxzKTsK
K3ZvaWQgYWQxODQzX3NodXRkb3duX2FkYyhhZDE4NDNfdCAqYWQxODQzKTsKK2ludCBhZDE4NDNf
aW5pdChhZDE4NDNfdCAqYWQxODQzKTsKK2NoYXIgKmFkMTg0M19kdW1wX3JlZyhhZDE4NDNfdCAq
YWQxODQzLCBpbnQgcmVnKTsKKworI2VuZGlmIC8qIF9fU09VTkRfQUQxODQzX0ggKi8KCi0tLSBs
aW51eC0yLjYuMTkuNy1vcmlnaW5hbC9zb3VuZC9taXBzL2FkMTg0My5jCTE5NzAtMDEtMDEgMDE6
MDA6MDAuMDAwMDAwMDAwICswMTAwCisrKyBsaW51eC0yLjYuMTkuNy9zb3VuZC9taXBzL2FkMTg0
My5jCTIwMDctMDctMDIgMTE6MzY6MTYuMDAwMDAwMDAwICswMTAwCkBAIC0wLDAgKzEsOTA5IEBA
CisvKgorICogICBBRDE4NDMgbG93IGxldmVsIGRyaXZlcgorICoKKyAqICAgQ29weXJpZ2h0IDIw
MDMgVml2aWVuIENoYXBwZWxpZXIgPHZpdmllbi5jaGFwcGVsaWVyQGxpbnV4LW1pcHMub3JnPgor
ICoKKyAqICAgaW5zcGlyZWQgZnJvbSB2d3NuZC5jIChTR0kgVlcgYXVkaW8gZHJpdmVyKQorICog
ICAgIENvcHlyaWdodCAxOTk5IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBy
ZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2Yg
dGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUg
RnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNl
LCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAg
VGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1
c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBp
bXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExp
Y2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZl
ZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdp
dGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAg
IEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1B
ICAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisK
KyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2lu
Y2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRl
IDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxz
b3VuZC9kcml2ZXIuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQv
cGNtLmg+CisjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgorI2luY2x1ZGUgPHNvdW5kL2FkMTg0
My5oPgorCisvLyBmaW5kIGFuZCByZW1vdmUgYW55IE9TUyBzdHVmZgorI2luY2x1ZGUgPGxpbnV4
L3NvdW5kY2FyZC5oPgorCisvKgorICogQUQxODQzIGJpdGZpZWxkIGRlZmluaXRpb25zLiAgQWxs
IGFyZSBuYW1lZCBhcyBpbiB0aGUgQUQxODQzIGRhdGEKKyAqIHNoZWV0LCB3aXRoIGFkMTg0M18g
cHJlcGVuZGVkIGFuZCBpbmRpdmlkdWFsIGJpdCBudW1iZXJzIHJlbW92ZWQuCisgKgorICogRS5n
LiwgYml0cyBMU1MwIHRocm91Z2ggTFNTMiBiZWNvbWUgYWQxODQzX0xTUy4KKyAqCisgKiBPbmx5
IHRoZSBiaXRmaWVsZHMgd2UgbmVlZCBhcmUgZGVmaW5lZC4KKyAqLworCit0eXBlZGVmIHN0cnVj
dCBhZDE4NDNfYml0ZmllbGQgeworICAgICAgIGNoYXIgcmVnOworICAgICAgIGNoYXIgbG9fYml0
OworICAgICAgIGNoYXIgbmJpdHM7Cit9IGFkMTg0M19iaXRmaWVsZF90OworCitzdGF0aWMgY29u
c3QgYWQxODQzX2JpdGZpZWxkX3QKKwlhZDE4NDNfUEROTyAgID0geyAgMCwgMTQsICAxIH0sIC8q
IENvbnZlcnRlciBQb3dlci1Eb3duIEZsYWcgKi8KKwlhZDE4NDNfSU5JVCAgID0geyAgMCwgMTUs
ICAxIH0sIC8qIENsb2NrIEluaXRpYWxpemF0aW9uIEZsYWcgKi8KKwlhZDE4NDNfUklHICAgID0g
eyAgMiwgIDAsICA0IH0sIC8qIFJpZ2h0IEFEQyBJbnB1dCBHYWluICovCisJYWQxODQzX1JNR0Ug
ICA9IHsgIDIsICA0LCAgMSB9LCAvKiBSaWdodCBBREMgTWljIEdhaW4gRW5hYmxlICovCisJYWQx
ODQzX1JTUyAgICA9IHsgIDIsICA1LCAgMyB9LCAvKiBSaWdodCBBREMgU291cmNlIFNlbGVjdCAq
LworCWFkMTg0M19MSUcgICAgPSB7ICAyLCAgOCwgIDQgfSwgLyogTGVmdCBBREMgSW5wdXQgR2Fp
biAqLworCWFkMTg0M19MTUdFICAgPSB7ICAyLCAxMiwgIDEgfSwgLyogTGVmdCBBREMgTWljIEdh
aW4gRW5hYmxlICovCisJYWQxODQzX0xTUyAgICA9IHsgIDIsIDEzLCAgMyB9LCAvKiBMZWZ0IEFE
QyBTb3VyY2UgU2VsZWN0ICovCisJYWQxODQzX1JYMU0gICA9IHsgIDQsICAwLCAgNSB9LCAvKiBS
aWdodCBBdXggMSBNaXggR2Fpbi9BdHRlbiAqLworCWFkMTg0M19SWDFNTSAgPSB7ICA0LCAgNywg
IDEgfSwgLyogUmlnaHQgQXV4IDEgTWl4IE11dGUgKi8KKwlhZDE4NDNfTFgxTSAgID0geyAgNCwg
IDgsICA1IH0sIC8qIExlZnQgQXV4IDEgTWl4IEdhaW4vQXR0ZW4gKi8KKwlhZDE4NDNfTFgxTU0g
ID0geyAgNCwgMTUsICAxIH0sIC8qIExlZnQgQXV4IDEgTWl4IE11dGUgKi8KKwlhZDE4NDNfUlgy
TSAgID0geyAgNSwgIDAsICA1IH0sIC8qIFJpZ2h0IEF1eCAyIE1peCBHYWluL0F0dGVuICovCisJ
YWQxODQzX1JYMk1NICA9IHsgIDUsICA3LCAgMSB9LCAvKiBSaWdodCBBdXggMiBNaXggTXV0ZSAq
LworCWFkMTg0M19MWDJNICAgPSB7ICA1LCAgOCwgIDUgfSwgLyogTGVmdCBBdXggMiBNaXggR2Fp
bi9BdHRlbiAqLworCWFkMTg0M19MWDJNTSAgPSB7ICA1LCAxNSwgIDEgfSwgLyogTGVmdCBBdXgg
MiBNaXggTXV0ZSAqLworCWFkMTg0M19STUNNICAgPSB7ICA3LCAgMCwgIDUgfSwgLyogUmlnaHQg
TWljIE1peCBHYWluL0F0dGVuICovCisJYWQxODQzX1JNQ01NICA9IHsgIDcsICA3LCAgMSB9LCAv
KiBSaWdodCBNaWMgTWl4IE11dGUgKi8KKwlhZDE4NDNfTE1DTSAgID0geyAgNywgIDgsICA1IH0s
IC8qIExlZnQgTWljIE1peCBHYWluL0F0dGVuICovCisJYWQxODQzX0xNQ01NICA9IHsgIDcsIDE1
LCAgMSB9LCAvKiBMZWZ0IE1pYyBNaXggTXV0ZSAqLworCWFkMTg0M19IUE9TICAgPSB7ICA4LCAg
NCwgIDEgfSwgLyogSGVhZHBob25lIE91dHB1dCBWb2x0YWdlIFN3aW5nICovCisJYWQxODQzX0hQ
T00gICA9IHsgIDgsICA1LCAgMSB9LCAvKiBIZWFkcGhvbmUgT3V0cHV0IE11dGUgKi8KKwlhZDE4
NDNfTVBPTSAgID0geyAgOCwgIDYsICAxIH0sIC8qIE1vbm8gT3V0cHV0IE11dGUgKi8KKwlhZDE4
NDNfUkRBMUcgID0geyAgOSwgIDAsICA2IH0sIC8qIFJpZ2h0IERBQzEgQW5hbG9nL0RpZ2l0YWwg
R2FpbiAqLworCWFkMTg0M19SREExR00gPSB7ICA5LCAgNywgIDEgfSwgLyogUmlnaHQgREFDMSBB
bmFsb2cgTXV0ZSAqLworCWFkMTg0M19MREExRyAgPSB7ICA5LCAgOCwgIDYgfSwgLyogTGVmdCBE
QUMxIEFuYWxvZy9EaWdpdGFsIEdhaW4gKi8KKwlhZDE4NDNfTERBMUdNID0geyAgOSwgMTUsICAx
IH0sIC8qIExlZnQgREFDMSBBbmFsb2cgTXV0ZSAqLworCWFkMTg0M19SREEyRyAgPSB7IDEwLCAg
MCwgIDYgfSwgLyogUmlnaHQgREFDMiBBbmFsb2cvRGlnaXRhbCBHYWluICovCisJYWQxODQzX1JE
QTJHTSA9IHsgMTAsICA3LCAgMSB9LCAvKiBSaWdodCBEQUMyIEFuYWxvZyBNdXRlICovCisJYWQx
ODQzX0xEQTJHICA9IHsgMTAsICA4LCAgNiB9LCAvKiBMZWZ0IERBQzIgQW5hbG9nL0RpZ2l0YWwg
R2FpbiAqLworCWFkMTg0M19MREEyR00gPSB7IDEwLCAxNSwgIDEgfSwgLyogTGVmdCBEQUMyIEFu
YWxvZyBNdXRlICovCisJYWQxODQzX1JEQTFBTSA9IHsgMTEsICA3LCAgMSB9LCAvKiBSaWdodCBE
QUMxIERpZ2l0YWwgTXV0ZSAqLworCWFkMTg0M19MREExQU0gPSB7IDExLCAxNSwgIDEgfSwgLyog
TGVmdCBEQUMxIERpZ2l0YWwgTXV0ZSAqLworCWFkMTg0M19SREEyQU0gPSB7IDEyLCAgNywgIDEg
fSwgLyogUmlnaHQgREFDMSBEaWdpdGFsIE11dGUgKi8KKwlhZDE4NDNfTERBMkFNID0geyAxMiwg
MTUsICAxIH0sIC8qIExlZnQgREFDMSBEaWdpdGFsIE11dGUgKi8KKwlhZDE4NDNfQURMQyAgID0g
eyAxNSwgIDAsICAyIH0sIC8qIEFEQyBMZWZ0IFNhbXBsZSBSYXRlIFNvdXJjZSAqLworCWFkMTg0
M19BRFJDICAgPSB7IDE1LCAgMiwgIDIgfSwgLyogQURDIFJpZ2h0IFNhbXBsZSBSYXRlIFNvdXJj
ZSAqLworCWFkMTg0M19EQTFDICAgPSB7IDE1LCAgOCwgIDIgfSwgLyogREFDMSBTYW1wbGUgUmF0
ZSBTb3VyY2UgKi8KKwlhZDE4NDNfREEyQyAgID0geyAxNSwgMTAsICAyIH0sIC8qIERBQzIgU2Ft
cGxlIFJhdGUgU291cmNlICovCisJYWQxODQzX0MxTSAgICA9IHsgMTYsICAwLCAgOCB9LCAvKiBD
bG9jayAxIFJhdGUgTW9kaWZpZXIgKi8KKwlhZDE4NDNfQzFDMTI4ID0geyAxNiwgMTAsICAxIH0s
IC8qIENsb2NrIDEgQ09OVjEgRnJlcSBzZWxlY3QgKi8KKwlhZDE4NDNfQzFDICAgID0geyAxNywg
IDAsIDE2IH0sIC8qIENsb2NrIDEgU2FtcGxlIFJhdGUgU2VsZWN0ICovCisJYWQxODQzX0MyTSAg
ICA9IHsgMTksICAwLCAgOCB9LCAvKiBDbG9jayAyIFJhdGUgTW9kaWZpZXIgKi8KKwlhZDE4NDNf
QzJDICAgID0geyAyMCwgIDAsIDE2IH0sIC8qIENsb2NrIDIgU2FtcGxlIFJhdGUgU2VsZWN0ICov
CisJYWQxODQzX0MzTSAgICA9IHsgMjIsICAwLCAgOCB9LCAvKiBDbG9jayAzIFJhdGUgTW9kaWZp
ZXIgKi8KKwlhZDE4NDNfQzNDICAgID0geyAyMywgIDAsIDE2IH0sIC8qIENsb2NrIDMgU2FtcGxl
IFJhdGUgU2VsZWN0ICovCisJYWQxODQzX0RBQURMICA9IHsgMjUsICA0LCAgMiB9LCAvKiBEaWdp
dGFsIEFEQyBMZWZ0IFNvdXJjZSBTZWxlY3QgKi8KKwlhZDE4NDNfREFBRFIgID0geyAyNSwgIDYs
ICAyIH0sIC8qIERpZ2l0YWwgQURDIFJpZ2h0IFNvdXJjZSBTZWxlY3QgKi8KKwlhZDE4NDNfRFJT
RkxUID0geyAyNSwgMTUsICAxIH0sIC8qIERpZ2l0YWwgUmVhbXBsZXIgRmlsdGVyIE1vZGUgKi8K
KwlhZDE4NDNfQURMRiAgID0geyAyNiwgIDAsICAyIH0sIC8qIEFEQyBMZWZ0IENoYW5uZWwgRGF0
YSBGb3JtYXQgKi8KKwlhZDE4NDNfQURSRiAgID0geyAyNiwgIDIsICAyIH0sIC8qIEFEQyBSaWdo
dCBDaGFubmVsIERhdGEgRm9ybWF0ICovCisJYWQxODQzX0FEVExLICA9IHsgMjYsICA0LCAgMSB9
LCAvKiBBREMgVHJhbnNtaXQgTG9jayBNb2RlIFNlbGVjdCAqLworCWFkMTg0M19GUlMgICAgPSB7
IDI2LCAgNiwgIDEgfSwgLyogRnJhbWUgc2l6ZSBzZWxlY3QgKi8KKwlhZDE4NDNfU0NGICAgID0g
eyAyNiwgIDcsICAxIH0sIC8qIFNDTEsgRnJlcXVlbmN5IFNlbGVjdCAqLworCWFkMTg0M19EQTFG
ICAgPSB7IDI2LCAgOCwgIDIgfSwgLyogREFDMSBEYXRhIEZvcm1hdCBTZWxlY3QgKi8KKwlhZDE4
NDNfREEyRiAgID0geyAyNiwgMTAsICAyIH0sIC8qIERBQzIgRGF0YSBGb3JtYXQgU2VsZWN0ICov
CisJYWQxODQzX0RBMVNNICA9IHsgMjYsIDE0LCAgMSB9LCAvKiBEQUMxIFN0ZXJlby9Nb25vIE1v
ZGUgU2VsZWN0ICovCisJYWQxODQzX0RBMlNNICA9IHsgMjYsIDE1LCAgMSB9LCAvKiBEQUMyIFN0
ZXJlby9Nb25vIE1vZGUgU2VsZWN0ICovCisJYWQxODQzX0FETEVOICA9IHsgMjcsICAwLCAgMSB9
LCAvKiBBREMgTGVmdCBDaGFubmVsIEVuYWJsZSAqLworCWFkMTg0M19BRFJFTiAgPSB7IDI3LCAg
MSwgIDEgfSwgLyogQURDIFJpZ2h0IENoYW5uZWwgRW5hYmxlICovCisJYWQxODQzX0FBTUVOICA9
IHsgMjcsICA0LCAgMSB9LCAvKiBBbmFsb2cgdG8gQW5hbG9nIE1peCBFbmFibGUgKi8KKwlhZDE4
NDNfQU5BRU4gID0geyAyNywgIDcsICAxIH0sIC8qIEFuYWxvZyBDaGFubmVsIEVuYWJsZSAqLwor
CWFkMTg0M19EQTFFTiAgPSB7IDI3LCAgOCwgIDEgfSwgLyogREFDMSBFbmFibGUgKi8KKwlhZDE4
NDNfREEyRU4gID0geyAyNywgIDksICAxIH0sIC8qIERBQzIgRW5hYmxlICovCisJYWQxODQzX0VO
QlQxICA9IHsgMjgsICAyLCAgMSB9LCAvKiBCSVQxIFBpbiBFbmFibGUgKi8KKwlhZDE4NDNfRU5D
VjEgID0geyAyOCwgIDMsICAxIH0sIC8qIENPTlYxIFBpbiBFbmFibGUgKi8KKwlhZDE4NDNfRU5C
VDIgID0geyAyOCwgIDQsICAxIH0sIC8qIEJJVDIgUGluIEVuYWJsZSAqLworCWFkMTg0M19FTkNW
MiAgPSB7IDI4LCAgNSwgIDEgfSwgLyogQ09OVjIgUGluIEVuYWJsZSAqLworCWFkMTg0M19FTkJU
MyAgPSB7IDI4LCAgNiwgIDEgfSwgLyogQklUMyBQaW4gRW5hYmxlICovCisJYWQxODQzX0VOQ1Yz
ICA9IHsgMjgsICA3LCAgMSB9LCAvKiBDT05WMyBQaW4gRW5hYmxlICovCisJYWQxODQzX0VOQ0xL
TyA9IHsgMjgsIDEwLCAgMSB9LCAvKiBDbG9ja091dCBQaW4gRW5hYmxlICovCisJYWQxODQzX0Mx
RU4gICA9IHsgMjgsIDExLCAgMSB9LCAvKiBDbG9jayBHZW5lcmF0b3IgMSBFbmFibGUgKi8KKwlh
ZDE4NDNfQzJFTiAgID0geyAyOCwgMTIsICAxIH0sIC8qIENsb2NrIEdlbmVyYXRvciAyIEVuYWJs
ZSAqLworCWFkMTg0M19DM0VOICAgPSB7IDI4LCAxMywgIDEgfSwgLyogQ2xvY2sgR2VuZXJhdG9y
IDMgRW5hYmxlICovCisJYWQxODQzX0FDRU4gICA9IHsgMjgsIDE0LCAgMSB9LCAvKiBBdXRvY2Fs
aWJyYXRpb24gZW5hYmxlICovCisJYWQxODQzX1BETkkgICA9IHsgMjgsIDE1LCAgMSB9OyAvKiBD
b252ZXJ0ZXIgUG93ZXIgRG93biAqLworCisKKy8qCisgKiBUaGUgdmFyaW91cyByZWdpc3RlcnMg
b2YgdGhlIEFEMTg0MyB1c2UgdGhyZWUgZGlmZmVyZW50IGZvcm1hdHMgZm9yCisgKiBzcGVjaWZ5
aW5nIGdhaW4uICBUaGUgYWQxODQzX2dhaW4gc3RydWN0dXJlIHBhcmFtZXRlcml6ZXMgdGhlCisg
KiBmb3JtYXRzLgorICovCisKK3R5cGVkZWYgc3RydWN0IGFkMTg0M19nYWluIHsKKyAgICAgICBp
bnQgICAgIG5lZ2F0aXZlOyAgICAgICAgICAgICAgIC8qIG5vbnplcm8gaWYgZ2FpbiBpcyBuZWdh
dGl2ZS4gKi8KKyAgICAgICBjb25zdCBhZDE4NDNfYml0ZmllbGRfdCAqbGZpZWxkOworICAgICAg
IGNvbnN0IGFkMTg0M19iaXRmaWVsZF90ICpyZmllbGQ7Cit9IGFkMTg0M19nYWluX3Q7CisKK2Nv
bnN0IGFkMTg0M19nYWluX3QgYWQxODQzX2dhaW5fUkVDTEVWCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgPSB7IDAsICZhZDE4NDNfTElHLCAgICZhZDE4NDNfUklHIH07Citjb25zdCBh
ZDE4NDNfZ2Fpbl90IGFkMTg0M19nYWluX0xJTkUKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICA9IHsgMSwgJmFkMTg0M19MWDFNLCAgJmFkMTg0M19SWDFNIH07Citjb25zdCBhZDE4NDNf
Z2Fpbl90IGFkMTg0M19nYWluX0NECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSB7
IDEsICZhZDE4NDNfTFgyTSwgICZhZDE4NDNfUlgyTSB9OworY29uc3QgYWQxODQzX2dhaW5fdCBh
ZDE4NDNfZ2Fpbl9NSUMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHsgMSwgJmFk
MTg0M19MTUNNLCAgJmFkMTg0M19STUNNIH07Citjb25zdCBhZDE4NDNfZ2Fpbl90IGFkMTg0M19n
YWluX1BDTV8wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSB7IDEsICZhZDE4NDNf
TERBMUcsICZhZDE4NDNfUkRBMUcgfTsKK2NvbnN0IGFkMTg0M19nYWluX3QgYWQxODQzX2dhaW5f
UENNXzEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHsgMSwgJmFkMTg0M19MREEy
RywgJmFkMTg0M19SREEyRyB9OworCitjb25zdCBhZDE4NDNfZ2Fpbl90ICphZDE4NDNfZ2FpbltB
RDE4NDNfR0FJTl9TSVpFXSA9IHsKKyAgJmFkMTg0M19nYWluX1JFQ0xFViwKKyAgJmFkMTg0M19n
YWluX0xJTkUsCisgICZhZDE4NDNfZ2Fpbl9DRCwKKyAgJmFkMTg0M19nYWluX01JQywKKyAgJmFk
MTg0M19nYWluX1BDTV8wLAorICAmYWQxODQzX2dhaW5fUENNXzEsCit9OworCisvKiByZWFkIHRo
ZSBjdXJyZW50IHZhbHVlIG9mIGFuIEFEMTg0MyBiaXRmaWVsZC4gKi8KKworc3RhdGljIGludCBh
ZDE4NDNfcmVhZF9iaXRzKGFkMTg0M190ICphZDE4NDMsIGNvbnN0IGFkMTg0M19iaXRmaWVsZF90
ICpmaWVsZCkKK3sKKyAgICAgICBpbnQgdyA9IGFkMTg0My0+cmVhZChhZDE4NDMtPmNoaXAsIGZp
ZWxkLT5yZWcpOworICAgICAgIGludCB2YWwgPSB3ID4+IGZpZWxkLT5sb19iaXQgJiAoKDEgPDwg
ZmllbGQtPm5iaXRzKSAtIDEpOworCisgICAgICAgcmV0dXJuIHZhbDsKK30KKworLyoKKyAqIHdy
aXRlIGEgbmV3IHZhbHVlIHRvIGFuIEFEMTg0MyBiaXRmaWVsZCBhbmQgcmV0dXJuIHRoZSBvbGQg
dmFsdWUuCisgKi8KKworc3RhdGljIGludCBhZDE4NDNfd3JpdGVfYml0cyhhZDE4NDNfdCAqYWQx
ODQzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFkMTg0M19iaXRmaWVsZF90
ICpmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmV3dmFsKQoreworICAg
ICAgIGludCB3ID0gYWQxODQzLT5yZWFkKGFkMTg0My0+Y2hpcCwgZmllbGQtPnJlZyk7CisgICAg
ICAgaW50IG1hc2sgPSAoKDEgPDwgZmllbGQtPm5iaXRzKSAtIDEpIDw8IGZpZWxkLT5sb19iaXQ7
CisgICAgICAgaW50IG9sZHZhbCA9ICh3ICYgbWFzaykgPj4gZmllbGQtPmxvX2JpdDsKKyAgICAg
ICBpbnQgbmV3Yml0cyA9IChuZXd2YWwgPDwgZmllbGQtPmxvX2JpdCkgJiBtYXNrOworICAgICAg
IHcgPSAodyAmIH5tYXNrKSB8IG5ld2JpdHM7CisgICAgICAgKHZvaWQpIGFkMTg0My0+d3JpdGUo
YWQxODQzLT5jaGlwLCBmaWVsZC0+cmVnLCB3KTsKKworICAgICAgIHJldHVybiBvbGR2YWw7Cit9
CisKKy8qCisgKiBhZDE4NDNfcmVhZF9tdWx0aSByZWFkcyBtdWx0aXBsZSBiaXRmaWVsZHMgZnJv
bSB0aGUgc2FtZSBBRDE4NDMKKyAqIHJlZ2lzdGVyLiAgSXQgdXNlcyBhIHNpbmdsZSByZWFkIGN5
Y2xlIHRvIGRvIGl0LiAgKFJlYWRpbmcgdGhlCisgKiBhZDE4NDMgcmVxdWlyZXMgMjU2IGJpdCB0
aW1lcyBhdCAxMi4yODggTUh6LCBvciBuZWFybHkgMjAKKyAqIG1pY3Jvc2Vjb25kcy4pCisgKgor
ICogQ2FsbGVkIGxpa2UgdGhpcy4KKyAqCisgKiAgYWQxODQzX3JlYWRfbXVsdGkoYWQxODQzLCBu
ZmllbGRzLAorICogICAgICAgICAgICAgICAgICAgJmFkMTg0M19GSUVMRDEsICZ2YWwxLAorICog
ICAgICAgICAgICAgICAgICAgJmFkMTg0M19GSUVMRDIsICZ2YWwyLCAuLi4pOworICovCisKK3N0
YXRpYyB2b2lkIGFkMTg0M19yZWFkX211bHRpKGFkMTg0M190ICphZDE4NDMsIGludCBhcmdjb3Vu
dCwgLi4uKQoreworICAgICAgIHZhX2xpc3QgYXA7CisgICAgICAgY29uc3QgYWQxODQzX2JpdGZp
ZWxkX3QgKmZwOworICAgICAgIGludCB3ID0gMCwgbWFzaywgKnZhbHVlLCByZWcgPSAtMTsKKwor
ICAgICAgIHZhX3N0YXJ0KGFwLCBhcmdjb3VudCk7CisgICAgICAgd2hpbGUgKC0tYXJnY291bnQg
Pj0gMCkgeworICAgICAgICAgICAgICAgZnAgPSB2YV9hcmcoYXAsIGNvbnN0IGFkMTg0M19iaXRm
aWVsZF90ICopOworICAgICAgICAgICAgICAgdmFsdWUgPSB2YV9hcmcoYXAsIGludCAqKTsKKwor
ICAgICAgICAgICAgICAgaWYgKHJlZyA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICBy
ZWcgPSBmcC0+cmVnOworICAgICAgICAgICAgICAgICAgICAgICB3ID0gYWQxODQzLT5yZWFkKGFk
MTg0My0+Y2hpcCwgcmVnKTsKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgbWFz
ayA9ICgxIDw8IGZwLT5uYml0cykgLSAxOworICAgICAgICAgICAgICAgKnZhbHVlID0gdyA+PiBm
cC0+bG9fYml0ICYgbWFzazsKKyAgICAgICB9CisgICAgICAgdmFfZW5kKGFwKTsKKworfQorCisv
KgorICogYWQxODQzX3dyaXRlX211bHRpIHN0b3JlcyBtdWx0aXBsZSBiaXRmaWVsZHMgaW50byB0
aGUgc2FtZSBBRDE4NDMKKyAqIHJlZ2lzdGVyLiAgSXQgdXNlcyBvbmUgcmVhZCBhbmQgb25lIHdy
aXRlIGN5Y2xlIHRvIGRvIGl0LgorICoKKyAqIENhbGxlZCBsaWtlIHRoaXMuCisgKgorICogIGFk
MTg0M193cml0ZV9tdWx0aShhZDE4NDMsIG5maWVsZHMsCisgKiAgICAgICAgICAgICAgICAgICAg
JmFkMTg0M19GSUVMRDEsIHZhbDEsCisgKiAgICAgICAgICAgICAgICAgICAgJmFkMTg0M19GSUVM
RjIsIHZhbDIsIC4uLik7CisgKi8KKworc3RhdGljIHZvaWQgYWQxODQzX3dyaXRlX211bHRpKGFk
MTg0M190ICphZDE4NDMsIGludCBhcmdjb3VudCwgLi4uKQoreworICAgICAgIHZhX2xpc3QgYXA7
CisgICAgICAgaW50IHJlZzsKKyAgICAgICBjb25zdCBhZDE4NDNfYml0ZmllbGRfdCAqZnA7Cisg
ICAgICAgaW50IHZhbHVlOworICAgICAgIGludCB3LCBtLCBtYXNrLCBiaXRzOworCisgICAgICAg
bWFzayA9IDA7CisgICAgICAgYml0cyA9IDA7CisgICAgICAgcmVnID0gLTE7CisKKyAgICAgICB2
YV9zdGFydChhcCwgYXJnY291bnQpOworICAgICAgIHdoaWxlICgtLWFyZ2NvdW50ID49IDApIHsK
KyAgICAgICAgICAgICAgIGZwID0gdmFfYXJnKGFwLCBjb25zdCBhZDE4NDNfYml0ZmllbGRfdCAq
KTsKKyAgICAgICAgICAgICAgIHZhbHVlID0gdmFfYXJnKGFwLCBpbnQpOworICAgICAgICAgICAg
ICAgaWYgKHJlZyA9PSAtMSkKKyAgICAgICAgICAgICAgICAgICAgICAgcmVnID0gZnAtPnJlZzsK
KworICAgICAgICAgICAgICAgbSA9ICgoMSA8PCBmcC0+bmJpdHMpIC0gMSkgPDwgZnAtPmxvX2Jp
dDsKKyAgICAgICAgICAgICAgIG1hc2sgfD0gbTsKKyAgICAgICAgICAgICAgIGJpdHMgfD0gKHZh
bHVlIDw8IGZwLT5sb19iaXQpICYgbTsKKyAgICAgICB9CisgICAgICAgdmFfZW5kKGFwKTsKKwor
ICAgICAgIGlmICh+bWFzayAmIDB4RkZGRikKKyAgICAgICAgICAgICAgIHcgPSBhZDE4NDMtPnJl
YWQoYWQxODQzLT5jaGlwLCByZWcpOworICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgIHcgPSAw
OworICAgICAgIHcgPSAodyAmIH5tYXNrKSB8IGJpdHM7CisgICAgICAgKHZvaWQpIGFkMTg0My0+
d3JpdGUoYWQxODQzLT5jaGlwLCByZWcsIHcpOworfQorCisvKgorICogYWQxODQzX2dldF9nYWlu
IHJlYWRzIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIgYW5kIGV4dHJhY3RzIHRoZSBnYWluIHZhbHVl
CisgKiB1c2luZyB0aGUgc3VwcGxpZWQgZ2FpbiB0eXBlLiAgSXQgcmV0dXJucyB0aGUgZ2FpbiBp
biBPU1MgZm9ybWF0LgorICovCisKK2ludCBhZDE4NDNfZ2V0X2dhaW4oYWQxODQzX3QgKmFkMTg0
MywgaW50IGlkKQoreworICAgICAgIGludCBsZywgcmc7CisgICAgICAgIGNvbnN0IGFkMTg0M19n
YWluX3QgKmdwID0gYWQxODQzX2dhaW5baWRdOworICAgICAgIHVuc2lnbmVkIHNob3J0IG1hc2sg
PSAoMSA8PCBncC0+bGZpZWxkLT5uYml0cykgLSAxOworCisgICAgICAgYWQxODQzX3JlYWRfbXVs
dGkoYWQxODQzLCAyLCBncC0+bGZpZWxkLCAmbGcsIGdwLT5yZmllbGQsICZyZyk7CisgICAgICAg
aWYgKGdwLT5uZWdhdGl2ZSkgeworICAgICAgICAgICAgICAgbGcgPSBtYXNrIC0gbGc7CisgICAg
ICAgICAgICAgICByZyA9IG1hc2sgLSByZzsKKyAgICAgICB9CisgICAgICAgbGcgPSAobGcgKiAx
MDAgKyAobWFzayA+PiAxKSkgLyBtYXNrOworICAgICAgIHJnID0gKHJnICogMTAwICsgKG1hc2sg
Pj4gMSkpIC8gbWFzazsKKyAgICAgICByZXR1cm4gbGcgPDwgMCB8IHJnIDw8IDg7Cit9CisKKy8q
CisgKiBTZXQgYW4gYXVkaW8gY2hhbm5lbCdzIGdhaW4uIENvbnZlcnRzIGZyb20gT1NTIGZvcm1h
dCB0byBBRDE4NDMncworICogZm9ybWF0LgorICoKKyAqIFJldHVybnMgdGhlIG5ldyBnYWluLCB3
aGljaCBtYXkgYmUgbG93ZXIgdGhhbiB0aGUgb2xkIGdhaW4uCisgKi8KKworaW50IGFkMTg0M19z
ZXRfZ2FpbihhZDE4NDNfdCAqYWQxODQzLAorICAgICAgICAgICAgICAgICAgICBpbnQgaWQsCisg
ICAgICAgICAgICAgICAgICAgIGludCBuZXd2YWwpCit7CisgICAgICAgIGNvbnN0IGFkMTg0M19n
YWluX3QgKmdwID0gYWQxODQzX2dhaW5baWRdOworICAgICAgIHVuc2lnbmVkIHNob3J0IG1hc2sg
PSAoMSA8PCBncC0+bGZpZWxkLT5uYml0cykgLSAxOworCisgICAgICAgaW50IGxnID0gbmV3dmFs
ID4+IDAgJiAweEZGOworICAgICAgIGludCByZyA9IG5ld3ZhbCA+PiA4OworICAgICAgIGlmIChs
ZyA8IDAgfHwgbGcgPiAxMDAgfHwgcmcgPCAwIHx8IHJnID4gMTAwKQorICAgICAgICAgICAgICAg
cmV0dXJuIC1FSU5WQUw7CisgICAgICAgbGcgPSAobGcgKiBtYXNrICsgKG1hc2sgPj4gMSkpIC8g
MTAwOworICAgICAgIHJnID0gKHJnICogbWFzayArIChtYXNrID4+IDEpKSAvIDEwMDsKKyAgICAg
ICBpZiAoZ3AtPm5lZ2F0aXZlKSB7CisgICAgICAgICAgICAgICBsZyA9IG1hc2sgLSBsZzsKKyAg
ICAgICAgICAgICAgIHJnID0gbWFzayAtIHJnOworICAgICAgIH0KKyAgICAgICBhZDE4NDNfd3Jp
dGVfbXVsdGkoYWQxODQzLCAyLCBncC0+bGZpZWxkLCBsZywgZ3AtPnJmaWVsZCwgcmcpOworICAg
ICAgIHJldHVybiBhZDE4NDNfZ2V0X2dhaW4oYWQxODQzLCBpZCk7Cit9CisKKy8qIFJldHVybnMg
dGhlIGN1cnJlbnQgcmVjb3JkaW5nIHNvdXJjZSwgaW4gT1NTIGZvcm1hdC4gKi8KKworaW50IGFk
MTg0M19nZXRfcmVjc3JjKGFkMTg0M190ICphZDE4NDMpCit7CisgICAgICAgaW50IGxzID0gYWQx
ODQzX3JlYWRfYml0cyhhZDE4NDMsICZhZDE4NDNfTFNTKTsKKworICAgICAgIHN3aXRjaCAobHMp
IHsKKyAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICByZXR1cm4gU09VTkRfTUFTS19NSUM7
CisgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgcmV0dXJuIFNPVU5EX01BU0tfTElORTsK
KyAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICByZXR1cm4gU09VTkRfTUFTS19DRDsKKyAg
ICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICByZXR1cm4gU09VTkRfTUFTS19QQ007CisgICAg
ICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICB9Cit9CisKKy8q
CisgKiBFbmFibGUvZGlzYWJsZSBkaWdpdGFsIHJlc2FtcGxlIG1vZGUgaW4gdGhlIEFEMTg0My4K
KyAqCisgKiBUaGUgQUQxODQzIHJlcXVpcmVzIHRoYXQgQURMLCBBRFIsIERBMSBhbmQgREEyIGJl
IHBvd2VyZWQgZG93bgorICogd2hpbGUgc3dpdGNoaW5nIG1vZGVzLiAgU28gd2Ugc2F2ZSBEQSdz
IHN0YXRlLCBwb3dlciB0aGVtIGRvd24sCisgKiBzd2l0Y2ggaW50by9vdXQgb2YgcmVzYW1wbGUg
bW9kZSwgcG93ZXIgdGhlbSB1cCwgYW5kIHJlc3RvcmUgc3RhdGUuCisgKgorICogVGhpcyB3aWxs
IGNhdXNlIGF1ZGlibGUgZ2xpdGNoZXMgaWYgRC9BIG9yIEEvRCBpcyBnb2luZyBvbiwgc28gdGhl
CisgKiBkcml2ZXIgZGlzYWxsb3dzIHRoYXQgKGluIG1peGVyX3dyaXRlX2lvY3RsKCkpLgorICoK
KyAqIFRoZSBvcGVuIHF1ZXN0aW9uIGlzLCBpcyB0aGlzIHdvcnRoIGRvaW5nPyAgSSdtIGxlYXZp
bmcgaXQgaW4sCisgKiBiZWNhdXNlIGl0J3Mgd3JpdHRlbiwgYnV0Li4uCisgKi8KKwordm9pZCBh
ZDE4NDNfc2V0X3Jlc2FtcGxlX21vZGUoYWQxODQzX3QgKmFkMTg0MywgaW50IG9ub2ZmKQorewor
ICAgICAgIC8qIFNhdmUgREEncyBtdXRlIGFuZCBnYWluIChhZGRyIDkvMTAgaXMgYW5hbG9nIGdh
aW4vYXR0ZW51YXRpb24pICovCisgICAgICAgaW50IHNhdmVfZGExID0gYWQxODQzLT5yZWFkKGFk
MTg0My0+Y2hpcCwgOSk7CisgICAgICAgaW50IHNhdmVfZGEyID0gYWQxODQzLT5yZWFkKGFkMTg0
My0+Y2hpcCwgMTApOworCisgICAgICAgLyogUG93ZXIgZG93biBBL0QgYW5kIEQvQS4gKi8KKyAg
ICAgICBhZDE4NDNfd3JpdGVfbXVsdGkoYWQxODQzLCA0LAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAmYWQxODQzX0RBMUVOLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWQxODQz
X0RBMkVOLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWQxODQzX0FETEVOLCAwLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAmYWQxODQzX0FEUkVOLCAwKTsKKworICAgICAgIC8q
IFN3aXRjaCBtb2RlICovCisgICAgICAgYWQxODQzX3dyaXRlX2JpdHMoYWQxODQzLCAmYWQxODQz
X0RSU0ZMVCwgb25vZmYpOworCisgICAgICAgLyogUG93ZXIgdXAgQS9EIGFuZCBEL0EuICovCisg
ICAgICAgYWQxODQzX3dyaXRlX211bHRpKGFkMTg0MywgMywKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgJmFkMTg0M19EQTFFTiwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFkMTg0
M19EQTJFTiwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFkMTg0M19BRExFTiwgMSwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFkMTg0M19BRFJFTiwgMSk7CisKKyAgICAgICAv
KiBSZXN0b3JlIERBJ3MgbXV0ZSBhbmQgZ2Fpbi4gKi8KKyAgICAgICBhZDE4NDMtPndyaXRlKGFk
MTg0My0+Y2hpcCwgOSwgc2F2ZV9kYTEpOworICAgICAgIGFkMTg0My0+d3JpdGUoYWQxODQzLT5j
aGlwLCAxMCwgc2F2ZV9kYTIpOworfQorCisvKgorICogU2V0IHJlY29yZGluZyBzb3VyY2UuICBB
cmcgbmV3c3JjIHNwZWNpZmllcyBhbiBPU1MgY2hhbm5lbCBtYXNrLgorICoKKyAqIFRoZSBjb21w
bGljYXRpb24gaXMgdGhhdCB3aGVuIHdlIHN3aXRjaCBpbnRvL291dCBvZiBsb29wYmFjayBtb2Rl
CisgKiAoaS5lLiwgc3JjID0gU09VTkRfTUFTS19QQ00pLCB3ZSBjaGFuZ2UgdGhlIEFEMTg0MyBp
bnRvL291dCBvZgorICogZGlnaXRhbCByZXNhbXBsaW5nIG1vZGUuCisgKgorICogUmV0dXJucyBu
ZXdzcmMgb24gc3VjY2VzcywgLWVycm5vIG9uIGZhaWx1cmUuCisgKi8KKworaW50IGFkMTg0M19z
ZXRfcmVjc3JjKGFkMTg0M190ICphZDE4NDMsIGludCBuZXdzcmMpCit7CisgICAgICAgaW50IGJp
dHM7CisgICAgICAgaW50IG9sZGJpdHM7CisKKyAgICAgICBzd2l0Y2ggKG5ld3NyYykgeworICAg
ICAgIGNhc2UgU09VTkRfTUFTS19QQ006CisgICAgICAgICAgICAgICBiaXRzID0gNjsKKyAgICAg
ICAgICAgICAgIGJyZWFrOworCisgICAgICAgY2FzZSBTT1VORF9NQVNLX01JQzoKKyAgICAgICAg
ICAgICAgIGJpdHMgPSAxOworICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICBjYXNlIFNP
VU5EX01BU0tfTElORToKKyAgICAgICAgICAgICAgIGJpdHMgPSAyOworICAgICAgICAgICAgICAg
YnJlYWs7CisKKyAgICAgICBjYXNlIFNPVU5EX01BU0tfQ0Q6CisgICAgICAgICAgICAgICBiaXRz
ID0gMzsKKyAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgZGVmYXVsdDoKKyAgICAgICAg
ICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgIH0KKyAgICAgICBvbGRiaXRzID0gYWQxODQz
X3JlYWRfYml0cyhhZDE4NDMsICZhZDE4NDNfTFNTKTsKKyAgICAgICBpZiAobmV3c3JjID09IFNP
VU5EX01BU0tfUENNICYmIG9sZGJpdHMgIT0gNikgeworCisgICAgICAgICAgICAgICBhZDE4NDNf
c2V0X3Jlc2FtcGxlX21vZGUoYWQxODQzLCAxKTsKKyAgICAgICAgICAgICAgIGFkMTg0M193cml0
ZV9tdWx0aShhZDE4NDMsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFk
MTg0M19EQUFETCwgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWQxODQz
X0RBQURSLCAyKTsKKyAgICAgICB9IGVsc2UgaWYgKG5ld3NyYyAhPSBTT1VORF9NQVNLX1BDTSAm
JiBvbGRiaXRzID09IDYpIHsKKworICAgICAgICAgICAgICAgYWQxODQzX3NldF9yZXNhbXBsZV9t
b2RlKGFkMTg0MywgMCk7CisgICAgICAgICAgICAgICBhZDE4NDNfd3JpdGVfbXVsdGkoYWQxODQz
LCAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhZDE4NDNfREFBREwsIDAs
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFkMTg0M19EQUFEUiwgMCk7Cisg
ICAgICAgfQorICAgICAgIGFkMTg0M193cml0ZV9tdWx0aShhZDE4NDMsIDIsICZhZDE4NDNfTFNT
LCBiaXRzLCAmYWQxODQzX1JTUywgYml0cyk7CisgICAgICAgcmV0dXJuIG5ld3NyYzsKK30KKwor
LyoKKyAqIFJldHVybiBjdXJyZW50IG91dHB1dCBzb3VyY2VzLCBpbiBPU1MgZm9ybWF0LgorICov
CisKK2ludCBhZDE4NDNfZ2V0X291dHNyYyhhZDE4NDNfdCAqYWQxODQzKQoreworICAgICAgIGlu
dCBwY20sIGxpbmUsIG1pYywgY2Q7CisKKyAgICAgICBwY20gID0gYWQxODQzX3JlYWRfYml0cyhh
ZDE4NDMsICZhZDE4NDNfTERBMUdNKSA/IDAgOiBTT1VORF9NQVNLX1BDTTsKKyAgICAgICBsaW5l
ID0gYWQxODQzX3JlYWRfYml0cyhhZDE4NDMsICZhZDE4NDNfTFgxTU0pICA/IDAgOiBTT1VORF9N
QVNLX0xJTkU7CisgICAgICAgY2QgICA9IGFkMTg0M19yZWFkX2JpdHMoYWQxODQzLCAmYWQxODQz
X0xYMk1NKSAgPyAwIDogU09VTkRfTUFTS19DRDsKKyAgICAgICBtaWMgID0gYWQxODQzX3JlYWRf
Yml0cyhhZDE4NDMsICZhZDE4NDNfTE1DTU0pICA/IDAgOiBTT1VORF9NQVNLX01JQzsKKworICAg
ICAgIHJldHVybiBwY20gfCBsaW5lIHwgY2QgfCBtaWM7Cit9CisKKy8qCisgKiBTZXQgb3V0cHV0
IHNvdXJjZXMuICBBcmcgaXMgYSBtYXNrIG9mIGFjdGl2ZSBzb3VyY2VzIGluIE9TUyBmb3JtYXQu
CisgKgorICogUmV0dXJucyBzb3VyY2UgbWFzayBvbiBzdWNjZXNzLCAtZXJybm8gb24gZmFpbHVy
ZS4KKyAqLworCitpbnQgYWQxODQzX3NldF9vdXRzcmMoYWQxODQzX3QgKmFkMTg0MywgaW50IG1h
c2spCit7CisgICAgICAgaW50IHBjbSwgbGluZSwgbWljLCBjZDsKKworICAgICAgIGlmIChtYXNr
ICYgfihTT1VORF9NQVNLX1BDTSB8IFNPVU5EX01BU0tfTElORSB8CisgICAgICAgICAgICAgICAg
ICAgIFNPVU5EX01BU0tfQ0QgfCBTT1VORF9NQVNLX01JQykpCisgICAgICAgICAgICAgICByZXR1
cm4gLUVJTlZBTDsKKyAgICAgICBwY20gID0gKG1hc2sgJiBTT1VORF9NQVNLX1BDTSkgID8gMCA6
IDE7CisgICAgICAgbGluZSA9IChtYXNrICYgU09VTkRfTUFTS19MSU5FKSA/IDAgOiAxOworICAg
ICAgIG1pYyAgPSAobWFzayAmIFNPVU5EX01BU0tfTUlDKSAgPyAwIDogMTsKKyAgICAgICBjZCAg
ID0gKG1hc2sgJiBTT1VORF9NQVNLX0NEKSAgID8gMCA6IDE7CisKKyAgICAgICBhZDE4NDNfd3Jp
dGVfbXVsdGkoYWQxODQzLCAyLCAmYWQxODQzX0xEQTFHTSwgcGNtLCAmYWQxODQzX1JEQTFHTSwg
cGNtKTsKKyAgICAgICBhZDE4NDNfd3JpdGVfbXVsdGkoYWQxODQzLCAyLCAmYWQxODQzX0xYMU1N
LCBsaW5lLCAmYWQxODQzX1JYMU1NLCBsaW5lKTsKKyAgICAgICBhZDE4NDNfd3JpdGVfbXVsdGko
YWQxODQzLCAyLCAmYWQxODQzX0xYMk1NLCBjZCwgICAmYWQxODQzX1JYMk1NLCBjZCk7CisgICAg
ICAgYWQxODQzX3dyaXRlX211bHRpKGFkMTg0MywgMiwgJmFkMTg0M19MTUNNTSwgbWljLCAgJmFk
MTg0M19STUNNTSwgbWljKTsKKworICAgICAgIHJldHVybiBtYXNrOworfQorCisvKiBTZXR1cCBh
ZDE4NDMgZm9yIEQvQSBjb252ZXJzaW9uLiAqLworCit2b2lkIGFkMTg0M19zZXR1cF9kYWMoYWQx
ODQzX3QgKmFkMTg0MywKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaWQsCisg
ICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZyYW1lcmF0ZSwKKyAgICAgICAgICAg
ICAgICAgICAgICBzbmRfcGNtX2Zvcm1hdF90IGZtdCwKKyAgICAgICAgICAgICAgICAgICAgICB1
bnNpZ25lZCBpbnQgY2hhbm5lbHMpCit7CisgICAgICAgaW50IGFkX2ZtdCA9IDEsIGFkX21vZGUg
PSAwOworCisgICAgICAgc3dpdGNoIChmbXQpIHsKKyAgICAgICBjYXNlIFNORFJWX1BDTV9GT1JN
QVRfUzg6ICAgICAgIGFkX2ZtdCA9IDA7IGJyZWFrOworICAgICAgIGNhc2UgU05EUlZfUENNX0ZP
Uk1BVF9VODogICAgICAgYWRfZm10ID0gMDsgYnJlYWs7CisgICAgICAgY2FzZSBTTkRSVl9QQ01f
Rk9STUFUX1MxNl9CRTogICBhZF9mbXQgPSAxOyBicmVhazsKKyAgICAgICBjYXNlIFNORFJWX1BD
TV9GT1JNQVRfUzI0X0JFOiAgIGFkX2ZtdCA9IDE7IGJyZWFrOworICAgICAgIGNhc2UgU05EUlZf
UENNX0ZPUk1BVF9NVV9MQVc6ICAgYWRfZm10ID0gMjsgYnJlYWs7CisgICAgICAgY2FzZSBTTkRS
Vl9QQ01fRk9STUFUX0FfTEFXOiAgICBhZF9mbXQgPSAzOyBicmVhazsKKyAgICAgICBkZWZhdWx0
OiBwcmludGsoImVycmshXG4iKTsgYnJlYWs7CisgICAgICAgfQorCisgICAgICAgc3dpdGNoIChj
aGFubmVscykgeworICAgICAgIGNhc2UgMjogICAgICAgICAgICAgICAgIGFkX21vZGUgPSAwOyBi
cmVhazsKKyAgICAgICBjYXNlIDE6ICAgICAgICAgICAgICAgICBhZF9tb2RlID0gMTsgYnJlYWs7
CisgICAgICAgZGVmYXVsdDogcHJpbnRrKCJlcnJrIVxuIik7IGJyZWFrOworICAgICAgIH0KKwor
ICAgICAgICBpZigxID09IGlkKSB7CisJCWFkMTg0M193cml0ZV9iaXRzKGFkMTg0MywgJmFkMTg0
M19DMUMsIGZyYW1lcmF0ZSk7CisJCS8vYWQxODQzX3dyaXRlX2JpdHMoYWQxODQzLCAmYWQxODQz
X0MxTSwgMHgwMCk7CisJCS8vYWQxODQzX3dyaXRlX2JpdHMoYWQxODQzLCAmYWQxODQzX0MxQzEy
OCwgMSk7CisJCS8vYWQxODQzX3dyaXRlX2JpdHMoYWQxODQzLCAmYWQxODQzX0ZSUywgMCk7CisJ
CWFkMTg0M193cml0ZV9tdWx0aShhZDE4NDMsIDIsCisJCQkmYWQxODQzX0RBMVNNLCBhZF9tb2Rl
LAorCQkJJmFkMTg0M19EQTFGLCBhZF9mbXQpOworCQkvL2FkMTg0M193cml0ZV9iaXRzKGFkMTg0
MywgJmFkMTg0M19EQTFFTiwgMSk7CisKKyAgICAgICAgfSBlbHNlIHsKKwkJYWQxODQzX3dyaXRl
X2JpdHMoYWQxODQzLCAmYWQxODQzX0MzQywgZnJhbWVyYXRlKTsKKwkJYWQxODQzX3dyaXRlX211
bHRpKGFkMTg0MywgMiwKKwkJCSZhZDE4NDNfREEyU00sIGFkX21vZGUsCisJCQkmYWQxODQzX0RB
MkYsIGFkX2ZtdCk7CisJCS8vYWQxODQzX3dyaXRlX2JpdHMoYWQxODQzLCAmYWQxODQzX0RBMkVO
LCAxKTsKKyAgICAgICB9CisKKy8qRklYTUUgRGVidWdnaW5nLCB3aWxsIHJlbW92ZSAqLworYWQx
ODQzX3dyaXRlX2JpdHMoYWQxODQzLCAmYWQxODQzX0MxQywgZnJhbWVyYXRlKTsKK2FkMTg0M193
cml0ZV9iaXRzKGFkMTg0MywgJmFkMTg0M19DMkMsIGZyYW1lcmF0ZSk7CithZDE4NDNfd3JpdGVf
Yml0cyhhZDE4NDMsICZhZDE4NDNfQzNDLCBmcmFtZXJhdGUpOworLy9hZDE4NDNfd3JpdGVfYml0
cyhhZDE4NDMsICZhZDE4NDNfQzFNLCAweDAwKTsKKy8vYWQxODQzX3dyaXRlX2JpdHMoYWQxODQz
LCAmYWQxODQzX0MyTSwgMHgwMCk7CisvL2FkMTg0M193cml0ZV9iaXRzKGFkMTg0MywgJmFkMTg0
M19DM00sIDB4MDApOworCit9CisKK3ZvaWQgYWQxODQzX3NodXRkb3duX2RhYyhhZDE4NDNfdCAq
YWQxODQzLCB1bnNpZ25lZCBpbnQgaWQpCit7CisgICAgICAgaWYoaWQpCisgICAgICAgICAgICAg
ICBhZDE4NDNfd3JpdGVfYml0cyhhZDE4NDMsICZhZDE4NDNfREEyRiwgMSk7CisgICAgICAgIGVs
c2UKKyAgICAgICAgICAgICAgIGFkMTg0M193cml0ZV9iaXRzKGFkMTg0MywgJmFkMTg0M19EQTFG
LCAxKTsKK30KKwordm9pZCBhZDE4NDNfc2V0dXBfYWRjKGFkMTg0M190ICphZDE4NDMsCisgICAg
ICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZyYW1lcmF0ZSwKKyAgICAgICAgICAgICAg
ICAgICAgICBzbmRfcGNtX2Zvcm1hdF90IGZtdCwKKyAgICAgICAgICAgICAgICAgICAgICB1bnNp
Z25lZCBpbnQgY2hhbm5lbHMpCit7CisgICAgICAgaW50IGRhX2ZtdCA9IDA7CisKKyAgICAgICBz
d2l0Y2ggKGZtdCkgeworICAgICAgIGNhc2UgU05EUlZfUENNX0ZPUk1BVF9TODogICAgICAgZGFf
Zm10ID0gMDsgYnJlYWs7CisgICAgICAgY2FzZSBTTkRSVl9QQ01fRk9STUFUX1U4OiAgICAgICBk
YV9mbXQgPSAwOyBicmVhazsKKyAgICAgICBjYXNlIFNORFJWX1BDTV9GT1JNQVRfUzE2X0JFOiAg
IGRhX2ZtdCA9IDE7IGJyZWFrOworICAgICAgIGNhc2UgU05EUlZfUENNX0ZPUk1BVF9NVV9MQVc6
ICAgZGFfZm10ID0gMjsgYnJlYWs7CisgICAgICAgY2FzZSBTTkRSVl9QQ01fRk9STUFUX0FfTEFX
OiAgICBkYV9mbXQgPSAzOyBicmVhazsKKyAgICAgICBkZWZhdWx0OiBwcmludGsoImVycmshXG4i
KTsgYnJlYWs7CisgICAgICAgfQorCisgICAgICAgYWQxODQzX3dyaXRlX2JpdHMoYWQxODQzLCAm
YWQxODQzX0MzQywgZnJhbWVyYXRlKTsKKyAgICAgICBhZDE4NDNfd3JpdGVfbXVsdGkoYWQxODQz
LCAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWQxODQzX0FETEYsIGRhX2ZtdCwgJmFk
MTg0M19BRFJGLCBkYV9mbXQpOworfQorCit2b2lkIGFkMTg0M19zaHV0ZG93bl9hZGMoYWQxODQz
X3QgKmFkMTg0MykKK3sKKyAgICAgICAvKiBub3RoaW5nIHRvIGRvICovCit9CisKKy8qCisgKiBG
dWxseSBpbml0aWFsaXplIHRoZSBhZDE4NDMuICBBcyBkZXNjcmliZWQgaW4gdGhlIEFEMTg0MyBk
YXRhCisgKiBzaGVldCwgc2VjdGlvbiAiU1RBUlQtVVAgU0VRVUVOQ0UiLiAgVGhlIG51bWJlcmVk
IGNvbW1lbnRzIGFyZQorICogc3Vic2VjdGlvbiBoZWFkaW5ncyBmcm9tIHRoZSBkYXRhIHNoZWV0
LiAgU2VlIHRoZSBkYXRhIHNoZWV0LCBwYWdlcworICogNTItNTQsIGZvciBtb3JlIGluZm8uCisg
KgorICogcmV0dXJuIDAgb24gc3VjY2VzcywgLWVycm5vIG9uIGZhaWx1cmUuICAqLworCitpbnQg
YWQxODQzX2luaXQoYWQxODQzX3QgKmFkMTg0MykKK3sKKyAgICAgICB1bnNpZ25lZCBsb25nIGxh
dGVyOworCisJLyogMS4gUG93ZXIgdXAgaW4gaGFyZHdhcmUgKi8KKworCS8qIDIuIEFzc2VydCBe
UkVTRVReIHRvIDAsIHdhaXQgMTAwbnMKKwkgKiAzLiBEZWFzc2VydCBeUkVTRVReIF80MDAgdG8g
ODAwdXMsIHBvbGwgSU5JVCB0byBzZWUgd2hlbiByZWFkeQorCSAqIERvbmUgaW4gY2FsbGluZyBk
cml2ZXIgKi8KKwl1ZGVsYXkoODAwKTsKKworCS8qIDMuIENoZWNrIHRoYXQgdGhlIGNsb2NrcyBh
cmUgc3RhYmxlICovCisJaWYgKGFkMTg0M19yZWFkX2JpdHMoYWQxODQzLCAmYWQxODQzX0lOSVQp
ICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhZDE4NDM6IEFEMTg0MyBDbG9ja3Mgbm90IHll
dCBzdGFibGVcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKnNldCBzZXJpYWwgYnVzIHNw
ZWVkICovCisJYWQxODQzX3dyaXRlX2JpdHMoYWQxODQzLCAmYWQxODQzX1NDRiwgMCk7CisKKwkv
KiBQb3dlciBkb3duIGNvbnYgcmVzb3VyY2VzICovCisJLyphZDE4NDNfd3JpdGVfYml0cyhhZDE4
NDMsICZhZDE4NDNfUEROSSwgMSk7CisJdWRlbGF5KDgwMCk7Ki8KKworCS8qIDQuIFB1dCB0aGUg
Y29udmVyc2lvbiByZXNvdXJjZXMgaW50byBzdGFuZGJ5IFBETkkgdG8gMAorCSAqIEZvcmNlIEVu
YWJsZSBhdXRvIGNhbGlicmF0ZSBBQ0VOIHRvIDEgKi8KKwlhZDE4NDNfd3JpdGVfbXVsdGkoYWQx
ODQzLCAyLAorCQkmYWQxODQzX1BETkksIDAsICZhZDE4NDNfQUNFTiwgMSk7CisJbGF0ZXIgPSBq
aWZmaWVzICsgSFogLyAyOyAgLyogcm91Z2hseSBoYWxmIGEgc2Vjb25kICovCisKKwkvKiA1LiBX
aGlsZSBpbiBzdGFuZGJ5CisJICogUG93ZXIgdXAgdGhlIGNsb2NrIGdlbmVyYXRvcnMgYW5kIGVu
YWJsZSBjbG9jayBvdXRwdXQgcGlucy4gKi8KKwlhZDE4NDNfd3JpdGVfbXVsdGkoYWQxODQzLCAx
MCwgJmFkMTg0M19FTkNMS08sIDEsCisJCSZhZDE4NDNfQzFFTiwgMSwgJmFkMTg0M19FTkNWMSwg
MSwgJmFkMTg0M19FTkJUMSwgMSwKKwkJJmFkMTg0M19DMkVOLCAxLCAmYWQxODQzX0VOQ1YyLCAx
LCAmYWQxODQzX0VOQlQyLCAxLAorCQkmYWQxODQzX0MzRU4sIDEsICZhZDE4NDNfRU5DVjMsIDEs
ICZhZDE4NDNfRU5CVDMsIDEpOworCisJLyogNi4gQ29uZmlndXJlIGNvbnZlcnNpb24gcmVzb3Vy
Y2VzIHdoaWxlIHRoZXkgYXJlIGluIHN0YW5kYnkuICovCisKKworCisJLyogRGlkIHdlIGNvbWUg
b3V0IG9mIHN0YW5kYnkgPyAqLworCXdoaWxlIChhZDE4NDNfcmVhZF9iaXRzKGFkMTg0MywgJmFk
MTg0M19QRE5PKSkgeworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBsYXRlcikpIHsKKwkJCXBy
aW50ayhLRVJOX0VSUiAiYWQxODQzOiBBRDE4NDMgd29uJ3QgcG93ZXIgdXBcbiIpOworICAgICAg
ICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTzsKKwkJfQorCQlzY2hlZHVsZSgpOworCX0KKwor
CisJLyogREFDMSA9IENsb2NrMSwgQURDID0gQ2xvY2syLCBEQUMyID0gQ2xvY2szICBBbHdheXMu
CisJICogQmFzZWQgYW4gYWQxODQzIHN0YXRlIGZyb20gc3RhcnR1cCBqaW5nbGUgKi8KKwlhZDE4
NDNfd3JpdGVfbXVsdGkoYWQxODQzLCA0LAorCQkmYWQxODQzX0RBMUMsIDEsICZhZDE4NDNfREEy
QywgMywKKwkJJmFkMTg0M19BRExDLCAyLCAmYWQxODQzX0FEUkMsIDIpOworCisJLyogNy4gRW5h
YmxlIGNvbnZlcnNpb24gcmVzb3VyY2VzLiAqLworCWFkMTg0M193cml0ZV9iaXRzKGFkMTg0Mywg
JmFkMTg0M19BRFRMSywgMSk7CisJYWQxODQzX3dyaXRlX211bHRpKGFkMTg0MywgNiwKKwkJJmFk
MTg0M19BTkFFTiwgMSwgJmFkMTg0M19BQU1FTiwgMSwKKwkJJmFkMTg0M19EQTFFTiwgMSwgJmFk
MTg0M19EQTJFTiwgMSwKKwkJJmFkMTg0M19BRExFTiwgMSwgJmFkMTg0M19BRFJFTiwgMSk7CisK
KyAgICAgICAvKiA4LiBDb25maWd1cmUgY29udmVyc2lvbiByZXNvdXJjZXMgd2hpbGUgdGhleSBh
cmUgZW5hYmxlZC4gKi8KKworCisgICAgICAgLyogVW5tdXRlIGFsbCBjaGFubmVscy4gKi8KKwor
ICAgICAgIGFkMTg0M19zZXRfb3V0c3JjKGFkMTg0MywKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAoU09VTkRfTUFTS19QQ00gfCBTT1VORF9NQVNLX0xJTkUgfAorICAgICAgICAgICAgICAgICAg
ICAgICAgICBTT1VORF9NQVNLX01JQyB8IFNPVU5EX01BU0tfQ0QpKTsKKyAgICAgICBhZDE4NDNf
d3JpdGVfbXVsdGkoYWQxODQzLCAyLAorCQkmYWQxODQzX0xEQTFBTSwgMCwgJmFkMTg0M19SREEx
QU0sIDApOworCisJYWQxODQzX3dyaXRlX211bHRpKGFkMTg0MywgMiwKKwkJJmFkMTg0M19MREEy
QU0sIDAsICZhZDE4NDNfUkRBMkFNLCAwKTsKKworCWFkMTg0M193cml0ZV9tdWx0aShhZDE4NDMs
IDIsCisJCSZhZDE4NDNfTERBMUdNLCAwLCAmYWQxODQzX1JEQTFHTSwgMCk7CisKKyAgICAgICAv
KiBTZXQgZGVmYXVsdCByZWNvcmRpbmcgc291cmNlIHRvIExpbmUgSW4gYW5kIHNldAorICAgICAg
ICAqIG1pYyBnYWluIHRvICsyMCBkQi4KKyAgICAgICAgKi8KKyAgICAgICBhZDE4NDNfc2V0X3Jl
Y3NyYyhhZDE4NDMsIFNPVU5EX01BU0tfTElORSk7CisgICAgICAgYWQxODQzX3dyaXRlX211bHRp
KGFkMTg0MywgMiwgJmFkMTg0M19MTUdFLCAxLCAmYWQxODQzX1JNR0UsIDEpOworCisgICAgICAg
LyogU2V0IFNwZWFrZXIgT3V0IGxldmVsIHRvICsvLSA0ViBhbmQgdW5tdXRlIGl0LiAqLworICAg
ICAgIGFkMTg0M193cml0ZV9tdWx0aShhZDE4NDMsIDMsCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAmYWQxODQzX0hQT1MsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWQxODQz
X0hQT00sIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWQxODQzX01QT00sIDApOwor
CisgICAgICAgcmV0dXJuIDA7Cit9CisKK2NoYXIgKmFkMTg0M19kdW1wX3JlZyhhZDE4NDNfdCAq
YWQxODQzLCBpbnQgcmVnKQoreworCXN0YXRpYyBjb25zdCBjaGFyICpyZWdfZm10WzMyXSA9IHsK
KwkJIlJlZyAgMDogQ29kZWMgU3RhdHVzIGFuZCBSZXZpc2lvbiBJZGVudGlmaWNhdGlvblxuIgor
CQkifElOSVQgICAldSB8UEROTyAgICV1IHxSRVMgICAgJXUgfFJFUyAgICAldSAiCisJCSJ8UkVT
ICAgICV1IHxSRVMgICAgJXUgfFJFUyAgICAldSB8UkVTICAgICV1IHwgKCV1KVxuIgorCQkifFJF
UyAgICAldSB8UkVTICAgICV1IHxSRVMgICAgJXUgfFJFUyAgICAldSAiCisJCSJ8SUQzICAgICV1
IMK3SUQyICAgICV1IMK3SUQxICAgICV1IMK3SUQwICAgICV1IHwgKCV1KVxuIiwKKwkJLypyZWcg
MSovCisJCSJSZWcgIDE6IENoYW5uZWwgU3RhdHVzIEZsYWdzXG4iCisJCSJ8UkVTICAgICV1IHxS
RVMgICAgJXUgfFJFUyAgICAldSB8UkVTICAgICV1ICIKKwkJInxSRVMgICAgJXUgfFJFUyAgICAl
dSB8U1UyICAgICV1IHxTVTEgICAgJXUgfCAoJXUpXG4iCisJCSJ8UkVTICAgICV1IHxSRVMgICAg
JXUgfFJFUyAgICAldSB8UkVTICAgICV1ICIKKwkJInxPVlIxICAgJXUgwrdPVlIwICAgJXUgfE9W
TDEgICAldSDCt09WTDAgICAldSB8ICgldSlcbiIsCisJCS8qcmVnIDIqLworCQkiUmVnICAyOiBJ
bnB1dCBDb250cm9sIC0gQURDIFNvdXJjZSBhbmQgR2Fpbi9BdHRlbnVhdGlvblxuIgorCQkifExT
UzIgICAldSDCt0xTUzEgICAldSDCt0xTUzAgICAldSB8TE1HRSAgICV1ICIKKwkJInxMSUczICAg
JXUgwrdMSUcyICAgJXUgwrdMSUcxICAgJXUgwrdMSUcwICAgJXUgfCAoJXUpXG4iCisJCSJ8UlNT
MiAgICV1IMK3UlNTMSAgICV1IMK3UlNTMCAgICV1IHxSTUdFICAgJXUgIgorCQkifFJJRzMgICAl
dSDCt1JJRzIgICAldSDCt1JJRzEgICAldSDCt1JJRzAgICAldSB8ICgldSlcbiIsCisJCS8qcmVn
IDMqLworCQkiUmVnICAzOiBNaXggQ29udHJvbCAtIERBQzIgdG8gTWl4ZXJcbiIKKwkJInxMRDJN
TSAgJXUgfFJFUyAgICAldSB8UkVTICAgICV1IHxMRDJNNCAgJXUgIgorCQkiwrdMRDJNMyAgJXUg
wrdMRDJNMiAgJXUgwrdMRDJNMSAgJXUgwrdMRDJNMCAgJXUgfCAoJXUpXG4iCisJCSJ8UkQyTU0g
ICV1IHxSRVMgICAgJXUgfFJFUyAgICAldSB8UkQyTTQgICV1ICIKKwkJIsK3UkQyTTMgICV1IMK3
UkQyTTIgICV1IMK3UkQyTTEgICV1IMK3UkQyTTAgICV1IHwgKCV1KVxuIiwKKwkJLypyZWcgNCov
CisJCSJSZWcgIDQ6IEF1eGlsaWFyeSAxIHRvIERBQzFcbiIKKwkJInxMWDFNTSAgJXUgfFJFUyAg
ICAldSB8UkVTICAgICV1IHxMWDFNNCAgJXUgIgorCQkiwrdMWDFNMyAgJXUgwrdMWDFNMiAgJXUg
wrdMWDFNMSAgJXUgwrdMWDFNMCAgJXUgfCAoJXUpXG4iCisJCSJ8UlgxTU0gICV1IHxSRVMgICAg
JXUgfFJFUyAgICAldSB8UlgxTTQgICV1ICIKKwkJIsK3UlgxTTMgICV1IMK3UlgxTTIgICV1IMK3
UlgxTTEgICV1IMK3UlgxTTAgICV1IHwgKCV1KVxuIiwKKwkJLypyZWcgNSAqLworCQkiUmVnICA1
OiBNaXggQ29udHJvbCAtIEF1eGlsaWFyeSAyIHRvIE1peGVyXG4iCisJCSJ8TFgyTU0gICV1IHxS
RVMgICAgJXUgfFJFUyAgICAldSB8TFgyTTQgICV1ICIKKwkJIsK3TFgyTTMgICV1IMK3TFgyTTIg
ICV1IMK3TFgyTTEgICV1IMK3TFgyTTAgICV1IHwgKCV1KVxuIgorCQkifFJYMk1NICAldSB8UkVT
ICAgICV1IHxSRVMgICAgJXUgfFJYMk00ICAldSAiCisJCSLCt1JYMk0zICAldSDCt1JYMk0yICAl
dSDCt1JYMk0xICAldSDCt1JYMk0wICAldSB8ICgldSlcbiIsCisJCS8qcmVnIDYqLworCQkiUmVn
ICA2OiBNaXggQ29udHJvbCAtIEF1eGlsaWFyeSAzIHRvIE1peGVyXG4iCisJCSJ8TFgzTU0gICV1
IHxSRVMgICAgJXUgfFJFUyAgICAldSB8TFgzTTQgICV1ICIKKwkJIsK3TFgzTTMgICV1IMK3TFgz
TTIgICV1IMK3TFgzTTEgICV1IMK3TFgzTTAgICV1IHwgKCV1KVxuIgorCQkifFJYM01NICAldSB8
UkVTICAgICV1IHxSRVMgICAgJXUgfFJYM000ICAldSAiCisJCSLCt1JYM00zICAldSDCt1JYM00y
ICAldSDCt1JYM00xICAldSDCt1JYM00wICAldSB8ICgldSlcbiIsCisJCS8qcmVnIDcqLworCQki
UmVnICA3OiBNaXggQ29udHJvbCAtIE1pYyB0byBNaXhlclxuIgorCQkifExNQ01NICAldSB8UkVT
ICAgICV1IHxSRVMgICAgJXUgfExNQ000ICAldSAiCisJCSLCt0xNQ00zICAldSDCt0xNQ00yICAl
dSDCt0xNQ00xICAldSDCt0xNQ00wICAldSB8ICgldSlcbiIKKwkJInxSTUNNTSAgJXUgfFJFUyAg
ICAldSB8UkVTICAgICV1IHxSTUNNNCAgJXUgIgorCQkiwrdSTUNNMyAgJXUgwrdSTUNNMiAgJXUg
wrdSTUNNMSAgJXUgwrdSTUNNMCAgJXUgfCAoJXUpXG4iLAorCQkvKnJlZyA4Ki8KKwkJIlJlZyAg
ODogTWl4L01pc2MgQ29udHJvbCAtIE1vbm8gSW4gdG8gTWl4ZXIgYW5kIE1pc2MgU2V0dGluZ3Nc
biIKKwkJInxNTk1NICAgJXUgfFJFUyAgICAldSB8UkVTICAgICV1IHxNTk00ICAgJXUgIgorCQki
wrdNTk0zICAgJXUgwrdNTk0yICAgJXUgwrdNTk0xICAgJXUgwrdNTk0wICAgJXUgfCAoJXUpXG4i
CisJCSJ8QUxMTU0gICV1IHxNTk9NICAgJXUgfEhQT00gICAldSB8SFBPUyAgICV1ICIKKwkJInxT
VU1NICAgJXUgfFJFUyAgICAldSB8REFDMlQgICV1IHxEQUMxVCAgJXUgfCAoJXUpXG4iLAorCQkv
KnJlZyA5Ki8KKwkJIlJlZyAgOTogT3V0cHV0IENvbnRyb2wgLSBEQUMxIEFuYWxvZyBHYWluL0F0
dGVudWF0aW9uXG4iCisJCSJ8TERBMUdNICV1IHxSRVMgICAgJXUgfExEQTFHNSAldSDCt0xEQTFH
NCAldSAiCisJCSLCt0xEQTFHMyAldSDCt0xEQTFHMiAldSDCt0xEQTFHMSAldSDCt0xEQTFHMCAl
dSB8ICgldSlcbiIKKwkJInxSREExR00gJXUgfFJFUyAgICAldSB8UkRBMUc1ICV1IMK3UkRBMUc0
ICV1ICIKKwkJIsK3UkRBMUczICV1IMK3UkRBMUcyICV1IMK3UkRBMUcxICV1IMK3UkRBMUcwICV1
IHwgKCV1KVxuIiwKKwkJLypyZWcgMTAqLworCQkiUmVnIDEwOiBPdXRwdXQgQ29udHJvbCAtIERB
QzIgQW5hbG9nIEdhaW4vQXR0ZW51YXRpb25cbiIKKwkJInxMREEyR00gJXUgfFJFUyAgICAldSB8
TERBMkc1ICV1IMK3TERBMkc0ICV1ICIKKwkJIsK3TERBMkczICV1IMK3TERBMkcyICV1IMK3TERB
MkcxICV1IMK3TERBMkcwICV1IHwgKCV1KVxuIgorCQkifFJEQTJHTSAldSB8UkVTICAgICV1IHxS
REEyRzUgJXUgwrdSREEyRzQgJXUgIgorCQkiwrdSREEyRzMgJXUgwrdSREEyRzIgJXUgwrdSREEy
RzEgJXUgwrdSREEyRzAgJXUgfCAoJXUpXG4iLAorCQkvKnJlZyAxMSovCisJCSJSZWcgMTE6IE91
dHB1dCBDb250cm9sIC0gREFDMSBEaWdpdGFsIEF0dGVudWF0aW9uXG4iCisJCSJ8TERBMUFNICV1
IHxSRVMgICAgJXUgfExEQTFBNSAldSDCt0xEQTFBNCAldSAiCisJCSLCt0xEQTFBMyAldSDCt0xE
QTFBMiAldSDCt0xEQTFBMSAldSDCt0xEQTFBMCAldSB8ICgldSlcbiIKKwkJInxSREExQU0gJXUg
fFJFUyAgICAldSB8UkRBMUE1ICV1IMK3UkRBMUE0ICV1ICIKKwkJIsK3UkRBMUEzICV1IMK3UkRB
MUEyICV1IMK3UkRBMUExICV1IMK3UkRBMUEwICV1IHwgKCV1KVxuIiwKKwkJLypyZWcgMTIqLwor
CQkiUmVnIDEyOiBPdXRwdXQgQ29udHJvbCAtIERBQzIgRGlnaXRhbCBBdHRlbnVhdGlvblxuIgor
CQkifExEQTJBTSAldSB8UkVTICAgICV1IHxMREEyQTUgJXUgwrdMREEyQTQgJXUgIgorCQkiwrdM
REEyQTMgJXUgwrdMREEyQTIgJXUgwrdMREEyQTEgJXUgwrdMREEyQTAgJXUgfCAoJXUpXG4iCisJ
CSJ8UkRBMkFNICV1IHxSRVMgICAgJXUgfFJEQTJBNSAldSDCt1JEQTJBNCAldSAiCisJCSLCt1JE
QTJBMyAldSDCt1JEQTJBMiAldSDCt1JEQTJBMSAldSDCt1JEQTJBMCAldSB8ICgldSlcbiIsCisJ
CS8qcmVnIDEzKi8KKwkJIlJlZyAxMzogRGlnaXRhbCBNaXggQ29udHJvbCAtIEFEQyB0byBEQUMx
XG4iCisJCSJ8TEFEMU1NICV1IHxSRVMgICAgJXUgfExBRDFNNSAldSDCt0xBRDFNNCAldSAiCisJ
CSLCt0xBRDFNMyAldSDCt0xBRDFNMiAldSDCt0xBRDFNMSAldSDCt0xBRDFNMCAldSB8ICgldSlc
biIKKwkJInxSQUQxTU0gJXUgfFJFUyAgICAldSB8UkFEMU01ICV1IMK3UkFEMU00ICV1ICIKKwkJ
IsK3UkFEMU0zICV1IMK3UkFEMU0yICV1IMK3UkFEMU0xICV1IMK3UkFEMU0wICV1IHwgKCV1KVxu
IiwKKwkJLypyZWcgMTQqLworCQkiUmVnIDE0OiBEaWdpdGFsIE1peCBDb250cm9sIC0gQURDIHRv
IERBQzJcbiIKKwkJInxMQUQyTU0gJXUgfFJFUyAgICAldSB8TEFEMk01ICV1IMK3TEFEMk00ICV1
ICIKKwkJIsK3TEFEMk0zICV1IMK3TEFEMk0yICV1IMK3TEFEMk0xICV1IMK3TEFEMk0wICV1IHwg
KCV1KVxuIgorCQkifFJBRDJNTSAldSB8UkVTICAgICV1IHxSQUQyTTUgJXUgwrdSQUQyTTQgJXUg
IgorCQkiwrdSQUQyTTMgJXUgwrdSQUQyTTIgJXUgwrdSQUQyTTEgJXUgwrdSQUQyTTAgJXUgfCAo
JXUpXG4iLAorCQkvKnJlZyAxNSovCisJCSJSZWcgMTU6IENvZGVjIENvbmZpZ3VyYXRpb24gLSBD
aGFubmVsIFNhbXBsZSBSYXRlIFNvdXJjZSBTZWxlY3RcbiIKKwkJInxSRVMgICAgJXUgfFJFUyAg
ICAldSB8UkVTICAgICV1IHxSRVMgICAgJXUgIgorCQkifERBMkMxICAldSDCt0RBMkMwICAldSB8
REExQzEgICV1IMK3REExQzAgICV1IHwgKCV1KVxuIgorCQkifFJFUyAgICAldSB8UkVTICAgICV1
IHxSRVMgICAgJXUgfFJFUyAgICAldSAiCisJCSJ8QURSQzEgICV1IMK3QURSQzAgICV1IHxBRExD
MSAgJXUgwrdBRExDMCAgJXUgfCAoJXUpXG4iLAorCQkvKnJlZyAxNiovCisJCSJSZWcgMTY6IENs
b2NrIEdlbmVyYXRvciAxIENvbnRyb2wgLSBNb2RlXG4iCisJCSJ8QzFSRUYgICV1IHxDMVZJRCAg
JXUgfEMxUExMRyAldSB8QzFQMjAwICV1ICIKKwkJInxDMVg4LzcgJXUgfEMxQzEyOCAldSB8UkVT
ICAgICV1IHxSRVMgICAgJXUgfCAoJXUpXG4iCisJCSJ8QzFNNyAgICV1IMK3QzFNNiAgICV1IMK3
QzFNNSAgICV1IMK3QzFNNCAgICV1ICIKKwkJIsK3QzFNMyAgICV1IMK3QzFNMiAgICV1IMK3QzFN
MSAgICV1IMK3QzFNMCAgICV1IHwgKCV1KVxuIiwKKwkJLypyZWcgMTcqLworCQkiUmVnIDE3OiBD
bG9jayBHZW5lcmF0b3IgMSBDb250cm9sIC0gU2FtcGxlIFJhdGVcbiIKKwkJInxDMUMxNSAgJXUg
wrdDMUMxNCAgJXUgwrdDMUMxMyAgJXUgwrdDMkMxMiAgJXUgIgorCQkiwrdDMUMxMSAgJXUgwrdD
MUMxMCAgJXUgwrdDMUM5ICAgJXUgwrdDMUM4ICAgJXUgwrcgKCV1KVxuIgorCQkiwrdDMUM3ICAg
JXUgwrdDMUM2ICAgJXUgwrdDMUM1ICAgJXUgwrdDMUM0ICAgJXUgIgorCQkiwrdDMUMzICAgJXUg
wrdDMUMyICAgJXUgwrdDMUMxICAgJXUgwrdDMUMwICAgJXUgfCAoJXUpXG4iLAorCQkvKnJlZyAx
OCovCisJCSJSZWcgMTg6IENsb2NrIEdlbmVyYXRvciAxIENvbnRyb2wgLSBTYW1wbGUgUGhhc2Ug
U2hpZnRcbiIKKwkJInxSRVMgICAgJXUgfFJFUyAgICAldSB8UkVTICAgICV1IHxSRVMgICAgJXUg
IgorCQkifFJFUyAgICAldSB8UkVTICAgICV1IHxSRVMgICAgJXUgfEMxUEQgICAldSB8ICgldSlc
biIKKwkJInxDMVA3ICAgJXUgwrdDMVA2ICAgJXUgwrdDMVA1ICAgJXUgwrdDMVA0ICAgJXUgIgor
CQkiwrdDMVAzICAgJXUgwrdDMVAyICAgJXUgwrdDMVAxICAgJXUgwrdDMVAwICAgJXUgfCAoJXUp
XG4iLAorCQkvKnJlZyAxOSovCisJCSJSZWcgMTk6IENsb2NrIEdlbmVyYXRvciAyIENvbnRyb2wg
LSBNb2RlXG4iCisJCSJ8QzJSRUYgICV1IHxDMlZJRCAgJXUgfEMyUExMRyAldSB8QzJQMjAwICV1
ICIKKwkJInxDMlg4LzcgJXUgfEMyQzEyOCAldSB8UkVTICAgICV1IHxSRVMgICAgJXUgfCAoJXUp
XG4iCisJCSJ8QzJNNyAgICV1IMK3QzJNNiAgICV1IMK3QzJNNSAgICV1IMK3QzJNNCAgICV1ICIK
KwkJIsK3QzJNMyAgICV1IMK3QzJNMiAgICV1IMK3QzJNMSAgICV1IMK3QzJNMCAgICV1IHwgKCV1
KVxuIiwKKwkJLypyZWcgMjAqLworCQkiUmVnIDIwOiBDbG9jayBHZW5lcmF0b3IgMiBDb250cm9s
IC0gU2FtcGxlIFJhdGVcbiIKKwkJInxDMkMxNSAgJXUgwrdDMkMxNCAgJXUgwrdDMkMxMyAgJXUg
wrdDMkMxMiAgJXUgIgorCQkiwrdDMkMxMSAgJXUgwrdDMkMxMCAgJXUgwrdDMkM5ICAgJXUgwrdD
MkM4ICAgJXUgwrcgKCV1KVxuIgorCQkiwrdDMkM3ICAgJXUgwrdDMkM2ICAgJXUgwrdDMkM1ICAg
JXUgwrdDMkM0ICAgJXUgIgorCQkiwrdDMkMzICAgJXUgwrdDMkMyICAgJXUgwrdDMkMxICAgJXUg
wrdDMkMwICAgJXUgfCAoJXUpXG4iLAorCQkvKnJlZyAyMSovCisJCSJSZWcgMjE6IENsb2NrIEdl
bmVyYXRvciAyIENvbnRyb2wgLSBTYW1wbGUgUGhhc2UgU2hpZnRcbiIKKwkJInxSRVMgICAgJXUg
fFJFUyAgICAldSB8UkVTICAgICV1IHxSRVMgICAgJXUgIgorCQkifFJFUyAgICAldSB8UkVTICAg
ICV1IHxSRVMgICAgJXUgfEMyUEQgICAldSB8ICgldSlcbiIKKwkJInxDMlA3ICAgJXUgwrdDMlA2
ICAgJXUgwrdDMlA1ICAgJXUgwrdDMlA0ICAgJXUgIgorCQkiwrdDMlAzICAgJXUgwrdDMlAyICAg
JXUgwrdDMlAxICAgJXUgwrdDMlAwICAgJXUgfCAoJXUpXG4iLAorCQkvKnJlZyAyMiovCisJCSJS
ZWcgMjI6IENsb2NrIEdlbmVyYXRvciAzIENvbnRyb2wgLSBNb2RlXG4iCisJCSJ8QzNSRUYgICV1
IHxDM1ZJRCAgJXUgfEMzUExMRyAldSB8QzNQMjAwICV1ICIKKwkJInxDM1g4LzcgJXUgfEMzQzEy
OCAldSB8UkVTICAgICV1IHxSRVMgICAgJXUgfCAoJXUpXG4iCisJCSJ8QzNNNyAgICV1IMK3QzNN
NiAgICV1IMK3QzNNNSAgICV1IMK3QzNNNCAgICV1ICIKKwkJIsK3QzNNMyAgICV1IMK3QzNNMiAg
ICV1IMK3QzNNMSAgICV1IMK3QzNNMCAgICV1IHwgKCV1KVxuIiwKKwkJLypyZWcgMjMqLworCQki
UmVnIDIzOiBDbG9jayBHZW5lcmF0b3IgMyBDb250cm9sIC0gU2FtcGxlIFJhdGVcbiIKKwkJInxD
M0MxNSAgJXUgwrdDM0MxNCAgJXUgwrdDM0MxMyAgJXUgwrdDM0MxMiAgJXUgIgorCQkiwrdDM0Mx
MSAgJXUgwrdDM0MxMCAgJXUgwrdDM0M5ICAgJXUgwrdDM0M4ICAgJXUgwrcgKCV1KVxuIgorCQki
wrdDM0M3ICAgJXUgwrdDM0M2ICAgJXUgwrdDM0M1ICAgJXUgwrdDM0M0ICAgJXUgIgorCQkiwrdD
M0MzICAgJXUgwrdDM0MyICAgJXUgwrdDM0MxICAgJXUgwrdDM0MwICAgJXUgfCAoJXUpXG4iLAor
CQkvKnJlZyAyNCovCisJCSJSZWcgMjQ6IENsb2NrIEdlbmVyYXRvciAzIENvbnRyb2wgLSBTYW1w
bGUgUGhhc2UgU2hpZnRcbiIKKwkJInxSRVMgICAgJXUgfFJFUyAgICAldSB8UkVTICAgICV1IHxS
RVMgICAgJXUgIgorCQkifFJFUyAgICAldSB8UkVTICAgICV1IHxSRVMgICAgJXUgfEMzUEQgICAl
dSB8ICgldSlcbiIKKwkJInxDM1A3ICAgJXUgwrdDM1A2ICAgJXUgwrdDM1A1ICAgJXUgwrdDM1A0
ICAgJXUgIgorCQkiwrdDM1AzICAgJXUgwrdDM1AyICAgJXUgwrdDM1AxICAgJXUgwrdDM1AwICAg
JXUgfCAoJXUpXG4iLAorCQkvKnJlZyAyNSovCisJCSJSZWcgMjU6IENvZGVjIENvbmZpZ3VyYXRp
b24gLSBEaWdpdGFsIEZpbHRlciBhbmQgTW9kZSBTZWxlY3RcbiIKKwkJInxEUlNGTFQgJXUgfERB
TUlYICAldSB8UkVTICAgICV1IHxSRVMgICAgJXUgIgorCQkifFJFUyAgICAldSB8UkVTICAgICV1
IHxEQTJGTFQgJXUgfERBMUZMVCAldSB8ICgldSlcbiIKKwkJInxEQUFEUjEgJXUgwrdEQUFEUjAg
JXUgfERBQURMMSAldSDCt0RBQURMMCAldSAiCisJCSJ8UkVTICAgICV1IHxSRVMgICAgJXUgfEFE
UkZMVCAldSB8QURMRkxUICV1IHwgKCV1KVxuIiwKKwkJLypyZWcgMjYqLworCQkiUmVnIDI2OiBD
b2RlYyBDb25maWd1cmF0aW9uIC0gU2VyaWFsIEludGVyZmFjZVxuIgorCQkifERBMlNNICAldSB8
REExU00gICV1IHxSRVMgICAgJXUgfFJFUyAgICAldSAiCisJCSJ8REEyRjEgICV1IMK3REEyRjAg
ICV1IHxEQTFGMSAgJXUgwrdEQTFGMCAgJXUgfCAoJXUpXG4iCisJCSJ8U0NGICAgICV1IHxGUlMg
ICAgJXUgfEZSU1QgICAldSB8QURUTEsgICV1ICIKKwkJInxBRFJGMSAgJXUgwrdBRFJGMCAgJXUg
fEFETEYxICAldSDCt0FETEYwICAldSB8ICgldSlcbiIsCisJCS8qcmVnIDI3Ki8KKwkJIlJlZyAy
NzogQ29kZWMgQ29uZmlndXJhdGlvbiAtIENoYW5uZWwgUG93ZXIgRG93blxuIgorCQkifERGUkVF
ICAldSB8UkVTICAgICV1IHxSRVMgICAgJXUgfERETUVNICAldSAiCisJCSJ8UkVTICAgICV1IHxS
RVMgICAgJXUgfERBMkVOICAldSB8REExRU4gICV1IHwgKCV1KVxuIgorCQkifEFOQUVOICAldSB8
SFBFTiAgICV1IHxSRVMgICAgJXUgfEFBTUVOICAldSAiCisJCSJ8UkVTICAgICV1IHxSRVMgICAg
JXUgfEFEUkVOICAldSB8QURMRU4gICV1IHwgKCV1KVxuIiwKKwkJLypyZWcgMjgqLworCQkiUmVn
IDI4OiBDb2RlYyBDb25maWd1cmF0aW9uIC0gRnVuZGVtZW50YWwgU2V0dGluZ3NcbiIKKwkJInxQ
RE5JICAgJXUgfEFDRU4gICAldSB8QzNFTiAgICV1IHxDMkVOICAgJXUgIgorCQkifEMxRU4gICAl
dSB8RU5DTEtPICV1IHxYQ1RMMSAgJXUgfFhDVEwwICAldSB8ICgldSlcbiIKKwkJInxFTkNWMyAg
JXUgfEVOQlQzICAldSB8RU5DVjIgICV1IHxFTkJUMiAgJXUgIgorCQkifEVOQ1YxICAldSB8RU5C
VDEgICV1IHxMSU5SU0QgJXUgfExJTkxTRCAldSB8ICgldSlcbiIsCisJCS8qcmVnIDI5Ki8KKwkJ
IlJlZyAyOTogUmVzZXJ2ZWQgZm9yIEZ1dHVyZSBFeHBhbnNpb25cbiIKKwkJInxSRVMgICAgJXUg
fFJFUyAgICAldSB8UkVTICAgICV1IHxSRVMgICAgJXUgIgorCQkifFJFUyAgICAldSB8UkVTICAg
ICV1IHxSRVMgICAgJXUgfFJFUyAgICAldSB8ICgldSlcbiIKKwkJInxSRVMgICAgJXUgfFJFUyAg
ICAldSB8UkVTICAgICV1IHxSRVMgICAgJXUgIgorCQkifFJFUyAgICAldSB8UkVTICAgICV1IHxS
RVMgICAgJXUgfFJFUyAgICAldSB8ICgldSlcbiIsCisJCS8qcmVnIDMwKi8KKwkJIlJlZyAzMDog
UmVzZXJ2ZWQgZm9yIEZ1dHVyZSBFeHBhbnNpb25cbiIKKwkJInxSRVMgICAgJXUgfFJFUyAgICAl
dSB8UkVTICAgICV1IHxSRVMgICAgJXUgIgorCQkifFJFUyAgICAldSB8UkVTICAgICV1IHxSRVMg
ICAgJXUgfFJFUyAgICAldSB8ICgldSlcbiIKKwkJInxSRVMgICAgJXUgfFJFUyAgICAldSB8UkVT
ICAgICV1IHxSRVMgICAgJXUgIgorCQkifFJFUyAgICAldSB8UkVTICAgICV1IHxSRVMgICAgJXUg
fFJFUyAgICAldSB8ICgldSlcbiIsCisJCS8qcmVnIDMxKi8KKwkJIlJlZyAzMTogUmVzZXJ2ZWQg
Zm9yIEZ1dHVyZSBFeHBhbnNpb25cbiIKKwkJInxSRVMgICAgJXUgfFJFUyAgICAldSB8UkVTICAg
ICV1IHxSRVMgICAgJXUgIgorCQkifFJFUyAgICAldSB8UkVTICAgICV1IHxSRVMgICAgJXUgfFJF
UyAgICAldSB8ICgldSlcbiIKKwkJInxSRVMgICAgJXUgfFJFUyAgICAldSB8UkVTICAgICV1IHxS
RVMgICAgJXUgIgorCQkifFJFUyAgICAldSB8UkVTICAgICV1IHxSRVMgICAgJXUgfFJFUyAgICAl
dSB8ICgldSlcbiIsCisJCX07CisJdW5zaWduZWQgaW50IHYxID0gMCwgdjIgPSAwOworCWludCB3
ID0gYWQxODQzLT5yZWFkKGFkMTg0My0+Y2hpcCwgcmVnKTsKKwljaGFyICpzdHIgPSB2bWFsbG9j
X3VzZXIoMjU1KTsKKworCWlmIChOVUxMPT1zdHIpIHJldHVybiBOVUxMOworCisJc3dpdGNoIChy
ZWcpIHsKKwljYXNlIDA6CisJCXYyID0gdyYweEY7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJdjEg
PSAodz4+OCkmMHhGOyB2MiA9IHcmMHhGOworCQlicmVhazsKKwljYXNlIDM6IGNhc2UgNDogY2Fz
ZSA1OiBjYXNlIDY6IGNhc2UgNzoKKwkJdjEgPSAodz4+OCkmMHgxRjsgdjIgPSB3JjB4MUY7CisJ
CWJyZWFrOworCWNhc2UgODoKKwkJdjEgPSAodz4+OCkmMHgxRjsKKwkJYnJlYWs7CisJY2FzZSA5
OiBjYXNlIDEwOiBjYXNlIDExOiBjYXNlIDEyOiBjYXNlIDEzOiBjYXNlIDE0OgorCQl2MSA9ICh3
Pj44KSYweDNGOyB2MiA9IHcmMHgzRjsKKwkJYnJlYWs7CisJY2FzZSAxNjogY2FzZSAxODogY2Fz
ZSAxOTogY2FzZSAyMTogY2FzZSAyMjogY2FzZSAyNDoKKwkJdjIgPSB3JjB4RkY7CisJCWJyZWFr
OworCWNhc2UgMTc6IGNhc2UgMjA6IGNhc2UgMjM6CisJCXYyID0gdyYweEZGRkY7CisJCWJyZWFr
OworCisJfQorCisJc25wcmludGYoc3RyLCAyNTUsIHJlZ19mbXRbcmVnXSwgKHc+PjE1KSYxLAor
CQkodz4+MTQpJjEsICh3Pj4xMykmMSwgKHc+PjEyKSYxLCAodz4+MTEpJjEsICh3Pj4xMCkmMSwK
KwkJKHc+PjkpJjEsICAodz4+OCkmMSwgdjEsICh3Pj43KSYxLCAgKHc+PjYpJjEsICAodz4+NSkm
MSwKKwkJKHc+PjQpJjEsICAodz4+MykmMSwgICh3Pj4yKSYxLCAgKHc+PjEpJjEsICAodz4+MCkm
MSwgdjIpOworCisJcmV0dXJuIHN0cjsKK30KCi0tLSBsaW51eC0yLjYuMTkuNy1vcmlnaW5hbC9z
b3VuZC9taXBzL21hY2VfYXVkaW8uYwkxOTcwLTAxLTAxIDAxOjAwOjAwLjAwMDAwMDAwMCArMDEw
MAorKysgbGludXgtMi42LjE5Ljcvc291bmQvbWlwcy9tYWNlX2F1ZGlvLmMJMjAwNy0wNy0wMiAx
MTo0MDozMi4wMDAwMDAwMDAgKzAxMDAKQEAgLTAsMCArMSwxMzQxIEBACisvKgorICogICBTb3Vu
ZCBkcml2ZXIgZm9yIFNpbGljb24gR3JhcGhpY3MgTzIgV29ya3N0YXRpb25zIE1BQ0UgYXVkaW8g
Ym9hcmQuCisgKgorICogICBDb3B5cmlnaHQgMjAwNyBUaG9yYmVuIErDpG5kbGluZyA8dGoudHJl
dmVseWFuQGdtYWlsLmNvbT4KKyAqICAgQmFzZWQvQ29waWVkIGhlYXZpbHkgb24vZnJvbSBzZ2lv
MmF1ZGlvLmM6CisgKiAgIENvcHlyaWdodCAyMDAzIFZpdmllbiBDaGFwcGVsaWVyIDx2aXZpZW4u
Y2hhcHBlbGllckBsaW51eC1taXBzLm9yZz4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVl
IHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0
IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVi
bGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJz
aW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVy
IHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhv
cGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZ
OyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklM
SVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBH
TlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91
IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExp
Y2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhl
IEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBT
dWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKy8qCisgKiBO
b3RlcworICoKKyAqIE1hY2UgdGFrZSAyNGJpdCBhdWRpbyBzdG9yZWQvdHJhbnNmZXJlZCBpbiAz
MiBiaXRzIGFuZCBjb252ZXJ0cworICogaXQgaW4gaGFyZHdhcmUgYmFjayB0byAxNi84Yml0Cisg
KgorICogQUQxODQzIHNwZWMgc2F5czoKKyAqICJEYXRhIGluIGFsbCBmb3VyIGZvcm1hdHMgaXMg
YWx3YXlzIHRyYW5zZmVyZWQgTVNCIGZpcnN0IgorICogVG8gbWUgdGhhdCBzYXlzIGJpZy1lbmRp
YW4KKyAqIFNvIHRlbGwgQUxTQSB3ZSBvbmx5IGRvIFNORFJWX1BDTV9GTVRCSVRfUzI0X0JFCisg
KgorICogQXBwYXJlbnRseSBSQUQxIHNpbWlsYXIgc2VlIElQMzAgcGF0Y2ggc2V0CisgKgorICog
V2h5IHJld3JpdGU/IE1vc3RseSBzbyB0aGF0IEkgY2FuIHVuZGVyc3RhbmQgdGhlIGNvZGUsIHdy
aXRpbmcgaXMKKyAqIGJldHRlciB0aGVuIHJlYWRpbmcgZm9yIHRoYXQgcHVycG9zZSBJIGZpbmQu
CisgKi8KKy8qIGNoYW5uZWwgMC9BREMsIDEvREFDMSAtPiBwY20wCisgKiBjaGFubmVsIDIvREFD
MiAtPiBwY20xCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiBpbm