Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc
Pull Sparc fixes from David Miller: "Hook up the memfd syscall, and properly claim all PCI resources discovered when building the PCI device tree" * git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc: sparc: Hook up memfd_create system call. sparc64: Properly claim resources as each PCI bus is probed. sparc64: Skip bogus PCI bridge ranges. sparc64: Expand PCI bridge probing debug logging.
This commit is contained in:
commit
179c0ac67b
|
@ -413,8 +413,9 @@
|
||||||
#define __NR_renameat2 345
|
#define __NR_renameat2 345
|
||||||
#define __NR_seccomp 346
|
#define __NR_seccomp 346
|
||||||
#define __NR_getrandom 347
|
#define __NR_getrandom 347
|
||||||
|
#define __NR_memfd_create 348
|
||||||
|
|
||||||
#define NR_syscalls 348
|
#define NR_syscalls 349
|
||||||
|
|
||||||
/* Bitmask values returned from kern_features system call. */
|
/* Bitmask values returned from kern_features system call. */
|
||||||
#define KERN_FEATURE_MIXED_MODE_STACK 0x00000001
|
#define KERN_FEATURE_MIXED_MODE_STACK 0x00000001
|
||||||
|
|
|
@ -432,6 +432,11 @@ static void of_scan_pci_bridge(struct pci_pbm_info *pbm,
|
||||||
node->full_name);
|
node->full_name);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ofpci_verbose)
|
||||||
|
printk(" Bridge bus range [%u --> %u]\n",
|
||||||
|
busrange[0], busrange[1]);
|
||||||
|
|
||||||
ranges = of_get_property(node, "ranges", &len);
|
ranges = of_get_property(node, "ranges", &len);
|
||||||
simba = 0;
|
simba = 0;
|
||||||
if (ranges == NULL) {
|
if (ranges == NULL) {
|
||||||
|
@ -451,6 +456,10 @@ static void of_scan_pci_bridge(struct pci_pbm_info *pbm,
|
||||||
pci_bus_insert_busn_res(bus, busrange[0], busrange[1]);
|
pci_bus_insert_busn_res(bus, busrange[0], busrange[1]);
|
||||||
bus->bridge_ctl = 0;
|
bus->bridge_ctl = 0;
|
||||||
|
|
||||||
|
if (ofpci_verbose)
|
||||||
|
printk(" Bridge ranges[%p] simba[%d]\n",
|
||||||
|
ranges, simba);
|
||||||
|
|
||||||
/* parse ranges property, or cook one up by hand for Simba */
|
/* parse ranges property, or cook one up by hand for Simba */
|
||||||
/* PCI #address-cells == 3 and #size-cells == 2 always */
|
/* PCI #address-cells == 3 and #size-cells == 2 always */
|
||||||
res = &dev->resource[PCI_BRIDGE_RESOURCES];
|
res = &dev->resource[PCI_BRIDGE_RESOURCES];
|
||||||
|
@ -468,10 +477,29 @@ static void of_scan_pci_bridge(struct pci_pbm_info *pbm,
|
||||||
}
|
}
|
||||||
i = 1;
|
i = 1;
|
||||||
for (; len >= 32; len -= 32, ranges += 8) {
|
for (; len >= 32; len -= 32, ranges += 8) {
|
||||||
|
u64 start;
|
||||||
|
|
||||||
|
if (ofpci_verbose)
|
||||||
|
printk(" RAW Range[%08x:%08x:%08x:%08x:%08x:%08x:"
|
||||||
|
"%08x:%08x]\n",
|
||||||
|
ranges[0], ranges[1], ranges[2], ranges[3],
|
||||||
|
ranges[4], ranges[5], ranges[6], ranges[7]);
|
||||||
|
|
||||||
flags = pci_parse_of_flags(ranges[0]);
|
flags = pci_parse_of_flags(ranges[0]);
|
||||||
size = GET_64BIT(ranges, 6);
|
size = GET_64BIT(ranges, 6);
|
||||||
if (flags == 0 || size == 0)
|
if (flags == 0 || size == 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
/* On PCI-Express systems, PCI bridges that have no devices downstream
|
||||||
|
* have a bogus size value where the first 32-bit cell is 0xffffffff.
|
||||||
|
* This results in a bogus range where start + size overflows.
|
||||||
|
*
|
||||||
|
* Just skip these otherwise the kernel will complain when the resource
|
||||||
|
* tries to be claimed.
|
||||||
|
*/
|
||||||
|
if (size >> 32 == 0xffffffff)
|
||||||
|
continue;
|
||||||
|
|
||||||
if (flags & IORESOURCE_IO) {
|
if (flags & IORESOURCE_IO) {
|
||||||
res = bus->resource[0];
|
res = bus->resource[0];
|
||||||
if (res->flags) {
|
if (res->flags) {
|
||||||
|
@ -490,8 +518,13 @@ static void of_scan_pci_bridge(struct pci_pbm_info *pbm,
|
||||||
}
|
}
|
||||||
|
|
||||||
res->flags = flags;
|
res->flags = flags;
|
||||||
region.start = GET_64BIT(ranges, 1);
|
region.start = start = GET_64BIT(ranges, 1);
|
||||||
region.end = region.start + size - 1;
|
region.end = region.start + size - 1;
|
||||||
|
|
||||||
|
if (ofpci_verbose)
|
||||||
|
printk(" Using flags[%08x] start[%016llx] size[%016llx]\n",
|
||||||
|
flags, start, size);
|
||||||
|
|
||||||
pcibios_bus_to_resource(dev->bus, res, ®ion);
|
pcibios_bus_to_resource(dev->bus, res, ®ion);
|
||||||
}
|
}
|
||||||
after_ranges:
|
after_ranges:
|
||||||
|
@ -584,6 +617,36 @@ static void pci_bus_register_of_sysfs(struct pci_bus *bus)
|
||||||
pci_bus_register_of_sysfs(child_bus);
|
pci_bus_register_of_sysfs(child_bus);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void pci_claim_bus_resources(struct pci_bus *bus)
|
||||||
|
{
|
||||||
|
struct pci_bus *child_bus;
|
||||||
|
struct pci_dev *dev;
|
||||||
|
|
||||||
|
list_for_each_entry(dev, &bus->devices, bus_list) {
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < PCI_NUM_RESOURCES; i++) {
|
||||||
|
struct resource *r = &dev->resource[i];
|
||||||
|
|
||||||
|
if (r->parent || !r->start || !r->flags)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (ofpci_verbose)
|
||||||
|
printk("PCI: Claiming %s: "
|
||||||
|
"Resource %d: %016llx..%016llx [%x]\n",
|
||||||
|
pci_name(dev), i,
|
||||||
|
(unsigned long long)r->start,
|
||||||
|
(unsigned long long)r->end,
|
||||||
|
(unsigned int)r->flags);
|
||||||
|
|
||||||
|
pci_claim_resource(dev, i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
list_for_each_entry(child_bus, &bus->children, node)
|
||||||
|
pci_claim_bus_resources(child_bus);
|
||||||
|
}
|
||||||
|
|
||||||
struct pci_bus *pci_scan_one_pbm(struct pci_pbm_info *pbm,
|
struct pci_bus *pci_scan_one_pbm(struct pci_pbm_info *pbm,
|
||||||
struct device *parent)
|
struct device *parent)
|
||||||
{
|
{
|
||||||
|
@ -614,6 +677,8 @@ struct pci_bus *pci_scan_one_pbm(struct pci_pbm_info *pbm,
|
||||||
pci_bus_add_devices(bus);
|
pci_bus_add_devices(bus);
|
||||||
pci_bus_register_of_sysfs(bus);
|
pci_bus_register_of_sysfs(bus);
|
||||||
|
|
||||||
|
pci_claim_bus_resources(bus);
|
||||||
|
|
||||||
return bus;
|
return bus;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -86,4 +86,4 @@ sys_call_table:
|
||||||
/*330*/ .long sys_fanotify_mark, sys_prlimit64, sys_name_to_handle_at, sys_open_by_handle_at, sys_clock_adjtime
|
/*330*/ .long sys_fanotify_mark, sys_prlimit64, sys_name_to_handle_at, sys_open_by_handle_at, sys_clock_adjtime
|
||||||
/*335*/ .long sys_syncfs, sys_sendmmsg, sys_setns, sys_process_vm_readv, sys_process_vm_writev
|
/*335*/ .long sys_syncfs, sys_sendmmsg, sys_setns, sys_process_vm_readv, sys_process_vm_writev
|
||||||
/*340*/ .long sys_ni_syscall, sys_kcmp, sys_finit_module, sys_sched_setattr, sys_sched_getattr
|
/*340*/ .long sys_ni_syscall, sys_kcmp, sys_finit_module, sys_sched_setattr, sys_sched_getattr
|
||||||
/*345*/ .long sys_renameat2, sys_seccomp, sys_getrandom
|
/*345*/ .long sys_renameat2, sys_seccomp, sys_getrandom, sys_memfd_create
|
||||||
|
|
|
@ -87,7 +87,7 @@ sys_call_table32:
|
||||||
/*330*/ .word compat_sys_fanotify_mark, sys_prlimit64, sys_name_to_handle_at, compat_sys_open_by_handle_at, compat_sys_clock_adjtime
|
/*330*/ .word compat_sys_fanotify_mark, sys_prlimit64, sys_name_to_handle_at, compat_sys_open_by_handle_at, compat_sys_clock_adjtime
|
||||||
.word sys_syncfs, compat_sys_sendmmsg, sys_setns, compat_sys_process_vm_readv, compat_sys_process_vm_writev
|
.word sys_syncfs, compat_sys_sendmmsg, sys_setns, compat_sys_process_vm_readv, compat_sys_process_vm_writev
|
||||||
/*340*/ .word sys_kern_features, sys_kcmp, sys_finit_module, sys_sched_setattr, sys_sched_getattr
|
/*340*/ .word sys_kern_features, sys_kcmp, sys_finit_module, sys_sched_setattr, sys_sched_getattr
|
||||||
.word sys32_renameat2, sys_seccomp, sys_getrandom
|
.word sys32_renameat2, sys_seccomp, sys_getrandom, sys_memfd_create
|
||||||
|
|
||||||
#endif /* CONFIG_COMPAT */
|
#endif /* CONFIG_COMPAT */
|
||||||
|
|
||||||
|
@ -166,4 +166,4 @@ sys_call_table:
|
||||||
/*330*/ .word sys_fanotify_mark, sys_prlimit64, sys_name_to_handle_at, sys_open_by_handle_at, sys_clock_adjtime
|
/*330*/ .word sys_fanotify_mark, sys_prlimit64, sys_name_to_handle_at, sys_open_by_handle_at, sys_clock_adjtime
|
||||||
.word sys_syncfs, sys_sendmmsg, sys_setns, sys_process_vm_readv, sys_process_vm_writev
|
.word sys_syncfs, sys_sendmmsg, sys_setns, sys_process_vm_readv, sys_process_vm_writev
|
||||||
/*340*/ .word sys_kern_features, sys_kcmp, sys_finit_module, sys_sched_setattr, sys_sched_getattr
|
/*340*/ .word sys_kern_features, sys_kcmp, sys_finit_module, sys_sched_setattr, sys_sched_getattr
|
||||||
.word sys_renameat2, sys_seccomp, sys_getrandom
|
.word sys_renameat2, sys_seccomp, sys_getrandom, sys_memfd_create
|
||||||
|
|
Loading…
Reference in New Issue