Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 179c0ac6 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
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.
parents ad15afb8 10cf15e1
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -413,8 +413,9 @@
#define __NR_renameat2		345
#define __NR_seccomp		346
#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.  */
#define KERN_FEATURE_MIXED_MODE_STACK	0x00000001
+66 −1
Original line number Diff line number Diff line
@@ -432,6 +432,11 @@ static void of_scan_pci_bridge(struct pci_pbm_info *pbm,
		       node->full_name);
		return;
	}

	if (ofpci_verbose)
		printk("    Bridge bus range [%u --> %u]\n",
		       busrange[0], busrange[1]);

	ranges = of_get_property(node, "ranges", &len);
	simba = 0;
	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]);
	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 */
	/* PCI #address-cells == 3 and #size-cells == 2 always */
	res = &dev->resource[PCI_BRIDGE_RESOURCES];
@@ -468,10 +477,29 @@ static void of_scan_pci_bridge(struct pci_pbm_info *pbm,
	}
	i = 1;
	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]);
		size = GET_64BIT(ranges, 6);
		if (flags == 0 || size == 0)
			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) {
			res = bus->resource[0];
			if (res->flags) {
@@ -490,8 +518,13 @@ static void of_scan_pci_bridge(struct pci_pbm_info *pbm,
		}

		res->flags = flags;
		region.start = GET_64BIT(ranges, 1);
		region.start = start = GET_64BIT(ranges, 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, &region);
	}
after_ranges:
@@ -584,6 +617,36 @@ static void pci_bus_register_of_sysfs(struct pci_bus *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 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_register_of_sysfs(bus);

	pci_claim_bus_resources(bus);

	return bus;
}

+1 −1
Original line number Diff line number Diff line
@@ -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
/*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
/*345*/	.long sys_renameat2, sys_seccomp, sys_getrandom
/*345*/	.long sys_renameat2, sys_seccomp, sys_getrandom, sys_memfd_create
+2 −2
Original line number Diff line number Diff line
@@ -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
	.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
	.word sys32_renameat2, sys_seccomp, sys_getrandom
	.word sys32_renameat2, sys_seccomp, sys_getrandom, sys_memfd_create

#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
	.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
	.word sys_renameat2, sys_seccomp, sys_getrandom
	.word sys_renameat2, sys_seccomp, sys_getrandom, sys_memfd_create