Module Name: src Committed By: snj Date: Fri Jan 16 08:22:25 UTC 2015
Modified Files: src/sys/arch/x86/pci [netbsd-6]: ichlpcib.c src/sys/dev/ic [netbsd-6]: i82801lpcreg.h src/sys/dev/pci [netbsd-6]: pci_map.c pcivar.h Log Message: Pull up following revision(s) (requested by msaitoh in ticket #1229): sys/arch/x86/pci/ichlpcib.c: revision 1.40, 1.45 sys/dev/pci/pcivar.h: revision 1.101 sys/dev/pci/pci_map.c: revision 1.32 sys/dev/ic/i82801lpcreg.h: revision 1.12 Use '\n' at the end of all aprint_error_dev() format strings. -- Fix a bug that ichlpcib(4) maps I/O area incorrectly and then fails to attach gpio. It might also fixes ACPI related problem described in PR#48960: - The LPCIB_PCI_PMBASE and LPCIB_PCI_GPIO register are alike PCI BAR but not completely compatible with it. It's ok because the registers' addresses are out of BAR0-BAR5(0x10-0x24) and are located in the device-dependent header. The PMBASE and GPIO registers define the base address and the type but not describe the size. The size is fixed to 128bytes. So use pci_mapreg_submap(). - Make pci_mapreg_submap() extern again. - Fix the calculation of the map size in pci_mapreg_submap(). To generate a diff of this commit: cvs rdiff -u -r1.34 -r1.34.6.1 src/sys/arch/x86/pci/ichlpcib.c cvs rdiff -u -r1.11 -r1.11.14.1 src/sys/dev/ic/i82801lpcreg.h cvs rdiff -u -r1.29 -r1.29.10.1 src/sys/dev/pci/pci_map.c cvs rdiff -u -r1.98 -r1.98.2.1 src/sys/dev/pci/pcivar.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/x86/pci/ichlpcib.c diff -u src/sys/arch/x86/pci/ichlpcib.c:1.34 src/sys/arch/x86/pci/ichlpcib.c:1.34.6.1 --- src/sys/arch/x86/pci/ichlpcib.c:1.34 Thu Nov 17 20:04:25 2011 +++ src/sys/arch/x86/pci/ichlpcib.c Fri Jan 16 08:22:25 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: ichlpcib.c,v 1.34 2011/11/17 20:04:25 riz Exp $ */ +/* $NetBSD: ichlpcib.c,v 1.34.6.1 2015/01/16 08:22:25 snj Exp $ */ /*- * Copyright (c) 2004 The NetBSD Foundation, Inc. @@ -39,7 +39,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ichlpcib.c,v 1.34 2011/11/17 20:04:25 riz Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ichlpcib.c,v 1.34.6.1 2015/01/16 08:22:25 snj Exp $"); #include <sys/types.h> #include <sys/param.h> @@ -278,10 +278,15 @@ lpcibattach(device_t parent, device_t se * Part of our I/O registers are used as ACPI PM regs. * Since our ACPI subsystem accesses the I/O space directly so far, * we do not have to bother bus_space I/O map confliction. + * + * The PMBASE register is alike PCI BAR but not completely compatible + * with it. The PMBASE define the base address and the type but + * not describe the size. */ - if (pci_mapreg_map(pa, LPCIB_PCI_PMBASE, PCI_MAPREG_TYPE_IO, 0, - &sc->sc_iot, &sc->sc_ioh, NULL, &sc->sc_iosize)) { - aprint_error_dev(self, "can't map power management i/o space"); + if (pci_mapreg_submap(pa, LPCIB_PCI_PMBASE, PCI_MAPREG_TYPE_IO, 0, + LPCIB_PCI_PM_SIZE, 0, &sc->sc_iot, &sc->sc_ioh, NULL, + &sc->sc_iosize)) { + aprint_error_dev(self, "can't map power management i/o space\n"); return; } @@ -297,14 +302,14 @@ lpcibattach(device_t parent, device_t se rcba = pci_conf_read(sc->sc_pcib.sc_pc, sc->sc_pcib.sc_tag, LPCIB_RCBA); if ((rcba & LPCIB_RCBA_EN) == 0) { - aprint_error_dev(self, "RCBA is not enabled"); + aprint_error_dev(self, "RCBA is not enabled\n"); return; } rcba &= ~LPCIB_RCBA_EN; if (bus_space_map(sc->sc_rcbat, rcba, LPCIB_RCBA_SIZE, 0, &sc->sc_rcbah)) { - aprint_error_dev(self, "RCBA could not be mapped"); + aprint_error_dev(self, "RCBA could not be mapped\n"); return; } } @@ -1014,6 +1019,7 @@ lpcib_gpio_configure(device_t self) pcireg_t gpio_cntl; uint32_t use, io, bit; int pin, shift, base_reg, cntl_reg, reg; + int rv; /* this implies ICH >= 6, and thus different mapreg */ if (sc->sc_has_rcba) { @@ -1030,11 +1036,16 @@ lpcib_gpio_configure(device_t self) /* Is GPIO enabled? */ if ((gpio_cntl & LPCIB_PCI_GPIO_CNTL_EN) == 0) return; - - if (pci_mapreg_map(&sc->sc_pa, base_reg, PCI_MAPREG_TYPE_IO, 0, - &sc->sc_gpio_iot, &sc->sc_gpio_ioh, - NULL, &sc->sc_gpio_ios)) { - aprint_error_dev(self, "can't map general purpose i/o space\n"); + /* + * The GPIO_BASE register is alike PCI BAR but not completely + * compatible with it. The PMBASE define the base address and the type + * but not describe the size. + */ + rv = pci_mapreg_submap(&sc->sc_pa, base_reg, PCI_MAPREG_TYPE_IO, 0, + LPCIB_PCI_GPIO_SIZE, 0, &sc->sc_gpio_iot, &sc->sc_gpio_ioh, + NULL, &sc->sc_gpio_ios); + if (rv != 0) { + aprint_error_dev(self, "can't map general purpose i/o space(rv = %d)\n", rv); return; } Index: src/sys/dev/ic/i82801lpcreg.h diff -u src/sys/dev/ic/i82801lpcreg.h:1.11 src/sys/dev/ic/i82801lpcreg.h:1.11.14.1 --- src/sys/dev/ic/i82801lpcreg.h:1.11 Fri Jul 23 02:23:58 2010 +++ src/sys/dev/ic/i82801lpcreg.h Fri Jan 16 08:22:25 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: i82801lpcreg.h,v 1.11 2010/07/23 02:23:58 jakllsch Exp $ */ +/* $NetBSD: i82801lpcreg.h,v 1.11.14.1 2015/01/16 08:22:25 snj Exp $ */ /*- * Copyright (c) 2004 The NetBSD Foundation, Inc. @@ -40,6 +40,7 @@ * PCI configuration registers */ #define LPCIB_PCI_PMBASE 0x40 +#define LPCIB_PCI_PM_SIZE 0x00000080 #define LPCIB_PCI_ACPI_CNTL 0x44 # define LPCIB_PCI_ACPI_CNTL_EN (1 << 4) /* GPIO config registers ICH6+ */ @@ -51,6 +52,7 @@ #define LPCIB_PCI_TCO_CNTL 0x54 /* GPIO config registers ICH0-ICH5 */ #define LPCIB_PCI_GPIO_BASE 0x58 +#define LPCIB_PCI_GPIO_SIZE 0x00000080 #define LPCIB_PCI_GPIO_CNTL 0x5c #define LPCIB_PCI_GPIO_CNTL_EN (1 << 4) #define LPCIB_PCI_PIRQA_ROUT 0x60 Index: src/sys/dev/pci/pci_map.c diff -u src/sys/dev/pci/pci_map.c:1.29 src/sys/dev/pci/pci_map.c:1.29.10.1 --- src/sys/dev/pci/pci_map.c:1.29 Tue May 17 17:34:54 2011 +++ src/sys/dev/pci/pci_map.c Fri Jan 16 08:22:25 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: pci_map.c,v 1.29 2011/05/17 17:34:54 dyoung Exp $ */ +/* $NetBSD: pci_map.c,v 1.29.10.1 2015/01/16 08:22:25 snj Exp $ */ /*- * Copyright (c) 1998, 2000 The NetBSD Foundation, Inc. @@ -34,7 +34,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pci_map.c,v 1.29 2011/05/17 17:34:54 dyoung Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pci_map.c,v 1.29.10.1 2015/01/16 08:22:25 snj Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -43,10 +43,6 @@ __KERNEL_RCSID(0, "$NetBSD: pci_map.c,v #include <dev/pci/pcireg.h> #include <dev/pci/pcivar.h> -static int pci_mapreg_submap(const struct pci_attach_args *, int, pcireg_t, int, - bus_size_t, bus_size_t, bus_space_tag_t *, bus_space_handle_t *, - bus_addr_t *, bus_size_t *); - static int pci_io_find(pci_chipset_tag_t pc, pcitag_t tag, int reg, pcireg_t type, bus_addr_t *basep, bus_size_t *sizep, int *flagsp) @@ -279,7 +275,7 @@ pci_mapreg_map(const struct pci_attach_a handlep, basep, sizep); } -static int +int pci_mapreg_submap(const struct pci_attach_args *pa, int reg, pcireg_t type, int busflags, bus_size_t maxsize, bus_size_t offset, bus_space_tag_t *tagp, bus_space_handle_t *handlep, bus_addr_t *basep, bus_size_t *sizep) @@ -321,10 +317,10 @@ pci_mapreg_submap(const struct pci_attac * pci_mapreg_map. */ - maxsize = (maxsize && offset) ? maxsize : size; + maxsize = (maxsize != 0) ? maxsize : size; base += offset; - if ((maxsize < size && offset + maxsize <= size) || offset != 0) + if ((size < maxsize) || (size < (offset + maxsize))) return 1; if (bus_space_map(tag, base, maxsize, busflags | flags, &handle)) Index: src/sys/dev/pci/pcivar.h diff -u src/sys/dev/pci/pcivar.h:1.98 src/sys/dev/pci/pcivar.h:1.98.2.1 --- src/sys/dev/pci/pcivar.h:1.98 Sun Jan 29 11:31:38 2012 +++ src/sys/dev/pci/pcivar.h Fri Jan 16 08:22:25 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: pcivar.h,v 1.98 2012/01/29 11:31:38 drochner Exp $ */ +/* $NetBSD: pcivar.h,v 1.98.2.1 2015/01/16 08:22:25 snj Exp $ */ /* * Copyright (c) 1996, 1997 Christopher G. Demetriou. All rights reserved. @@ -269,6 +269,10 @@ int pci_mapreg_info(pci_chipset_tag_t, p int pci_mapreg_map(const struct pci_attach_args *, int, pcireg_t, int, bus_space_tag_t *, bus_space_handle_t *, bus_addr_t *, bus_size_t *); +int pci_mapreg_submap(const struct pci_attach_args *, int, pcireg_t, int, + bus_size_t, bus_size_t, bus_space_tag_t *, bus_space_handle_t *, + bus_addr_t *, bus_size_t *); + int pci_find_rom(const struct pci_attach_args *, bus_space_tag_t, bus_space_handle_t,