From 08fa0b17d91348290772c5b75bc60e38f8d42bad Mon Sep 17 00:00:00 2001 From: Mark Kettenis Date: Sat, 11 Apr 2009 17:13:34 +0000 Subject: Create extents for resource accounting on the root PCI bus and populate them based on the BIOS memory map. --- sys/arch/amd64/amd64/mainbus.c | 6 ++++- sys/arch/amd64/include/pci_machdep.h | 6 ++++- sys/arch/amd64/pci/pci_machdep.c | 42 ++++++++++++++++++++++++++++++++++- sys/arch/i386/i386/mainbus.c | 6 ++++- sys/arch/i386/pci/pci_machdep.c | 43 ++++++++++++++++++++++++++++++++++-- sys/arch/i386/pci/pci_machdep.h | 6 ++++- 6 files changed, 102 insertions(+), 7 deletions(-) (limited to 'sys') diff --git a/sys/arch/amd64/amd64/mainbus.c b/sys/arch/amd64/amd64/mainbus.c index 9d643bc9e94..bffd3b32e32 100644 --- a/sys/arch/amd64/amd64/mainbus.c +++ b/sys/arch/amd64/amd64/mainbus.c @@ -1,4 +1,4 @@ -/* $OpenBSD: mainbus.c,v 1.17 2009/03/31 22:19:57 kettenis Exp $ */ +/* $OpenBSD: mainbus.c,v 1.18 2009/04/11 17:13:33 kettenis Exp $ */ /* $NetBSD: mainbus.c,v 1.1 2003/04/26 18:39:29 fvdl Exp $ */ /* @@ -196,11 +196,15 @@ mainbus_attach(struct device *parent, struct device *self, void *aux) #if NPCI > 0 if (pci_mode != 0) { + pci_init_extents(); + bzero(&mba.mba_pba, sizeof(mba.mba_pba)); mba.mba_pba.pba_busname = "pci"; mba.mba_pba.pba_iot = X86_BUS_SPACE_IO; mba.mba_pba.pba_memt = X86_BUS_SPACE_MEM; mba.mba_pba.pba_dmat = &pci_bus_dma_tag; + mba.mba_pba.pba_ioex = pciio_ex; + mba.mba_pba.pba_memex = pcimem_ex; mba.mba_pba.pba_domain = pci_ndomains++; mba.mba_pba.pba_bus = 0; config_found(self, &mba.mba_pba, mainbus_print); diff --git a/sys/arch/amd64/include/pci_machdep.h b/sys/arch/amd64/include/pci_machdep.h index de5e88d3146..f9e754a32df 100644 --- a/sys/arch/amd64/include/pci_machdep.h +++ b/sys/arch/amd64/include/pci_machdep.h @@ -1,4 +1,4 @@ -/* $OpenBSD: pci_machdep.h,v 1.9 2009/04/04 16:03:17 kettenis Exp $ */ +/* $OpenBSD: pci_machdep.h,v 1.10 2009/04/11 17:13:33 kettenis Exp $ */ /* $NetBSD: pci_machdep.h,v 1.1 2003/02/26 21:26:11 fvdl Exp $ */ /* @@ -78,6 +78,10 @@ extern int pci_mode; int pci_mode_detect(void); struct pci_attach_args; +extern struct extent *pciio_ex; +extern struct extent *pcimem_ex; +void pci_init_extents(void); + /* * Functions provided to machine-independent PCI code. */ diff --git a/sys/arch/amd64/pci/pci_machdep.c b/sys/arch/amd64/pci/pci_machdep.c index 96b62150d83..e91d7e8215f 100644 --- a/sys/arch/amd64/pci/pci_machdep.c +++ b/sys/arch/amd64/pci/pci_machdep.c @@ -1,4 +1,4 @@ -/* $OpenBSD: pci_machdep.c,v 1.24 2009/04/04 16:03:17 kettenis Exp $ */ +/* $OpenBSD: pci_machdep.c,v 1.25 2009/04/11 17:13:33 kettenis Exp $ */ /* $NetBSD: pci_machdep.c,v 1.3 2003/05/07 21:33:58 fvdl Exp $ */ /*- @@ -79,6 +79,8 @@ #include #include #include +#include +#include #include @@ -86,6 +88,7 @@ #include #include +#include #include #include @@ -549,3 +552,40 @@ pci_intr_disestablish(pci_chipset_tag_t pc, void *cookie) { intr_disestablish(cookie); } + +struct extent *pciio_ex; +struct extent *pcimem_ex; + +void +pci_init_extents(void) +{ + bios_memmap_t *bmp; + u_int64_t size; + + if (pciio_ex == NULL) + pciio_ex = extent_create("pciio", 0, 0xffff, M_DEVBUF, + NULL, 0, EX_NOWAIT); + + if (pcimem_ex == NULL) { + pcimem_ex = extent_create("pcimem", 0, 0xffffffff, M_DEVBUF, + NULL, 0, EX_NOWAIT); + if (pcimem_ex == NULL) + return; + + for (bmp = bios_memmap; bmp->type != BIOS_MAP_END; bmp++) { + /* + * Ignore address space beyond 4G. + */ + if (bmp->addr >= 0x100000000ULL) + continue; + size = bmp->size; + if (bmp->addr + size >= 0x100000000ULL) + size = 0x100000000ULL - bmp->addr; + + if (extent_alloc_region(pcimem_ex, bmp->addr, size, + EX_NOWAIT)) + printf("memory map conflict 0x%llx/0x%llx\n", + bmp->addr, bmp->size); + } + } +} diff --git a/sys/arch/i386/i386/mainbus.c b/sys/arch/i386/i386/mainbus.c index 6abffc03463..eeaa040ca42 100644 --- a/sys/arch/i386/i386/mainbus.c +++ b/sys/arch/i386/i386/mainbus.c @@ -1,4 +1,4 @@ -/* $OpenBSD: mainbus.c,v 1.44 2009/03/31 21:57:57 kettenis Exp $ */ +/* $OpenBSD: mainbus.c,v 1.45 2009/04/11 17:13:32 kettenis Exp $ */ /* $NetBSD: mainbus.c,v 1.21 1997/06/06 23:14:20 thorpej Exp $ */ /* @@ -231,11 +231,15 @@ mainbus_attach(struct device *parent, struct device *self, void *aux) */ #if NPCI > 0 if (pci_mode_detect() != 0) { + pci_init_extents(); + bzero(&mba.mba_pba, sizeof(mba.mba_pba)); mba.mba_pba.pba_busname = "pci"; mba.mba_pba.pba_iot = I386_BUS_SPACE_IO; mba.mba_pba.pba_memt = I386_BUS_SPACE_MEM; mba.mba_pba.pba_dmat = &pci_bus_dma_tag; + mba.mba_pba.pba_ioex = pciio_ex; + mba.mba_pba.pba_memex = pcimem_ex; mba.mba_pba.pba_domain = pci_ndomains++; mba.mba_pba.pba_bus = 0; config_found(self, &mba.mba_pba, mainbus_print); diff --git a/sys/arch/i386/pci/pci_machdep.c b/sys/arch/i386/pci/pci_machdep.c index f37a299fe33..de60d8500d2 100644 --- a/sys/arch/i386/pci/pci_machdep.c +++ b/sys/arch/i386/pci/pci_machdep.c @@ -1,4 +1,4 @@ -/* $OpenBSD: pci_machdep.c,v 1.45 2009/03/10 15:03:17 oga Exp $ */ +/* $OpenBSD: pci_machdep.c,v 1.46 2009/04/11 17:13:33 kettenis Exp $ */ /* $NetBSD: pci_machdep.c,v 1.28 1997/06/06 23:29:17 thorpej Exp $ */ /*- @@ -79,16 +79,18 @@ #include #include #include +#include +#include #include #include #include #include +#include #include "bios.h" #if NBIOS > 0 -#include extern bios_pciinfo_t *bios_pciinfo; #endif @@ -600,3 +602,40 @@ pci_intr_disestablish(pci_chipset_tag_t pc, void *cookie) /* XXX oh, unroute the pci int link? */ isa_intr_disestablish(NULL, cookie); } + +struct extent *pciio_ex; +struct extent *pcimem_ex; + +void +pci_init_extents(void) +{ + bios_memmap_t *bmp; + u_int64_t size; + + if (pciio_ex == NULL) + pciio_ex = extent_create("pciio", 0, 0xffff, M_DEVBUF, + NULL, 0, EX_NOWAIT); + + if (pcimem_ex == NULL) { + pcimem_ex = extent_create("pcimem", 0, 0xffffffff, M_DEVBUF, + NULL, 0, EX_NOWAIT); + if (pcimem_ex == NULL) + return; + + for (bmp = bios_memmap; bmp->type != BIOS_MAP_END; bmp++) { + /* + * Ignore address space beyond 4G. + */ + if (bmp->addr >= 0x100000000ULL) + continue; + size = bmp->size; + if (bmp->addr + size >= 0x100000000ULL) + size = 0x100000000ULL - bmp->addr; + + if (extent_alloc_region(pcimem_ex, bmp->addr, size, + EX_NOWAIT)) + printf("memory map conflict 0x%llx/0x%llx\n", + bmp->addr, bmp->size); + } + } +} diff --git a/sys/arch/i386/pci/pci_machdep.h b/sys/arch/i386/pci/pci_machdep.h index 778e632e5bc..0e840843711 100644 --- a/sys/arch/i386/pci/pci_machdep.h +++ b/sys/arch/i386/pci/pci_machdep.h @@ -1,4 +1,4 @@ -/* $OpenBSD: pci_machdep.h,v 1.14 2008/12/06 19:59:38 tedu Exp $ */ +/* $OpenBSD: pci_machdep.h,v 1.15 2009/04/11 17:13:33 kettenis Exp $ */ /* $NetBSD: pci_machdep.h,v 1.7 1997/06/06 23:29:18 thorpej Exp $ */ /* @@ -77,6 +77,10 @@ struct { extern int pci_mode; int pci_mode_detect(void); +extern struct extent *pciio_ex; +extern struct extent *pcimem_ex; +void pci_init_extents(void); + /* * Functions provided to machine-independent PCI code. */ -- cgit v1.2.3