From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50920) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VK1fI-0000Hb-AY for qemu-devel@nongnu.org; Thu, 12 Sep 2013 03:50:17 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VK1fD-0004BC-NQ for qemu-devel@nongnu.org; Thu, 12 Sep 2013 03:50:12 -0400 Message-ID: <52317227.4080706@cn.fujitsu.com> Date: Thu, 12 Sep 2013 15:49:59 +0800 From: Xie Xianshan MIME-Version: 1.0 References: <522EC970.2000804@cn.fujitsu.com> <523025EF.6010406@cn.fujitsu.com> In-Reply-To: Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: quoted-printable Subject: Re: [Qemu-devel] Disabling IRQ error List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Max Filippov Cc: qemu-ppc , qemu-devel Hi Max, Thanks for your patience and help. I`ve tried to do what you said, but the problem doesn`t go away. And actually i cannot add a new register to the fpga device, because the=20 fpga device i`m emulating already exists in the real world. So i cannot change anything about hardware properties and linux driver=20 for this device. By the way, how did you finally fix your problem? Thanks, Simen =E4=BA=8E 2013/09/11 17:29, Max Filippov =E5=86=99=E9=81=93: > On Wed, Sep 11, 2013 at 12:12 PM, Xie Xianshan wro= te: >> I want to add a new device "fpga" for e500, and trigger an interrupt = IRQ3 >> while the register BB=5FINTR=5FREG which belongs to device "fpga" is wro= te by >> the device driver of "fpga". >> For e500, IRQ3 is an external interrupt irq. >> According the debug log, the disabling error is encoutered during wri= ting >> BB=5FINTR=5FREG register. >> - write BB=5FINTR=5FREG register >> - qemu=5Firq=5Fraise() is called. >> - after serval minutes, >> the error message about disabling irq is displayed. >> - continue the next execution without error(with poll?) > > So your device raises IRQ, but it doesn't lower it. Real devices > usually don't do that, they either generate a short pulse on the > IRQ line (in case of edge-triggered IRQ) or raise IRQ line on > some event and then lower it on a command from its driver > (level-triggered IRQ). > > You can do the following to make your device behave that way: > - make your fpga device capable of lowering its IRQ, e.g. by adding > another register: > >> static void fpga=5Fwrite(FPGAState *s, unsigned int offset, uint32=5Ft v= alue, >> unsigned size) { >> switch(offset) { >> case BB=5FINTR=5FREG: >> qemu=5Firq=5Fraise(s->irq); >> break; > case BB=5FINTC=5FREG: > qemu=5Firq=5Flower(s->irq); > break; >> } >> } > > - provide an interrupt service routine in the linux driver for your fpga > device that would check whether the interrupt was caused by its > device, and if so lower the device's IRQ. > > Thanks. > -- Max > > --=20 Best Regards Xie Xianshan -------------------------------------------------- Xie Xianshan Development Dept.I Nanjing Fujitsu Nanda Software Tech. Co., Ltd.(FNST) No. 6 Wenzhu Road, Nanjing, 210012, China PHONE: +86+25-86630566-9555 FUJITSU INTERNAL: 7998-9555 MAIL: xiexs@cn.fujitsu.com -------------------------------------------------- This communication is for use by the intended recipient(s) only and may contain information that is privileged, confidential and exempt from disclosure under applicable law. If you are not an intended recipient of this communication, you are hereby notified that any dissemination, distribution or copying hereof is strictly prohibited. If you have received this communication in error, please notify me by reply e-mail, permanently delete this communication from your system, and destroy any hard copies you may have printed =