Commit 733abe4f authored by Linus Torvalds's avatar Linus Torvalds

Merge master.kernel.org:/pub/scm/linux/kernel/git/gregkh/pci-2.6

* master.kernel.org:/pub/scm/linux/kernel/git/gregkh/pci-2.6:
  PCI: Make PCI device numa-node attribute visible in sysfs
  PCI: add systems for automatic breadth-first device sorting
  PCI: PCI devices get assigned redundant IRQs
  PCI: Make CARDBUS_MEM_SIZE and CARDBUS_IO_SIZE boot options
  PCI: pci.txt fix __devexit() usage
  PCI/sysfs/kobject kernel-doc fixes
parents 5fe8252f 81bb0e19
...@@ -1275,6 +1275,12 @@ and is between 256 and 4096 characters. It is defined in the file ...@@ -1275,6 +1275,12 @@ and is between 256 and 4096 characters. It is defined in the file
This sorting is done to get a device This sorting is done to get a device
order compatible with older (<= 2.4) kernels. order compatible with older (<= 2.4) kernels.
nobfsort Don't sort PCI devices into breadth-first order. nobfsort Don't sort PCI devices into breadth-first order.
cbiosize=nn[KMG] The fixed amount of bus space which is
reserved for the CardBus bridge's IO window.
The default value is 256 bytes.
cbmemsize=nn[KMG] The fixed amount of bus space which is
reserved for the CardBus bridge's memory
window. The default value is 64 megabytes.
pcmv= [HW,PCMCIA] BadgePAD 4 pcmv= [HW,PCMCIA] BadgePAD 4
......
...@@ -205,8 +205,8 @@ Tips on when/where to use the above attributes: ...@@ -205,8 +205,8 @@ Tips on when/where to use the above attributes:
exclusively called by the probe() routine, can be marked __devinit. exclusively called by the probe() routine, can be marked __devinit.
Ditto for remove() and __devexit. Ditto for remove() and __devexit.
o If mydriver_probe() is marked with __devinit(), then all address o If mydriver_remove() is marked with __devexit(), then all address
references to mydriver_probe must use __devexit_p(mydriver_probe) references to mydriver_remove must use __devexit_p(mydriver_remove)
(in the struct pci_driver declaration for example). (in the struct pci_driver declaration for example).
__devexit_p() will generate the function name _or_ NULL if the __devexit_p() will generate the function name _or_ NULL if the
function will be discarded. For an example, see drivers/net/tg3.c. function will be discarded. For an example, see drivers/net/tg3.c.
......
...@@ -191,6 +191,94 @@ static struct dmi_system_id __devinitdata pciprobe_dmi_table[] = { ...@@ -191,6 +191,94 @@ static struct dmi_system_id __devinitdata pciprobe_dmi_table[] = {
DMI_MATCH(DMI_PRODUCT_NAME, "PowerEdge 2950"), DMI_MATCH(DMI_PRODUCT_NAME, "PowerEdge 2950"),
}, },
}, },
{
.callback = set_bf_sort,
.ident = "HP ProLiant BL20p G3",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "HP"),
DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant BL20p G3"),
},
},
{
.callback = set_bf_sort,
.ident = "HP ProLiant BL20p G4",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "HP"),
DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant BL20p G4"),
},
},
{
.callback = set_bf_sort,
.ident = "HP ProLiant BL30p G1",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "HP"),
DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant BL30p G1"),
},
},
{
.callback = set_bf_sort,
.ident = "HP ProLiant BL25p G1",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "HP"),
DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant BL25p G1"),
},
},
{
.callback = set_bf_sort,
.ident = "HP ProLiant BL35p G1",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "HP"),
DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant BL35p G1"),
},
},
{
.callback = set_bf_sort,
.ident = "HP ProLiant BL45p G1",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "HP"),
DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant BL45p G1"),
},
},
{
.callback = set_bf_sort,
.ident = "HP ProLiant BL45p G2",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "HP"),
DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant BL45p G2"),
},
},
{
.callback = set_bf_sort,
.ident = "HP ProLiant BL460c G1",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "HP"),
DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant BL460c G1"),
},
},
{
.callback = set_bf_sort,
.ident = "HP ProLiant BL465c G1",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "HP"),
DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant BL465c G1"),
},
},
{
.callback = set_bf_sort,
.ident = "HP ProLiant BL480c G1",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "HP"),
DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant BL480c G1"),
},
},
{
.callback = set_bf_sort,
.ident = "HP ProLiant BL685c G1",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "HP"),
DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant BL685c G1"),
},
},
{} {}
}; };
......
...@@ -415,6 +415,7 @@ static struct kobj_type pci_driver_kobj_type = { ...@@ -415,6 +415,7 @@ static struct kobj_type pci_driver_kobj_type = {
* __pci_register_driver - register a new pci driver * __pci_register_driver - register a new pci driver
* @drv: the driver structure to register * @drv: the driver structure to register
* @owner: owner module of drv * @owner: owner module of drv
* @mod_name: module name string
* *
* Adds the driver structure to the list of registered drivers. * Adds the driver structure to the list of registered drivers.
* Returns a negative value on error, otherwise 0. * Returns a negative value on error, otherwise 0.
......
...@@ -143,6 +143,14 @@ static ssize_t is_enabled_show(struct device *dev, ...@@ -143,6 +143,14 @@ static ssize_t is_enabled_show(struct device *dev,
return sprintf (buf, "%u\n", atomic_read(&pdev->enable_cnt)); return sprintf (buf, "%u\n", atomic_read(&pdev->enable_cnt));
} }
#ifdef CONFIG_NUMA
static ssize_t
numa_node_show(struct device *dev, struct device_attribute *attr, char *buf)
{
return sprintf (buf, "%d\n", dev->numa_node);
}
#endif
static ssize_t static ssize_t
msi_bus_show(struct device *dev, struct device_attribute *attr, char *buf) msi_bus_show(struct device *dev, struct device_attribute *attr, char *buf)
{ {
...@@ -194,6 +202,9 @@ struct device_attribute pci_dev_attrs[] = { ...@@ -194,6 +202,9 @@ struct device_attribute pci_dev_attrs[] = {
__ATTR_RO(irq), __ATTR_RO(irq),
__ATTR_RO(local_cpus), __ATTR_RO(local_cpus),
__ATTR_RO(modalias), __ATTR_RO(modalias),
#ifdef CONFIG_NUMA
__ATTR_RO(numa_node),
#endif
__ATTR(enable, 0600, is_enabled_show, is_enabled_store), __ATTR(enable, 0600, is_enabled_show, is_enabled_store),
__ATTR(broken_parity_status,(S_IRUGO|S_IWUSR), __ATTR(broken_parity_status,(S_IRUGO|S_IWUSR),
broken_parity_status_show,broken_parity_status_store), broken_parity_status_show,broken_parity_status_store),
......
...@@ -21,6 +21,12 @@ ...@@ -21,6 +21,12 @@
unsigned int pci_pm_d3_delay = 10; unsigned int pci_pm_d3_delay = 10;
#define DEFAULT_CARDBUS_IO_SIZE (256)
#define DEFAULT_CARDBUS_MEM_SIZE (64*1024*1024)
/* pci=cbmemsize=nnM,cbiosize=nn can override this */
unsigned long pci_cardbus_io_size = DEFAULT_CARDBUS_IO_SIZE;
unsigned long pci_cardbus_mem_size = DEFAULT_CARDBUS_MEM_SIZE;
/** /**
* pci_bus_max_busnr - returns maximum PCI bus number of given bus' children * pci_bus_max_busnr - returns maximum PCI bus number of given bus' children
* @bus: pointer to PCI bus structure to search * @bus: pointer to PCI bus structure to search
...@@ -1300,7 +1306,7 @@ pci_set_consistent_dma_mask(struct pci_dev *dev, u64 mask) ...@@ -1300,7 +1306,7 @@ pci_set_consistent_dma_mask(struct pci_dev *dev, u64 mask)
/** /**
* pci_select_bars - Make BAR mask from the type of resource * pci_select_bars - Make BAR mask from the type of resource
* @pdev: the PCI device for which BAR mask is made * @dev: the PCI device for which BAR mask is made
* @flags: resource type mask to be selected * @flags: resource type mask to be selected
* *
* This helper routine makes bar mask from the type of resource. * This helper routine makes bar mask from the type of resource.
...@@ -1333,6 +1339,10 @@ static int __devinit pci_setup(char *str) ...@@ -1333,6 +1339,10 @@ static int __devinit pci_setup(char *str)
if (*str && (str = pcibios_setup(str)) && *str) { if (*str && (str = pcibios_setup(str)) && *str) {
if (!strcmp(str, "nomsi")) { if (!strcmp(str, "nomsi")) {
pci_no_msi(); pci_no_msi();
} else if (!strncmp(str, "cbiosize=", 9)) {
pci_cardbus_io_size = memparse(str + 9, &str);
} else if (!strncmp(str, "cbmemsize=", 10)) {
pci_cardbus_mem_size = memparse(str + 10, &str);
} else { } else {
printk(KERN_ERR "PCI: Unknown option `%s'\n", printk(KERN_ERR "PCI: Unknown option `%s'\n",
str); str);
......
...@@ -36,13 +36,6 @@ ...@@ -36,13 +36,6 @@
#define ROUND_UP(x, a) (((x) + (a) - 1) & ~((a) - 1)) #define ROUND_UP(x, a) (((x) + (a) - 1) & ~((a) - 1))
/*
* FIXME: IO should be max 256 bytes. However, since we may
* have a P2P bridge below a cardbus bridge, we need 4K.
*/
#define CARDBUS_IO_SIZE (256)
#define CARDBUS_MEM_SIZE (64*1024*1024)
static void __devinit static void __devinit
pbus_assign_resources_sorted(struct pci_bus *bus) pbus_assign_resources_sorted(struct pci_bus *bus)
{ {
...@@ -415,12 +408,12 @@ pci_bus_size_cardbus(struct pci_bus *bus) ...@@ -415,12 +408,12 @@ pci_bus_size_cardbus(struct pci_bus *bus)
* Reserve some resources for CardBus. We reserve * Reserve some resources for CardBus. We reserve
* a fixed amount of bus space for CardBus bridges. * a fixed amount of bus space for CardBus bridges.
*/ */
b_res[0].start = CARDBUS_IO_SIZE; b_res[0].start = pci_cardbus_io_size;
b_res[0].end = b_res[0].start + CARDBUS_IO_SIZE - 1; b_res[0].end = b_res[0].start + pci_cardbus_io_size - 1;
b_res[0].flags |= IORESOURCE_IO; b_res[0].flags |= IORESOURCE_IO;
b_res[1].start = CARDBUS_IO_SIZE; b_res[1].start = pci_cardbus_io_size;
b_res[1].end = b_res[1].start + CARDBUS_IO_SIZE - 1; b_res[1].end = b_res[1].start + pci_cardbus_io_size - 1;
b_res[1].flags |= IORESOURCE_IO; b_res[1].flags |= IORESOURCE_IO;
/* /*
...@@ -440,16 +433,16 @@ pci_bus_size_cardbus(struct pci_bus *bus) ...@@ -440,16 +433,16 @@ pci_bus_size_cardbus(struct pci_bus *bus)
* twice the size. * twice the size.
*/ */
if (ctrl & PCI_CB_BRIDGE_CTL_PREFETCH_MEM0) { if (ctrl & PCI_CB_BRIDGE_CTL_PREFETCH_MEM0) {
b_res[2].start = CARDBUS_MEM_SIZE; b_res[2].start = pci_cardbus_mem_size;
b_res[2].end = b_res[2].start + CARDBUS_MEM_SIZE - 1; b_res[2].end = b_res[2].start + pci_cardbus_mem_size - 1;
b_res[2].flags |= IORESOURCE_MEM | IORESOURCE_PREFETCH; b_res[2].flags |= IORESOURCE_MEM | IORESOURCE_PREFETCH;
b_res[3].start = CARDBUS_MEM_SIZE; b_res[3].start = pci_cardbus_mem_size;
b_res[3].end = b_res[3].start + CARDBUS_MEM_SIZE - 1; b_res[3].end = b_res[3].start + pci_cardbus_mem_size - 1;
b_res[3].flags |= IORESOURCE_MEM; b_res[3].flags |= IORESOURCE_MEM;
} else { } else {
b_res[3].start = CARDBUS_MEM_SIZE * 2; b_res[3].start = pci_cardbus_mem_size * 2;
b_res[3].end = b_res[3].start + CARDBUS_MEM_SIZE * 2 - 1; b_res[3].end = b_res[3].start + pci_cardbus_mem_size * 2 - 1;
b_res[3].flags |= IORESOURCE_MEM; b_res[3].flags |= IORESOURCE_MEM;
} }
} }
......
...@@ -24,7 +24,7 @@ pdev_fixup_irq(struct pci_dev *dev, ...@@ -24,7 +24,7 @@ pdev_fixup_irq(struct pci_dev *dev,
int (*map_irq)(struct pci_dev *, u8, u8)) int (*map_irq)(struct pci_dev *, u8, u8))
{ {
u8 pin, slot; u8 pin, slot;
int irq; int irq = 0;
/* If this device is not on the primary bus, we need to figure out /* If this device is not on the primary bus, we need to figure out
which interrupt pin it will come in on. We know which slot it which interrupt pin it will come in on. We know which slot it
...@@ -33,16 +33,18 @@ pdev_fixup_irq(struct pci_dev *dev, ...@@ -33,16 +33,18 @@ pdev_fixup_irq(struct pci_dev *dev,
apply the swizzle function. */ apply the swizzle function. */
pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin); pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin);
/* Cope with 0 and illegal. */ /* Cope with illegal. */
if (pin == 0 || pin > 4) if (pin > 4)
pin = 1; pin = 1;
/* Follow the chain of bridges, swizzling as we go. */ if (pin != 0) {
slot = (*swizzle)(dev, &pin); /* Follow the chain of bridges, swizzling as we go. */
slot = (*swizzle)(dev, &pin);
irq = (*map_irq)(dev, slot, pin); irq = (*map_irq)(dev, slot, pin);
if (irq == -1) if (irq == -1)
irq = 0; irq = 0;
}
dev->irq = irq; dev->irq = irq;
pr_debug("PCI: fixup irq: (%s) got %d\n", pr_debug("PCI: fixup irq: (%s) got %d\n",
......
...@@ -54,7 +54,7 @@ static struct sysfs_ops subsys_sysfs_ops = { ...@@ -54,7 +54,7 @@ static struct sysfs_ops subsys_sysfs_ops = {
/** /**
* add_to_collection - add buffer to a collection * add_to_collection - add buffer to a collection
* @buffer: buffer to be added * @buffer: buffer to be added
* @node inode of set to add to * @node: inode of set to add to
*/ */
static inline void static inline void
......
...@@ -854,5 +854,8 @@ extern int pci_pci_problems; ...@@ -854,5 +854,8 @@ extern int pci_pci_problems;
#define PCIPCI_ALIMAGIK 32 /* Need low latency setting */ #define PCIPCI_ALIMAGIK 32 /* Need low latency setting */
#define PCIAGP_FAIL 64 /* No PCI to AGP DMA */ #define PCIAGP_FAIL 64 /* No PCI to AGP DMA */
extern unsigned long pci_cardbus_io_size;
extern unsigned long pci_cardbus_mem_size;
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
#endif /* LINUX_PCI_H */ #endif /* LINUX_PCI_H */
...@@ -326,6 +326,7 @@ int kobject_rename(struct kobject * kobj, const char *new_name) ...@@ -326,6 +326,7 @@ int kobject_rename(struct kobject * kobj, const char *new_name)
/** /**
* kobject_rename - change the name of an object * kobject_rename - change the name of an object
* @kobj: object in question. * @kobj: object in question.
* @new_parent: object's new parent
* @new_name: object's new name * @new_name: object's new name
*/ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment