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

Commit f483d392 authored by Ram Pai's avatar Ram Pai Committed by Jesse Barnes
Browse files

PCI: conditional resource-reallocation through kernel parameter pci=realloc


    
Multiple attempts to dynamically reallocate pci resources have
unfortunately lead to regressions. Though we continue to fix the
regressions and fine tune the dynamic-reallocation behavior, we have not
reached a acceptable state yet.
    
This patch provides a interim solution. It disables dynamic reallocation
by default, but adds the ability to enable it through pci=realloc kernel
command line parameter.
    
Tested-by: default avatarOliver Hartkopp <socketcan@hartkopp.net>
Signed-off-by: default avatarRam Pai <linuxram@us.ibm.com>
Signed-off-by: default avatarJesse Barnes <jbarnes@virtuousgeek.org>
parent a2fa83fa
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -2015,6 +2015,8 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
				the default.
				the default.
				off: Turn ECRC off
				off: Turn ECRC off
				on: Turn ECRC on.
				on: Turn ECRC on.
		realloc		reallocate PCI resources if allocations done by BIOS
				are erroneous.


	pcie_aspm=	[PCIE] Forcibly enable or disable PCIe Active State Power
	pcie_aspm=	[PCIE] Forcibly enable or disable PCIe Active State Power
			Management.
			Management.
+2 −0
Original line number Original line Diff line number Diff line
@@ -3483,6 +3483,8 @@ static int __init pci_setup(char *str)
				pci_no_msi();
				pci_no_msi();
			} else if (!strcmp(str, "noaer")) {
			} else if (!strcmp(str, "noaer")) {
				pci_no_aer();
				pci_no_aer();
			} else if (!strncmp(str, "realloc", 7)) {
				pci_realloc();
			} else if (!strcmp(str, "nodomains")) {
			} else if (!strcmp(str, "nodomains")) {
				pci_no_domains();
				pci_no_domains();
			} else if (!strncmp(str, "cbiosize=", 9)) {
			} else if (!strncmp(str, "cbiosize=", 9)) {
+2 −0
Original line number Original line Diff line number Diff line
@@ -146,6 +146,8 @@ static inline void pci_no_msi(void) { }
static inline void pci_msi_init_pci_dev(struct pci_dev *dev) { }
static inline void pci_msi_init_pci_dev(struct pci_dev *dev) { }
#endif
#endif


extern void pci_realloc(void);

static inline int pci_no_d1d2(struct pci_dev *dev)
static inline int pci_no_d1d2(struct pci_dev *dev)
{
{
	unsigned int parent_dstates = 0;
	unsigned int parent_dstates = 0;
+15 −0
Original line number Original line Diff line number Diff line
@@ -47,6 +47,13 @@ struct resource_list_x {
	(head)->next = NULL;				\
	(head)->next = NULL;				\
} while (0)
} while (0)


int pci_realloc_enable = 0;
#define pci_realloc_enabled() pci_realloc_enable
void pci_realloc(void)
{
	pci_realloc_enable = 1;
}

/**
/**
 * add_to_list() - add a new resource tracker to the list
 * add_to_list() - add a new resource tracker to the list
 * @head:	Head of the list
 * @head:	Head of the list
@@ -1025,6 +1032,7 @@ static int __init pci_get_max_depth(void)
	return depth;
	return depth;
}
}



/*
/*
 * first try will not touch pci bridge res
 * first try will not touch pci bridge res
 * second  and later try will clear small leaf bridge res
 * second  and later try will clear small leaf bridge res
@@ -1068,6 +1076,13 @@ pci_assign_unassigned_resources(void)
	/* any device complain? */
	/* any device complain? */
	if (!head.next)
	if (!head.next)
		goto enable_and_dump;
		goto enable_and_dump;

	/* don't realloc if asked to do so */
	if (!pci_realloc_enabled()) {
		free_list(resource_list_x, &head);
		goto enable_and_dump;
	}

	failed_type = 0;
	failed_type = 0;
	for (list = head.next; list;) {
	for (list = head.next; list;) {
		failed_type |= list->flags;
		failed_type |= list->flags;