Skip to content

Commit

Permalink
powerpc/mpic: Save computed phys_addr for board-specific code
Browse files Browse the repository at this point in the history
The MPIC code can already perform an automatic OF address translation
step as part of mpic_alloc(), but several boards need to use that base
address when they perform mpic_assign_isu().

The easiest solution is to save the computed physical address into the
"struct mpic" for later use by the board code.

Signed-off-by: Kyle Moffett <Kyle.D.Moffett@boeing.com>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
  • Loading branch information
Kyle Moffett authored and Benjamin Herrenschmidt committed Dec 7, 2011
1 parent 5bdb6f2 commit e7a9867
Show file tree
Hide file tree
Showing 7 changed files with 23 additions and 54 deletions.
3 changes: 3 additions & 0 deletions arch/powerpc/include/asm/mpic.h
Original file line number Diff line number Diff line change
Expand Up @@ -293,6 +293,9 @@ struct mpic
/* Register access method */
enum mpic_reg_type reg_type;

/* The physical base address of the MPIC */
phys_addr_t paddr;

/* The various ioremap'ed bases */
struct mpic_reg_bank gregs;
struct mpic_reg_bank tmregs;
Expand Down
15 changes: 3 additions & 12 deletions arch/powerpc/platforms/embedded6xx/holly.c
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,6 @@ static void __init holly_setup_arch(void)
static void __init holly_init_IRQ(void)
{
struct mpic *mpic;
phys_addr_t mpic_paddr = 0;
struct device_node *tsi_pic;
#ifdef CONFIG_PCI
unsigned int cascade_pci_irq;
Expand All @@ -157,20 +156,12 @@ static void __init holly_init_IRQ(void)
#endif

tsi_pic = of_find_node_by_type(NULL, "open-pic");
if (tsi_pic) {
unsigned int size;
const void *prop = of_get_property(tsi_pic, "reg", &size);
mpic_paddr = of_translate_address(tsi_pic, prop);
}

if (mpic_paddr == 0) {
if (!tsi_pic) {
printk(KERN_ERR "%s: No tsi108 PIC found !\n", __func__);
return;
}

pr_debug("%s: tsi108 pic phys_addr = 0x%x\n", __func__, (u32) mpic_paddr);

mpic = mpic_alloc(tsi_pic, mpic_paddr,
mpic = mpic_alloc(tsi_pic, 0,
MPIC_PRIMARY | MPIC_BIG_ENDIAN | MPIC_WANTS_RESET |
MPIC_SPV_EOI | MPIC_NO_PTHROU_DIS | MPIC_REGSET_TSI108,
24,
Expand All @@ -179,7 +170,7 @@ static void __init holly_init_IRQ(void)

BUG_ON(mpic == NULL);

mpic_assign_isu(mpic, 0, mpic_paddr + 0x100);
mpic_assign_isu(mpic, 0, mpic->paddr + 0x100);

mpic_init(mpic);

Expand Down
14 changes: 4 additions & 10 deletions arch/powerpc/platforms/embedded6xx/linkstation.c
Original file line number Diff line number Diff line change
Expand Up @@ -82,28 +82,22 @@ static void __init linkstation_init_IRQ(void)
{
struct mpic *mpic;
struct device_node *dnp;
const u32 *prop;
int size;
phys_addr_t paddr;

dnp = of_find_node_by_type(NULL, "open-pic");
if (dnp == NULL)
return;

prop = of_get_property(dnp, "reg", &size);
paddr = (phys_addr_t)of_translate_address(dnp, prop);

mpic = mpic_alloc(dnp, paddr, MPIC_PRIMARY | MPIC_WANTS_RESET, 4, 32, " EPIC ");
mpic = mpic_alloc(dnp, 0, MPIC_PRIMARY | MPIC_WANTS_RESET, 4, 32, " EPIC ");
BUG_ON(mpic == NULL);

/* PCI IRQs */
mpic_assign_isu(mpic, 0, paddr + 0x10200);
mpic_assign_isu(mpic, 0, mpic->paddr + 0x10200);

/* I2C */
mpic_assign_isu(mpic, 1, paddr + 0x11000);
mpic_assign_isu(mpic, 1, mpic->paddr + 0x11000);

/* ttyS0, ttyS1 */
mpic_assign_isu(mpic, 2, paddr + 0x11100);
mpic_assign_isu(mpic, 2, mpic->paddr + 0x11100);

mpic_init(mpic);
}
Expand Down
16 changes: 3 additions & 13 deletions arch/powerpc/platforms/embedded6xx/mpc7448_hpc2.c
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,6 @@ static void __init mpc7448_hpc2_setup_arch(void)
static void __init mpc7448_hpc2_init_IRQ(void)
{
struct mpic *mpic;
phys_addr_t mpic_paddr = 0;
struct device_node *tsi_pic;
#ifdef CONFIG_PCI
unsigned int cascade_pci_irq;
Expand All @@ -111,21 +110,12 @@ static void __init mpc7448_hpc2_init_IRQ(void)
#endif

tsi_pic = of_find_node_by_type(NULL, "open-pic");
if (tsi_pic) {
unsigned int size;
const void *prop = of_get_property(tsi_pic, "reg", &size);
mpic_paddr = of_translate_address(tsi_pic, prop);
}

if (mpic_paddr == 0) {
if (!tsi_pic) {
printk("%s: No tsi108 PIC found !\n", __func__);
return;
}

DBG("%s: tsi108 pic phys_addr = 0x%x\n", __func__,
(u32) mpic_paddr);

mpic = mpic_alloc(tsi_pic, mpic_paddr,
mpic = mpic_alloc(tsi_pic, 0,
MPIC_PRIMARY | MPIC_BIG_ENDIAN | MPIC_WANTS_RESET |
MPIC_SPV_EOI | MPIC_NO_PTHROU_DIS | MPIC_REGSET_TSI108,
24,
Expand All @@ -134,7 +124,7 @@ static void __init mpc7448_hpc2_init_IRQ(void)

BUG_ON(mpic == NULL);

mpic_assign_isu(mpic, 0, mpic_paddr + 0x100);
mpic_assign_isu(mpic, 0, mpic->paddr + 0x100);

mpic_init(mpic);

Expand Down
16 changes: 3 additions & 13 deletions arch/powerpc/platforms/embedded6xx/storcenter.c
Original file line number Diff line number Diff line change
Expand Up @@ -84,22 +84,12 @@ static void __init storcenter_init_IRQ(void)
{
struct mpic *mpic;
struct device_node *dnp;
const void *prop;
int size;
phys_addr_t paddr;

dnp = of_find_node_by_type(NULL, "open-pic");
if (dnp == NULL)
return;

prop = of_get_property(dnp, "reg", &size);
if (prop == NULL) {
of_node_put(dnp);
return;
}

paddr = (phys_addr_t)of_translate_address(dnp, prop);
mpic = mpic_alloc(dnp, paddr, MPIC_PRIMARY | MPIC_WANTS_RESET,
mpic = mpic_alloc(dnp, 0, MPIC_PRIMARY | MPIC_WANTS_RESET,
16, 32, " OpenPIC ");

of_node_put(dnp);
Expand All @@ -110,8 +100,8 @@ static void __init storcenter_init_IRQ(void)
* 16 Serial Interrupts followed by 16 Internal Interrupts.
* I2C is the second internal, so it is at 17, 0x11020.
*/
mpic_assign_isu(mpic, 0, paddr + 0x10200);
mpic_assign_isu(mpic, 1, paddr + 0x11000);
mpic_assign_isu(mpic, 0, mpic->paddr + 0x10200);
mpic_assign_isu(mpic, 1, mpic->paddr + 0x11000);

mpic_init(mpic);
}
Expand Down
2 changes: 1 addition & 1 deletion arch/powerpc/platforms/pasemi/setup.c
Original file line number Diff line number Diff line change
Expand Up @@ -234,7 +234,7 @@ static __init void pas_init_IRQ(void)
mpic_flags, 0, 0, "PASEMI-OPIC");
BUG_ON(!mpic);

mpic_assign_isu(mpic, 0, openpic_addr + 0x10000);
mpic_assign_isu(mpic, 0, mpic->paddr + 0x10000);
mpic_init(mpic);
/* The NMI/MCK source needs to be prio 15 */
if (nmiprop) {
Expand Down
11 changes: 6 additions & 5 deletions arch/powerpc/sysdev/mpic.c
Original file line number Diff line number Diff line change
Expand Up @@ -1164,6 +1164,7 @@ struct mpic * __init mpic_alloc(struct device_node *node,
return NULL;

mpic->name = name;
mpic->paddr = phys_addr;

mpic->hc_irq = mpic_irq_chip;
mpic->hc_irq.name = name;
Expand Down Expand Up @@ -1250,8 +1251,8 @@ struct mpic * __init mpic_alloc(struct device_node *node,
#endif

/* Map the global registers */
mpic_map(mpic, node, phys_addr, &mpic->gregs, MPIC_INFO(GREG_BASE), 0x1000);
mpic_map(mpic, node, phys_addr, &mpic->tmregs, MPIC_INFO(TIMER_BASE), 0x1000);
mpic_map(mpic, node, mpic->paddr, &mpic->gregs, MPIC_INFO(GREG_BASE), 0x1000);
mpic_map(mpic, node, mpic->paddr, &mpic->tmregs, MPIC_INFO(TIMER_BASE), 0x1000);

/* Reset */

Expand Down Expand Up @@ -1306,15 +1307,15 @@ struct mpic * __init mpic_alloc(struct device_node *node,
for_each_possible_cpu(i) {
unsigned int cpu = get_hard_smp_processor_id(i);

mpic_map(mpic, node, phys_addr, &mpic->cpuregs[cpu],
mpic_map(mpic, node, mpic->paddr, &mpic->cpuregs[cpu],
MPIC_INFO(CPU_BASE) + cpu * MPIC_INFO(CPU_STRIDE),
0x1000);
}

/* Initialize main ISU if none provided */
if (mpic->isu_size == 0) {
mpic->isu_size = mpic->num_sources;
mpic_map(mpic, node, phys_addr, &mpic->isus[0],
mpic_map(mpic, node, mpic->paddr, &mpic->isus[0],
MPIC_INFO(IRQ_BASE), MPIC_INFO(IRQ_STRIDE) * mpic->isu_size);
}
mpic->isu_shift = 1 + __ilog2(mpic->isu_size - 1);
Expand Down Expand Up @@ -1346,7 +1347,7 @@ struct mpic * __init mpic_alloc(struct device_node *node,
}
printk(KERN_INFO "mpic: Setting up MPIC \"%s\" version %s at %llx,"
" max %d CPUs\n",
name, vers, (unsigned long long)phys_addr, num_possible_cpus());
name, vers, (unsigned long long)mpic->paddr, num_possible_cpus());
printk(KERN_INFO "mpic: ISU size: %d, shift: %d, mask: %x\n",
mpic->isu_size, mpic->isu_shift, mpic->isu_mask);

Expand Down

0 comments on commit e7a9867

Please sign in to comment.