lkml.org 
[lkml]   [2007]   [Dec]   [17]   [last100]   RSS Feed
Views: [more markup]  [less markup]  [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    FromBenjamin Herrenschmidt <>
    DateTue, 18 Dec 2007 10:01:15 +1100
    Subject[RFC/PATCH 4/4] [POWERPC] pci: Disable IO/Mem on a device when resources can't be allocated
    This patch changes the PowerPC PCI code to disable IO and/or Memory
    decoding on a PCI device when a resource of that type failed to be
    allocated. This is done to avoid having unallocated dangling BARs enabled
    that might try to decode on top of other devices.
    
    If a proper resource is assigned later on, then pci_enable_device{,_io,_mem}
    will take care of re-enabling decoding.
    Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
    ---
    NOTE: This patch doesn't apply on current upstream, but rather on top
    of a serie that merges 32 and 64 bits PowerPC PCI resource handling, and
    which will be in 2.6.25. I post it here mostly to show what I think should
    be done. A similar patch will have to be done for other architectures.
    
     arch/powerpc/kernel/pci-common.c |   13 ++++++++++---
     1 file changed, 10 insertions(+), 3 deletions(-)
    --- linux-work.orig/arch/powerpc/kernel/pci-common.c	2007-12-18 09:37:52.000000000 +1100
    +++ linux-work/arch/powerpc/kernel/pci-common.c	2007-12-18 09:39:27.000000000 +1100
    @@ -1016,7 +1016,7 @@ static void __init pcibios_allocate_bus_
     	}
     }
     
    -static inline void __devinit alloc_resource(struct pci_dev *dev, int idx)
    +static inline int __devinit alloc_resource(struct pci_dev *dev, int idx)
     {
     	struct resource *pr, *r = &dev->resource[idx];
     
    @@ -1040,7 +1040,10 @@ static inline void __devinit alloc_resou
     		r->flags |= IORESOURCE_UNSET;
     		r->end -= r->start;
     		r->start = 0;
    +
    +		return -EBUSY;
     	}
    +	return 0;
     }
     
     static void __init pcibios_allocate_resources(int pass)
    @@ -1062,8 +1065,12 @@ static void __init pcibios_allocate_reso
     				disabled = !(command & PCI_COMMAND_IO);
     			else
     				disabled = !(command & PCI_COMMAND_MEMORY);
    -			if (pass == disabled)
    -				alloc_resource(dev, idx);
    +			if (pass == disabled && alloc_resource(dev, idx)) {
    +				command &= ~(r->flags & (IORESOURCE_IO |
    +							 IORESOURCE_MEM));
    +				pci_write_config_word(dev,
    +						      PCI_COMMAND, command);
    +			}
     		}
     		if (pass)
     			continue;
    
    
    \
     
     \ /
      Last update: 2007-12-18 00:05    [from the cache]
    ©2003-2008