AST2700 interrupt controller(INTC) provides hardware interrupt interfaces
to interrupt of processors PSP, SSP and TSP. In INTC, each interrupt of
INT 128 to INT136 combines 32 interrupts.
Introduce a new aspeed_intc class with instance_init and realize handlers.
So far, this model only supports GICINT128 to GICINT136.
It creates 9 GICINT or-gates to connect 32 interrupts sources
from GICINT128 to GICINT136 as IRQ GPIO-OUTPUT pins.
Then, this model registers IRQ handler with its IRQ GPIO-INPUT pins which
connect to GICINT or-gates. And creates 9 GICINT IRQ GPIO-OUTPUT pins which
connect to GIC device with GIC IRQ 128 to 136.
If one interrupt source from GICINT128 to GICINT136
set irq, the OR-GATE irq callback function is called and set irq to INTC by
OR-GATE GPIO-OUTPUT pins. Then, the INTC irq callback function is called and
set irq to GIC by its GICINT IRQ GPIO-OUTPUT pins. Finally, the GIC irq
callback function is called and set irq to CPUs and
CPUs execute Interrupt Service Routine (ISR).
Block diagram of GICINT132:
            GICINT132
  ETH1    +-----------+
+-------->+0         3|
  ETH2    |          4|
+-------->+1         5|
  ETH3    |          6|
+-------->+2        19|                          INTC                          GIC
  UART0   |         20|            +--------------------------+
+-------->+7        21|            |                          |            +--------------+
  UART1   |         22|            |orgate0 +----> output_pin0+----------->+GIC128        |
+-------->+8        23|            |                          |            |              |
  UART2   |         24|            |orgate1 +----> output_pin1+----------->+GIC129        |
+-------->+9        25|            |                          |            |              |
  UART3   |         26|            |orgate2 +----> output_pin2+----------->+GIC130        |
+--------->10       27|            |                          |            |              |
  UART5   |         28|            |orgate3 +----> output_pin3+----------->+GIC131        |
+-------->+11       29|            |                          |            |              |
  UART6   |           +----------->+orgate4 +----> output_pin4+----------->+GIC132        |
+-------->+12       30|            |                          |            |              |
  UART7   |         31|            |orgate5 +----> output_pin5+----------->+GIC133        |
+-------->+13         |            |                          |            |              |
  UART8   |  OR[0:31] |            |orgate6 +----> output_pin6+----------->+GIC134        |
---------->14         |            |                          |            |              |
  UART9   |           |            |orgate7 +----> output_pin7+----------->+GIC135        |
--------->+15         |            |                          |            |              |
  UART10  |           |            |orgate8 +----> output_pin8+----------->+GIC136        |
--------->+16         |            |                          |            +--------------+
  UART11  |           |            +--------------------------+
+-------->+17         |
  UART12  |           |
+--------->18         |
          |           |
          |           |
          |           |
          +-----------+
Signed-off-by: Troy Lee <troy_lee@aspeedtech.com>
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
Reviewed-by: Cédric Le Goater <clg@redhat.com>
[clg: Fixed class_size in TYPE_ASPEED_INTC definition ]
		
	
			
		
			
				
	
	
		
			45 lines
		
	
	
		
			1003 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			45 lines
		
	
	
		
			1003 B
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * ASPEED INTC Controller
 | 
						|
 *
 | 
						|
 * Copyright (C) 2024 ASPEED Technology Inc.
 | 
						|
 *
 | 
						|
 * SPDX-License-Identifier: GPL-2.0-or-later
 | 
						|
 */
 | 
						|
#ifndef ASPEED_INTC_H
 | 
						|
#define ASPEED_INTC_H
 | 
						|
 | 
						|
#include "hw/sysbus.h"
 | 
						|
#include "qom/object.h"
 | 
						|
#include "hw/or-irq.h"
 | 
						|
 | 
						|
#define TYPE_ASPEED_INTC "aspeed.intc"
 | 
						|
#define TYPE_ASPEED_2700_INTC TYPE_ASPEED_INTC "-ast2700"
 | 
						|
OBJECT_DECLARE_TYPE(AspeedINTCState, AspeedINTCClass, ASPEED_INTC)
 | 
						|
 | 
						|
#define ASPEED_INTC_NR_REGS (0x2000 >> 2)
 | 
						|
#define ASPEED_INTC_NR_INTS 9
 | 
						|
 | 
						|
struct AspeedINTCState {
 | 
						|
    /*< private >*/
 | 
						|
    SysBusDevice parent_obj;
 | 
						|
 | 
						|
    /*< public >*/
 | 
						|
    MemoryRegion iomem;
 | 
						|
    uint32_t regs[ASPEED_INTC_NR_REGS];
 | 
						|
    OrIRQState orgates[ASPEED_INTC_NR_INTS];
 | 
						|
    qemu_irq output_pins[ASPEED_INTC_NR_INTS];
 | 
						|
 | 
						|
    uint32_t enable[ASPEED_INTC_NR_INTS];
 | 
						|
    uint32_t mask[ASPEED_INTC_NR_INTS];
 | 
						|
    uint32_t pending[ASPEED_INTC_NR_INTS];
 | 
						|
};
 | 
						|
 | 
						|
struct AspeedINTCClass {
 | 
						|
    SysBusDeviceClass parent_class;
 | 
						|
 | 
						|
    uint32_t num_lines;
 | 
						|
    uint32_t num_ints;
 | 
						|
};
 | 
						|
 | 
						|
#endif /* ASPEED_INTC_H */
 |