mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-27 20:05:14 +07:00
38c0a74fe0
The MIPS implementation of pci_resource_to_user() introduced in v3.12 by commit4c2924b725
("MIPS: PCI: Use pci_resource_to_user to map pci memory space properly") incorrectly sets *end to the address of the byte after the resource, rather than the last byte of the resource. This results in userland seeing resources as a byte larger than they actually are, for example a 32 byte BAR will be reported by a tool such as lspci as being 33 bytes in size: Region 2: I/O ports at 1000 [disabled] [size=33] Correct this by subtracting one from the calculated end address, reporting the correct address to userland. Signed-off-by: Paul Burton <paul.burton@mips.com> Reported-by: Rui Wang <rui.wang@windriver.com> Fixes:4c2924b725
("MIPS: PCI: Use pci_resource_to_user to map pci memory space properly") Cc: James Hogan <jhogan@kernel.org> Cc: Ralf Baechle <ralf@linux-mips.org> Cc: Wolfgang Grandegger <wg@grandegger.com> Cc: linux-mips@linux-mips.org Cc: stable@vger.kernel.org # v3.12+ Patchwork: https://patchwork.linux-mips.org/patch/19829/
59 lines
1.5 KiB
C
59 lines
1.5 KiB
C
/*
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License as published by the
|
|
* Free Software Foundation; either version 2 of the License, or (at your
|
|
* option) any later version.
|
|
*
|
|
* Copyright (C) 2003, 04, 11 Ralf Baechle (ralf@linux-mips.org)
|
|
* Copyright (C) 2011 Wind River Systems,
|
|
* written by Ralf Baechle (ralf@linux-mips.org)
|
|
*/
|
|
#include <linux/bug.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/mm.h>
|
|
#include <linux/bootmem.h>
|
|
#include <linux/export.h>
|
|
#include <linux/init.h>
|
|
#include <linux/types.h>
|
|
#include <linux/pci.h>
|
|
#include <linux/of_address.h>
|
|
|
|
#include <asm/cpu-info.h>
|
|
|
|
unsigned long PCIBIOS_MIN_IO;
|
|
EXPORT_SYMBOL(PCIBIOS_MIN_IO);
|
|
|
|
unsigned long PCIBIOS_MIN_MEM;
|
|
EXPORT_SYMBOL(PCIBIOS_MIN_MEM);
|
|
|
|
static int __init pcibios_set_cache_line_size(void)
|
|
{
|
|
unsigned int lsize;
|
|
|
|
/*
|
|
* Set PCI cacheline size to that of the highest level in the
|
|
* cache hierarchy.
|
|
*/
|
|
lsize = cpu_dcache_line_size();
|
|
lsize = cpu_scache_line_size() ? : lsize;
|
|
lsize = cpu_tcache_line_size() ? : lsize;
|
|
|
|
BUG_ON(!lsize);
|
|
|
|
pci_dfl_cache_line_size = lsize >> 2;
|
|
|
|
pr_debug("PCI: pci_cache_line_size set to %d bytes\n", lsize);
|
|
return 0;
|
|
}
|
|
arch_initcall(pcibios_set_cache_line_size);
|
|
|
|
void pci_resource_to_user(const struct pci_dev *dev, int bar,
|
|
const struct resource *rsrc, resource_size_t *start,
|
|
resource_size_t *end)
|
|
{
|
|
phys_addr_t size = resource_size(rsrc);
|
|
|
|
*start = fixup_bigphys_addr(rsrc->start, size);
|
|
*end = rsrc->start + size - 1;
|
|
}
|