Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/sparc-2.6
* master.kernel.org:/pub/scm/linux/kernel/git/davem/sparc-2.6: [SPARC64]: Fix memory corruption in pci_4u_free_consistent(). [SPARC64]: Fix central/FHC bus handling on Ex000 systems.
This commit is contained in:
Коммит
e803915000
|
@ -126,6 +126,10 @@ static void probe_other_fhcs(void)
|
|||
int board;
|
||||
u32 tmp;
|
||||
|
||||
if (dp->parent &&
|
||||
dp->parent->parent != NULL)
|
||||
continue;
|
||||
|
||||
fhc = (struct linux_fhc *)
|
||||
central_alloc_bootmem(sizeof(struct linux_fhc));
|
||||
if (fhc == NULL)
|
||||
|
|
|
@ -402,16 +402,22 @@ static void of_bus_sbus_count_cells(struct device_node *child,
|
|||
*sizec = 1;
|
||||
}
|
||||
|
||||
static int of_bus_sbus_map(u32 *addr, const u32 *range, int na, int ns, int pna)
|
||||
/*
|
||||
* FHC/Central bus specific translator.
|
||||
*
|
||||
* This is just needed to hard-code the address and size cell
|
||||
* counts. 'fhc' and 'central' nodes lack the #address-cells and
|
||||
* #size-cells properties, and if you walk to the root on such
|
||||
* Enterprise boxes all you'll get is a #size-cells of 2 which is
|
||||
* not what we want to use.
|
||||
*/
|
||||
static int of_bus_fhc_match(struct device_node *np)
|
||||
{
|
||||
return of_bus_default_map(addr, range, na, ns, pna);
|
||||
}
|
||||
|
||||
static unsigned int of_bus_sbus_get_flags(u32 *addr)
|
||||
{
|
||||
return IORESOURCE_MEM;
|
||||
return !strcmp(np->name, "fhc") ||
|
||||
!strcmp(np->name, "central");
|
||||
}
|
||||
|
||||
#define of_bus_fhc_count_cells of_bus_sbus_count_cells
|
||||
|
||||
/*
|
||||
* Array of bus specific translators
|
||||
|
@ -433,8 +439,17 @@ static struct of_bus of_busses[] = {
|
|||
.addr_prop_name = "reg",
|
||||
.match = of_bus_sbus_match,
|
||||
.count_cells = of_bus_sbus_count_cells,
|
||||
.map = of_bus_sbus_map,
|
||||
.get_flags = of_bus_sbus_get_flags,
|
||||
.map = of_bus_default_map,
|
||||
.get_flags = of_bus_default_get_flags,
|
||||
},
|
||||
/* FHC */
|
||||
{
|
||||
.name = "fhc",
|
||||
.addr_prop_name = "reg",
|
||||
.match = of_bus_fhc_match,
|
||||
.count_cells = of_bus_fhc_count_cells,
|
||||
.map = of_bus_default_map,
|
||||
.get_flags = of_bus_default_get_flags,
|
||||
},
|
||||
/* Default */
|
||||
{
|
||||
|
|
|
@ -281,7 +281,7 @@ static void pci_4u_free_consistent(struct pci_dev *pdev, size_t size, void *cpu,
|
|||
|
||||
spin_lock_irqsave(&iommu->lock, flags);
|
||||
|
||||
free_npages(iommu, dvma, npages);
|
||||
free_npages(iommu, dvma - iommu->page_table_map_base, npages);
|
||||
|
||||
spin_unlock_irqrestore(&iommu->lock, flags);
|
||||
|
||||
|
|
|
@ -1079,32 +1079,32 @@ static void sun4v_vdev_irq_trans_init(struct device_node *dp)
|
|||
|
||||
static void irq_trans_init(struct device_node *dp)
|
||||
{
|
||||
const char *model;
|
||||
#ifdef CONFIG_PCI
|
||||
const char *model;
|
||||
int i;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PCI
|
||||
model = of_get_property(dp, "model", NULL);
|
||||
if (!model)
|
||||
model = of_get_property(dp, "compatible", NULL);
|
||||
if (!model)
|
||||
return;
|
||||
|
||||
#ifdef CONFIG_PCI
|
||||
if (model) {
|
||||
for (i = 0; i < ARRAY_SIZE(pci_irq_trans_table); i++) {
|
||||
struct irq_trans *t = &pci_irq_trans_table[i];
|
||||
|
||||
if (!strcmp(model, t->name))
|
||||
return t->init(dp);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#ifdef CONFIG_SBUS
|
||||
if (!strcmp(dp->name, "sbus") ||
|
||||
!strcmp(dp->name, "sbi"))
|
||||
return sbus_irq_trans_init(dp);
|
||||
#endif
|
||||
if (!strcmp(dp->name, "central"))
|
||||
return central_irq_trans_init(dp->child);
|
||||
if (!strcmp(dp->name, "fhc") &&
|
||||
!strcmp(dp->parent->name, "central"))
|
||||
return central_irq_trans_init(dp);
|
||||
if (!strcmp(dp->name, "virtual-devices"))
|
||||
return sun4v_vdev_irq_trans_init(dp);
|
||||
}
|
||||
|
@ -1516,7 +1516,7 @@ static char * __init get_one_property(phandle node, const char *name)
|
|||
return buf;
|
||||
}
|
||||
|
||||
static struct device_node * __init create_node(phandle node)
|
||||
static struct device_node * __init create_node(phandle node, struct device_node *parent)
|
||||
{
|
||||
struct device_node *dp;
|
||||
|
||||
|
@ -1525,6 +1525,7 @@ static struct device_node * __init create_node(phandle node)
|
|||
|
||||
dp = prom_early_alloc(sizeof(*dp));
|
||||
dp->unique_id = unique_id++;
|
||||
dp->parent = parent;
|
||||
|
||||
kref_init(&dp->kref);
|
||||
|
||||
|
@ -1543,12 +1544,11 @@ static struct device_node * __init build_tree(struct device_node *parent, phandl
|
|||
{
|
||||
struct device_node *dp;
|
||||
|
||||
dp = create_node(node);
|
||||
dp = create_node(node, parent);
|
||||
if (dp) {
|
||||
*(*nextp) = dp;
|
||||
*nextp = &dp->allnext;
|
||||
|
||||
dp->parent = parent;
|
||||
dp->path_component_name = build_path_component(dp);
|
||||
dp->full_name = build_full_name(dp);
|
||||
|
||||
|
@ -1564,7 +1564,7 @@ void __init prom_build_devicetree(void)
|
|||
{
|
||||
struct device_node **nextp;
|
||||
|
||||
allnodes = create_node(prom_root_node);
|
||||
allnodes = create_node(prom_root_node, NULL);
|
||||
allnodes->path_component_name = "";
|
||||
allnodes->full_name = "/";
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче