From owner-p4-projects@FreeBSD.ORG Thu Apr 28 06:02:23 2005 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id DB81F16A4D0; Thu, 28 Apr 2005 06:02:22 +0000 (GMT) Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id B448716A4CE for ; Thu, 28 Apr 2005 06:02:22 +0000 (GMT) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 7E55A43D39 for ; Thu, 28 Apr 2005 06:02:22 +0000 (GMT) (envelope-from marcel@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.1/8.13.1) with ESMTP id j3S62MoJ006115 for ; Thu, 28 Apr 2005 06:02:22 GMT (envelope-from marcel@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.1/8.13.1/Submit) id j3S62MQN006112 for perforce@freebsd.org; Thu, 28 Apr 2005 06:02:22 GMT (envelope-from marcel@freebsd.org) Date: Thu, 28 Apr 2005 06:02:22 GMT Message-Id: <200504280602.j3S62MQN006112@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to marcel@freebsd.org using -f From: Marcel Moolenaar To: Perforce Change Reviews Subject: PERFORCE change 76120 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 28 Apr 2005 06:02:23 -0000 http://perforce.freebsd.org/chv.cgi?CH=76120 Change 76120 by marcel@marcel_nfs on 2005/04/28 06:01:39 Next round of changes to allow VGA addresses across PCI-PCI bridges: o Add defines for all bits in the bridge control register to pcireg.h. Remove the one I added to pcib_private.h o Create inline versions to check for VGA address ranges in pcireg.h and remove the one I added to pci_pci.h o Have the APB driver use the new functions instead of duplicating the code. o Fix the VGA address range check to be conformant to the PCI-to-PCI Bridge architecture specification. Use <= to check the upper bound so that we use the exact same values as documented (without having the reader convert the inclusive addresses in the docs to the exclusive upper-bound addresses used in the code). Discussed with: imp, jhb BCR defines contributed by: jhb Affected files ... .. //depot/projects/tty/sys/dev/pci/pci_pci.c#10 edit .. //depot/projects/tty/sys/dev/pci/pcib_private.h#5 edit .. //depot/projects/tty/sys/dev/pci/pcireg.h#6 edit .. //depot/projects/tty/sys/dev/pci/pcivar.h#6 edit .. //depot/projects/tty/sys/sparc64/pci/apb.c#7 edit Differences ... ==== //depot/projects/tty/sys/dev/pci/pci_pci.c#10 (text+ko) ==== @@ -293,23 +293,6 @@ return (sc->iobase > 0 && sc->iobase < sc->iolimit); } -static __inline int -is_vga_resource(int type, u_long start, u_long end) -{ - switch (type) { - case SYS_RES_IOPORT: - if ((start >= 0x3b0 && end < 0x3bc) || - (start >= 0x3c0 && end < 0x3dc)) - return (1); - break; - case SYS_RES_MEMORY: - if (start >= 0xa0000 && end < 0xc0000) - return (1); - break; - } - return (0); -} - /* * We have to trap resource allocation requests and ensure that the bridge * is set up to, or capable of handling them. @@ -335,7 +318,7 @@ * Make sure we allow access to VGA I/O addresses when the * bridge has the "VGA Enable" bit set. */ - if (!ok && is_vga_resource(type, start, end)) + if (!ok && pci_is_vga_ioport_range(start, end)) ok = (sc->bridgectl & PCIB_BCR_VGA_ENABLE) ? 1 : 0; if ((sc->flags & PCIB_SUBTRACTIVE) == 0) { @@ -387,7 +370,7 @@ * Make sure we allow access to VGA memory addresses when the * bridge has the "VGA Enable" bit set. */ - if (!ok && is_vga_resource(type, start, end)) + if (!ok && pci_is_vga_memory_range(start, end)) ok = (sc->bridgectl & PCIB_BCR_VGA_ENABLE) ? 1 : 0; if ((sc->flags & PCIB_SUBTRACTIVE) == 0) { ==== //depot/projects/tty/sys/dev/pci/pcib_private.h#5 (text+ko) ==== @@ -57,7 +57,6 @@ uint32_t iolimit; /* topmost address of port window */ uint16_t secstat; /* secondary bus status register */ uint16_t bridgectl; /* bridge control register */ -#define PCIB_BCR_VGA_ENABLE (1 << 3) uint8_t seclat; /* secondary bus latency timer */ }; ==== //depot/projects/tty/sys/dev/pci/pcireg.h#6 (text+ko) ==== @@ -313,6 +313,19 @@ #define PCIC_OTHER 0xff +/* Bridge Control Values. */ +#define PCIB_BCR_PERR_ENABLE 0x0001 +#define PCIB_BCR_SERR_ENABLE 0x0002 +#define PCIB_BCR_ISA_ENABLE 0x0004 +#define PCIB_BCR_VGA_ENABLE 0x0008 +#define PCIB_BCR_MASTER_ABORT_MODE 0x0020 +#define PCIB_BCR_SECBUS_RESET 0x0040 +#define PCIB_BCR_SECBUS_BACKTOBACK 0x0080 +#define PCIB_BCR_PRI_DISCARD_TIMEOUT 0x0100 +#define PCIB_BCR_SEC_DISCARD_TIMEOUT 0x0200 +#define PCIB_BCR_DISCARD_TIMER_STATUS 0x0400 +#define PCIB_BCR_DISCARD_TIMER_SERREN 0x0800 + /* PCI power manangement */ #define PCIR_POWER_CAP 0x2 ==== //depot/projects/tty/sys/dev/pci/pcivar.h#6 (text+ko) ==== @@ -288,6 +288,24 @@ } /* + * Check if the address range falls within the VGA defined address range(s) + */ +static __inline int +pci_is_vga_ioport_range(u_long start, u_long end) +{ + + return (((start >= 0x3b0 && end <= 0x3bb) || + (start >= 0x3c0 && end <= 0x3df)) ? 1 : 0); +} + +static __inline int +pci_is_vga_memory_range(u_long start, u_long end) +{ + + return ((start >= 0xa0000 && end <= 0xbffff) ? 1 : 0); +} + +/* * PCI power states are as defined by ACPI: * * D0 State in which device is on and running. It is receiving full ==== //depot/projects/tty/sys/sparc64/pci/apb.c#7 (text+ko) ==== @@ -161,13 +161,6 @@ { int i, ei; - /* Allow the legacy VGA ranges. */ - if ((start >= 0x3b0 && end < 0x3bc) || - (start >= 0x3c0 && end < 0x3dc) || - (start >= 0xa0000 && end < 0xc0000)) - return (1); - - /* Check the map. */ i = start / scale; ei = end / scale; if (i > 7 || ei > 7) @@ -218,6 +211,7 @@ u_long start, u_long end, u_long count, u_int flags) { struct apb_softc *sc; + int ok; sc = device_get_softc(dev); @@ -240,7 +234,10 @@ */ switch (type) { case SYS_RES_IOPORT: - if (!apb_checkrange(sc->sc_iomap, APB_IO_SCALE, start, end)) { + ok = apb_checkrange(sc->sc_iomap, APB_IO_SCALE, start, end); + if (!ok && pci_is_vga_ioport_range(start, end)) + ok = 1; + if (!ok) { device_printf(dev, "device %s%d requested unsupported " "I/O range 0x%lx-0x%lx\n", device_get_name(child), device_get_unit(child), start, end); @@ -254,7 +251,10 @@ break; case SYS_RES_MEMORY: - if (!apb_checkrange(sc->sc_memmap, APB_MEM_SCALE, start, end)) { + ok = apb_checkrange(sc->sc_memmap, APB_MEM_SCALE, start, end); + if (!ok && pci_is_vga_memory_range(start, end)) + ok = 1; + if (!ok) { device_printf(dev, "device %s%d requested unsupported " "memory range 0x%lx-0x%lx\n", device_get_name(child), device_get_unit(child),