> On Sun, Feb 16, 2014 at 04:01:24PM +0800, Huacai Chen wrote: > >> +#define LOONGSON_HT1_INT_VECTOR_BASE (LOONGSON_HT1_CFG_BASE + 0x80) >> +#define LOONGSON_HT1_INT_EN_BASE (LOONGSON_HT1_CFG_BASE + 0xa0) >> +#define LOONGSON_HT1_INT_VECTOR(n) \ >> + LOONGSON3_REG32(LOONGSON_HT1_INT_VECTOR_BASE, 4 * n) >> +#define LOONGSON_HT1_INTN_EN(n) \ >> + LOONGSON3_REG32(LOONGSON_HT1_INT_EN_BASE, 4 * n) > > Doing math on macro arguments without parenthesis is dangerous, please > use (n) instead. > >> + >> +#define LOONGSON_INT_ROUTER_OFFSET 0x1400 >> +#define LOONGSON_INT_ROUTER_INTEN \ >> + LOONGSON3_REG32(LOONGSON3_REG_BASE, LOONGSON_INT_ROUTER_OFFSET + >> 0x24) >> +#define LOONGSON_INT_ROUTER_INTENSET \ >> + LOONGSON3_REG32(LOONGSON3_REG_BASE, LOONGSON_INT_ROUTER_OFFSET + >> 0x28) >> +#define LOONGSON_INT_ROUTER_INTENCLR \ >> + LOONGSON3_REG32(LOONGSON3_REG_BASE, LOONGSON_INT_ROUTER_OFFSET + >> 0x2c) >> +#define LOONGSON_INT_ROUTER_ENTRY(n) \ >> + LOONGSON3_REG8(LOONGSON3_REG_BASE, LOONGSON_INT_ROUTER_OFFSET + n) >> +#define LOONGSON_INT_ROUTER_LPC LOONGSON_INT_ROUTER_ENTRY(0x0a) >> +#define LOONGSON_INT_ROUTER_HT1(n) LOONGSON_INT_ROUTER_ENTRY(n + 0x18) > > These two also. > >> +static void ht_irqdispatch(void) >> +{ >> + unsigned int i, irq; >> + unsigned int ht_irq[] = {1, 3, 4, 5, 6, 7, 8, 12, 14, 15}; >> + >> + irq = LOONGSON_HT1_INT_VECTOR(0); >> + LOONGSON_HT1_INT_VECTOR(0) = irq; /* Acknowledge the IRQs */ >> + >> + for (i = 0; i < ARRAY_SIZE(ht_irq); i++) { >> + if (irq & (0x1 << ht_irq[i])) >> + do_IRQ(ht_irq[i]); >> + } >> +} > > Ouch. > > Initializing an array like this in C will generate code which at runtime > initializes the ht_irq[] array each time ht_irqdispatch is invoked > and slowing this function to a crawl. > > You want to make either move the definition of this array out of the > function body or make it "static const unsigned int ht_irq[] ..." to > avoid this. Since there are several patches have problem, and the first one is merged, I will send a V20 patchset without the first one ASAP. > > Ralf >