[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);
}
篠原