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

Commit 7b2c3c5b authored by Stephen Rothwell's avatar Stephen Rothwell Committed by Paul Mackerras
Browse files

[POWERPC] Fix section mismatch in PCI code



Create a helper function (alloc_maybe_bootmem) that is marked __init_refok
to limit the chances of mistakenly referring to other __init routines.

WARNING: vmlinux.o(.text+0x2a9c4): Section mismatch: reference to .init.text:.__alloc_bootmem (between '.update_dn_pci_info' and '.pci_dn_reconfig_notifier')
WARNING: vmlinux.o(.text+0x36430): Section mismatch: reference to .init.text:.__alloc_bootmem (between '.mpic_msi_init_allocator' and '.find_ht_magic_addr')
WARNING: vmlinux.o(.text+0x5e804): Section mismatch: reference to .init.text:.__alloc_bootmem (between '.celleb_setup_phb' and '.celleb_fake_pci_write_config')
WARNING: vmlinux.o(.text+0x5e8e8): Section mismatch: reference to .init.text:.__alloc_bootmem (between '.celleb_setup_phb' and '.celleb_fake_pci_write_config')
WARNING: vmlinux.o(.text+0x5e968): Section mismatch: reference to .init.text:.__alloc_bootmem (between '.celleb_setup_phb' and '.celleb_fake_pci_write_config')

Signed-off-by: default avatarStephen Rothwell <sfr@canb.auug.org.au>
Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
parent ee983079
Loading
Loading
Loading
Loading
+1 −6
Original line number Original line Diff line number Diff line
@@ -23,8 +23,6 @@
#include <linux/pci.h>
#include <linux/pci.h>
#include <linux/string.h>
#include <linux/string.h>
#include <linux/init.h>
#include <linux/init.h>
#include <linux/slab.h>
#include <linux/bootmem.h>


#include <asm/io.h>
#include <asm/io.h>
#include <asm/prom.h>
#include <asm/prom.h>
@@ -45,10 +43,7 @@ static void * __devinit update_dn_pci_info(struct device_node *dn, void *data)
	const u32 *regs;
	const u32 *regs;
	struct pci_dn *pdn;
	struct pci_dn *pdn;


	if (mem_init_done)
	pdn = alloc_maybe_bootmem(sizeof(*pdn), GFP_KERNEL);
		pdn = kmalloc(sizeof(*pdn), GFP_KERNEL);
	else
		pdn = alloc_bootmem(sizeof(*pdn));
	if (pdn == NULL)
	if (pdn == NULL)
		return NULL;
		return NULL;
	memset(pdn, 0, sizeof(*pdn));
	memset(pdn, 0, sizeof(*pdn));
+1 −1
Original line number Original line Diff line number Diff line
@@ -7,7 +7,7 @@ EXTRA_CFLAGS += -mno-minimal-toc
endif
endif


ifeq ($(CONFIG_PPC_MERGE),y)
ifeq ($(CONFIG_PPC_MERGE),y)
obj-y			:= string.o
obj-y			:= string.o alloc.o
obj-$(CONFIG_PPC32)	+= div64.o copy_32.o checksum_32.o
obj-$(CONFIG_PPC32)	+= div64.o copy_32.o checksum_32.o
endif
endif


+14 −0
Original line number Original line Diff line number Diff line
#include <linux/types.h>
#include <linux/init.h>
#include <linux/slab.h>
#include <linux/bootmem.h>

#include <asm/system.h>

void * __init_refok alloc_maybe_bootmem(size_t size, gfp_t mask)
{
	if (mem_init_done)
		return kmalloc(size, mask);
	else
		return alloc_bootmem(size);
}
+5 −14
Original line number Original line Diff line number Diff line
@@ -327,10 +327,7 @@ static int __init celleb_setup_fake_pci_device(struct device_node *node,


	size = 256;
	size = 256;
	config = &private->fake_config[devno][fn];
	config = &private->fake_config[devno][fn];
	if (mem_init_done)
	*config = alloc_maybe_bootmem(size, GFP_KERNEL);
		*config = kzalloc(size, GFP_KERNEL);
	else
		*config = alloc_bootmem(size);
	if (*config == NULL) {
	if (*config == NULL) {
		printk(KERN_ERR "PCI: "
		printk(KERN_ERR "PCI: "
		       "not enough memory for fake configuration space\n");
		       "not enough memory for fake configuration space\n");
@@ -341,10 +338,7 @@ static int __init celleb_setup_fake_pci_device(struct device_node *node,


	size = sizeof(struct celleb_pci_resource);
	size = sizeof(struct celleb_pci_resource);
	res = &private->res[devno][fn];
	res = &private->res[devno][fn];
	if (mem_init_done)
	*res = alloc_maybe_bootmem(size, GFP_KERNEL);
		*res = kzalloc(size, GFP_KERNEL);
	else
		*res = alloc_bootmem(size);
	if (*res == NULL) {
	if (*res == NULL) {
		printk(KERN_ERR
		printk(KERN_ERR
		       "PCI: not enough memory for resource data space\n");
		       "PCI: not enough memory for resource data space\n");
@@ -436,12 +430,9 @@ static int __init phb_set_bus_ranges(struct device_node *dev,


static void __init celleb_alloc_private_mem(struct pci_controller *hose)
static void __init celleb_alloc_private_mem(struct pci_controller *hose)
{
{
	if (mem_init_done)
	hose->private_data =
	hose->private_data =
			kzalloc(sizeof(struct celleb_pci_private), GFP_KERNEL);
		alloc_maybe_bootmem(sizeof(struct celleb_pci_private),
	else
			GFP_KERNEL);
		hose->private_data =
			alloc_bootmem(sizeof(struct celleb_pci_private));
}
}


int __init celleb_setup_phb(struct pci_controller *phb)
int __init celleb_setup_phb(struct pci_controller *phb)
+1 −5
Original line number Original line Diff line number Diff line
@@ -9,7 +9,6 @@
 */
 */


#include <linux/irq.h>
#include <linux/irq.h>
#include <linux/bootmem.h>
#include <linux/bitmap.h>
#include <linux/bitmap.h>
#include <linux/msi.h>
#include <linux/msi.h>
#include <asm/mpic.h>
#include <asm/mpic.h>
@@ -152,10 +151,7 @@ int mpic_msi_init_allocator(struct mpic *mpic)
	size = BITS_TO_LONGS(mpic->irq_count) * sizeof(long);
	size = BITS_TO_LONGS(mpic->irq_count) * sizeof(long);
	pr_debug("mpic: allocator bitmap size is 0x%x bytes\n", size);
	pr_debug("mpic: allocator bitmap size is 0x%x bytes\n", size);


	if (mem_init_done)
	mpic->hwirq_bitmap = alloc_maybe_bootmem(size, GFP_KERNEL);
		mpic->hwirq_bitmap = kmalloc(size, GFP_KERNEL);
	else
		mpic->hwirq_bitmap = alloc_bootmem(size);


	if (!mpic->hwirq_bitmap) {
	if (!mpic->hwirq_bitmap) {
		pr_debug("mpic: ENOMEM allocating allocator bitmap!\n");
		pr_debug("mpic: ENOMEM allocating allocator bitmap!\n");
Loading