[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Vrpciu and Vrc4173bcu interrupt handling



"TAKEMURA Shin" <takemura@netbsd.org> writes:
> Vrpciu と Vrc4173bcu の割り込みまわりを config_hook をつかって書き直し、
> Vrpciu を Vrc4173 非依存にしました。
> 
> これなら L-Router も無理なくマージできるんじゃないかとおもいます。
> ちょっと見てみてください>篠原さん

こんな感じでいいのでしょうか?

以下のような変更を加えたカーネルで、IDEドライバとfxpドライバが動作するこ
とは確認しました。

1. arch/hpc/hpc/config_hook.hに必要な定義を足す

Index: arch/hpc/hpc/config_hook.h
===================================================================
RCS file: /cvsroot/syssrc/sys/arch/hpc/hpc/config_hook.h,v
retrieving revision 1.5
diff -u -r1.5 config_hook.h
--- arch/hpc/hpc/config_hook.h	2002/01/13 14:00:39	1.5
+++ arch/hpc/hpc/config_hook.h	2002/01/14 06:36:56
@@ -274,7 +274,10 @@
 #define CHARGE		CONFIG_HOOK_CHARGE
 /* PCI interrupt */
 #define PCIINTR_ID(bus, dev, func)	CONFIG_HOOK_PCIINTR_ID(bus, dev, func)
+#define PCIINTR_00_00_00	PCIINTR_ID(0,  0, 0)
+#define PCIINTR_00_01_00	PCIINTR_ID(0,  1, 0)
 #define PCIINTR_00_12_00	PCIINTR_ID(0, 12, 0)
+#define PCIINTR_00_16_00	PCIINTR_ID(0, 16, 0)
 #define PCIINTR_00_19_00	PCIINTR_ID(0, 19, 0)
 #endif /* CONFIG_HOOK_DEFINE_NICKNAME */
 
2. L-Router用のコンフィグファイルにPCIデバイスの割り込み接続関係を記述

[該当部分を抜粋]

hpcioman0 at vrgiu? platform LASER5_L_BOARD
# bus 0, device 0, function 0	i82559 #0 LAN(eth0)
hpcin*	at hpcioman0 evtype PCIINTR id PCIINTR_00_00_00 port 12 level 0 hold 1 connect 1
# bus 0, device 1, function 0	i82559 #1 LAN(eth1)
hpcin*	at hpcioman0 evtype PCIINTR id PCIINTR_00_01_00 port 13 level 0 hold 1 connect 1
# bus 0, device 16, function 0	M1543C/M5229 (IDE controller)
hpcin*	at hpcioman0 evtype PCIINTR id PCIINTR_00_16_00 port 11 level 1 hold 1 connect 1

3. vrpciu.cにpciide_machdep_compat_intr_establish()を足す(pciideドライバ
   のために必要)

(L-RouterのROMモニタのPCIのコンフィグレーションのバグを回避するためのコー
ドも入っています。)

pciide_machdep_compat_intr_establish()は他のアーキテクチャでは独立したファ
イル(pciide_machdep.c)として存在していますが、10行くらいしかない関数のた
めにファイルを増やすのも面倒だったのでここに入れています。

Index: arch/hpcmips/vr/vrpciu.c
===================================================================
RCS file: /cvsroot/syssrc/sys/arch/hpcmips/vr/vrpciu.c,v
retrieving revision 1.4
diff -u -r1.4 vrpciu.c
--- arch/hpcmips/vr/vrpciu.c	2002/01/13 14:18:32	1.4
+++ arch/hpcmips/vr/vrpciu.c	2002/01/14 06:58:46
@@ -34,9 +34,13 @@
 #include <machine/bus_space_hpcmips.h>
 #include <machine/bus_dma_hpcmips.h>
 #include <machine/config_hook.h>
+#include <machine/platid.h>
+#include <machine/platid_mask.h>
 
 #include <dev/pci/pcivar.h>
 #include <dev/pci/pcidevs.h>
+#include <dev/pci/pciidereg.h>
+#include <dev/pci/pciidevar.h>
 
 #include <hpcmips/vr/icureg.h>
 #include <hpcmips/vr/vripvar.h>
@@ -95,6 +99,9 @@
 		    int, int (*)(void *), void *);
 static void	vrpciu_intr_disestablish(pci_chipset_tag_t, void *);
 
+       void	*pciide_machdep_compat_intr_establish(struct device *,
+		    struct pci_attach_args *, int, int (*)(void *), void *);
+
 struct cfattach vrpciu_ca = {
 	sizeof(struct vrpciu_softc), vrpciu_match, vrpciu_attach
 };
@@ -294,8 +301,12 @@
 	pba.pba_memt = sc->sc_iot;
 	pba.pba_dmat = &hpcmips_default_bus_dma_tag.bdt;
 	pba.pba_bus = 0;
-	pba.pba_flags = PCI_FLAGS_IO_ENABLED | PCI_FLAGS_MEM_ENABLED |
-	    PCI_FLAGS_MRL_OKAY;
+	if (platid_match(&platid, &platid_mask_MACH_LASER5_L_BOARD))
+		/* XXX: disable PCI memory space */
+		pba.pba_flags = PCI_FLAGS_IO_ENABLED | PCI_FLAGS_MRL_OKAY;
+	else
+		pba.pba_flags = PCI_FLAGS_IO_ENABLED | PCI_FLAGS_MEM_ENABLED |
+			PCI_FLAGS_MRL_OKAY;
 	pba.pba_pc = pc;
 
 	config_found(self, &pba, vrpciu_print);
@@ -503,4 +514,14 @@
 
 	DPRINTF(("vrpciu_intr_disestablish: %p\n", sc));
 	config_unhook(cookie);
+}
+
+void *
+pciide_machdep_compat_intr_establish(struct device *devp,
+    struct pci_attach_args *pa, int chan, int (*func)(void *), void *arg)
+{
+	pci_intr_handle_t ih;
+
+	(void)vrpciu_intr_map(pa, &ih);
+	return vrpciu_intr_establish(pa->pa_pc, ih, 0, func, arg);
 }

篠原