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. Ralf