提交 e8039150 编写于 作者: L Linus Torvalds

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.
...@@ -126,6 +126,10 @@ static void probe_other_fhcs(void) ...@@ -126,6 +126,10 @@ static void probe_other_fhcs(void)
int board; int board;
u32 tmp; u32 tmp;
if (dp->parent &&
dp->parent->parent != NULL)
continue;
fhc = (struct linux_fhc *) fhc = (struct linux_fhc *)
central_alloc_bootmem(sizeof(struct linux_fhc)); central_alloc_bootmem(sizeof(struct linux_fhc));
if (fhc == NULL) if (fhc == NULL)
......
...@@ -402,16 +402,22 @@ static void of_bus_sbus_count_cells(struct device_node *child, ...@@ -402,16 +402,22 @@ static void of_bus_sbus_count_cells(struct device_node *child,
*sizec = 1; *sizec = 1;
} }
static int of_bus_sbus_map(u32 *addr, const u32 *range, int na, int ns, int pna) /*
{ * FHC/Central bus specific translator.
return of_bus_default_map(addr, range, na, ns, pna); *
} * This is just needed to hard-code the address and size cell
* counts. 'fhc' and 'central' nodes lack the #address-cells and
static unsigned int of_bus_sbus_get_flags(u32 *addr) * #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 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 * Array of bus specific translators
...@@ -433,8 +439,17 @@ static struct of_bus of_busses[] = { ...@@ -433,8 +439,17 @@ static struct of_bus of_busses[] = {
.addr_prop_name = "reg", .addr_prop_name = "reg",
.match = of_bus_sbus_match, .match = of_bus_sbus_match,
.count_cells = of_bus_sbus_count_cells, .count_cells = of_bus_sbus_count_cells,
.map = of_bus_sbus_map, .map = of_bus_default_map,
.get_flags = of_bus_sbus_get_flags, .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 */ /* Default */
{ {
......
...@@ -281,7 +281,7 @@ static void pci_4u_free_consistent(struct pci_dev *pdev, size_t size, void *cpu, ...@@ -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); 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); spin_unlock_irqrestore(&iommu->lock, flags);
......
...@@ -1079,23 +1079,22 @@ static void sun4v_vdev_irq_trans_init(struct device_node *dp) ...@@ -1079,23 +1079,22 @@ static void sun4v_vdev_irq_trans_init(struct device_node *dp)
static void irq_trans_init(struct device_node *dp) static void irq_trans_init(struct device_node *dp)
{ {
const char *model;
#ifdef CONFIG_PCI #ifdef CONFIG_PCI
const char *model;
int i; int i;
#endif #endif
#ifdef CONFIG_PCI
model = of_get_property(dp, "model", NULL); model = of_get_property(dp, "model", NULL);
if (!model) if (!model)
model = of_get_property(dp, "compatible", NULL); model = of_get_property(dp, "compatible", NULL);
if (!model) if (model) {
return; for (i = 0; i < ARRAY_SIZE(pci_irq_trans_table); i++) {
struct irq_trans *t = &pci_irq_trans_table[i];
#ifdef CONFIG_PCI
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)) if (!strcmp(model, t->name))
return t->init(dp); return t->init(dp);
}
} }
#endif #endif
#ifdef CONFIG_SBUS #ifdef CONFIG_SBUS
...@@ -1103,8 +1102,9 @@ static void irq_trans_init(struct device_node *dp) ...@@ -1103,8 +1102,9 @@ static void irq_trans_init(struct device_node *dp)
!strcmp(dp->name, "sbi")) !strcmp(dp->name, "sbi"))
return sbus_irq_trans_init(dp); return sbus_irq_trans_init(dp);
#endif #endif
if (!strcmp(dp->name, "central")) if (!strcmp(dp->name, "fhc") &&
return central_irq_trans_init(dp->child); !strcmp(dp->parent->name, "central"))
return central_irq_trans_init(dp);
if (!strcmp(dp->name, "virtual-devices")) if (!strcmp(dp->name, "virtual-devices"))
return sun4v_vdev_irq_trans_init(dp); return sun4v_vdev_irq_trans_init(dp);
} }
...@@ -1516,7 +1516,7 @@ static char * __init get_one_property(phandle node, const char *name) ...@@ -1516,7 +1516,7 @@ static char * __init get_one_property(phandle node, const char *name)
return buf; 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; struct device_node *dp;
...@@ -1525,6 +1525,7 @@ static struct device_node * __init create_node(phandle node) ...@@ -1525,6 +1525,7 @@ static struct device_node * __init create_node(phandle node)
dp = prom_early_alloc(sizeof(*dp)); dp = prom_early_alloc(sizeof(*dp));
dp->unique_id = unique_id++; dp->unique_id = unique_id++;
dp->parent = parent;
kref_init(&dp->kref); kref_init(&dp->kref);
...@@ -1543,12 +1544,11 @@ static struct device_node * __init build_tree(struct device_node *parent, phandl ...@@ -1543,12 +1544,11 @@ static struct device_node * __init build_tree(struct device_node *parent, phandl
{ {
struct device_node *dp; struct device_node *dp;
dp = create_node(node); dp = create_node(node, parent);
if (dp) { if (dp) {
*(*nextp) = dp; *(*nextp) = dp;
*nextp = &dp->allnext; *nextp = &dp->allnext;
dp->parent = parent;
dp->path_component_name = build_path_component(dp); dp->path_component_name = build_path_component(dp);
dp->full_name = build_full_name(dp); dp->full_name = build_full_name(dp);
...@@ -1564,7 +1564,7 @@ void __init prom_build_devicetree(void) ...@@ -1564,7 +1564,7 @@ void __init prom_build_devicetree(void)
{ {
struct device_node **nextp; struct device_node **nextp;
allnodes = create_node(prom_root_node); allnodes = create_node(prom_root_node, NULL);
allnodes->path_component_name = ""; allnodes->path_component_name = "";
allnodes->full_name = "/"; allnodes->full_name = "/";
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册