blob: 1bab4cfdd409382e2bbf840f836ef6377278cfe4 [file] [log] [blame]
/*
* ambhw/vic.h
*
* History:
* 2006/12/27 - [Charles Chiou] created file
*
* Copyright (C) 2006-2008, Ambarella, Inc.
*/
#ifndef __AMBHW__VIC_H__
#define __AMBHW__VIC_H__
#include <ambhw/chip.h>
#include <ambhw/busaddr.h>
/****************************************************/
/* Capabilities based on chip revision */
/****************************************************/
#if (CHIP_REV == A3) || (CHIP_REV == A5) || (CHIP_REV == A6) || \
(CHIP_REV ==A5S) || (CHIP_REV == A7M) || (CHIP_REV == A7) || \
(CHIP_REV == A7L)
#define VIC_INSTANCES 2
#elif (CHIP_REV == I1)
#define VIC_INSTANCES 3
#else
#define VIC_INSTANCES 1
#endif
#if (CHIP_REV == I1) || (CHIP_REV == A7L)
#define VIC_SUPPORT_CPU_OFFLOAD 1
#define VIC_SUPPORT_REPRIORITIZE_INTR_SRC 1
#else
#define VIC_SUPPORT_CPU_OFFLOAD 0
#define VIC_SUPPORT_REPRIORITIZE_INTR_SRC 0
#endif
/*
* VIC trigger types (SW definition).
*/
#define VIRQ_RISING_EDGE 0
#define VIRQ_FALLING_EDGE 1
#define VIRQ_BOTH_EDGES 2
#define VIRQ_LEVEL_LOW 3
#define VIRQ_LEVEL_HIGH 4
/****************************************************/
/* Controller registers definitions */
/****************************************************/
#define VIC_IRQ_STA_OFFSET 0x00
#define VIC_FIQ_STA_OFFSET 0x04
#define VIC_RAW_STA_OFFSET 0x08
#define VIC_INT_SEL_OFFSET 0x0c
#define VIC_INTEN_OFFSET 0x10
#define VIC_INTEN_CLR_OFFSET 0x14
#define VIC_SOFTEN_OFFSET 0x18
#define VIC_SOFTEN_CLR_OFFSET 0x1c
#define VIC_PROTEN_OFFSET 0x20
#define VIC_SENSE_OFFSET 0x24
#define VIC_BOTHEDGE_OFFSET 0x28
#define VIC_EVENT_OFFSET 0x2c
#define VIC_EDGE_CLR_OFFSET 0x38
/* CPU offload functions */
#if (VIC_SUPPORT_CPU_OFFLOAD == 1)
#define VIC_INT_SEL_INT_OFFSET 0x3c
#define VIC_INT_SEL_CLR_INT_OFFSET 0x40
#define VIC_INT_EN_INT_OFFSET 0x44
#define VIC_INT_EN_CLR_INT_OFFSET 0x48
#define VIC_SOFT_INT_INT_OFFSET 0x4c
#define VIC_SOFT_INT_CLR_INT_OFFSET 0x50
#define VIC_INT_SENSE_INT_OFFSET 0x54
#define VIC_INT_SENSE_CLR_INT_OFFSET 0x58
#define VIC_INT_BOTHEDGE_INT_OFFSET 0x5c
#define VIC_INT_BOTHEDGE_CLR_INT_OFFSET 0x60
#define VIC_INT_EVT_INT_OFFSET 0x64
#define VIC_INT_EVT_CLR_INT_OFFSET 0x68
#define VIC_INT_PENDING_OFFSET 0x6c
#endif
/* Priority and delay */
#if (VIC_SUPPORT_REPRIORITIZE_INTR_SRC == 1)
#define VIC_INT_RE_PRIORITIZE_EN_OFFSET 0x70
#define VIC_INT_PRIORITY_0_OFFSET 0x74
#define VIC_INT_PRIORITY_1_OFFSET 0x78
#define VIC_INT_PRIORITY_2_OFFSET 0x7c
#define VIC_INT_PRIORITY_3_OFFSET 0x80
#define VIC_INT_PRIORITY_4_OFFSET 0x84
#define VIC_INT_PRIORITY_5_OFFSET 0x88
#define VIC_INT_DELAY_EN_OFFSET 0x8c
#define VIC_INT_DELAY_OFFSET 0x90
#endif
#define VIC_IRQ_STA_REG VIC_REG(VIC_IRQ_STA_OFFSET)
#define VIC_FIQ_STA_REG VIC_REG(VIC_FIQ_STA_OFFSET)
#define VIC_RAW_STA_REG VIC_REG(VIC_RAW_STA_OFFSET)
#define VIC_INT_SEL_REG VIC_REG(VIC_INT_SEL_OFFSET)
#define VIC_INTEN_REG VIC_REG(VIC_INTEN_OFFSET)
#define VIC_INTEN_CLR_REG VIC_REG(VIC_INTEN_CLR_OFFSET)
#define VIC_SOFTEN_REG VIC_REG(VIC_SOFTEN_OFFSET)
#define VIC_SOFTEN_CLR_REG VIC_REG(VIC_SOFTEN_CLR_OFFSET)
#define VIC_PROTEN_REG VIC_REG(VIC_PROTEN_OFFSET)
#define VIC_SENSE_REG VIC_REG(VIC_SENSE_OFFSET)
#define VIC_BOTHEDGE_REG VIC_REG(VIC_BOTHEDGE_OFFSET)
#define VIC_EVENT_REG VIC_REG(VIC_EVENT_OFFSET)
#define VIC_EDGE_CLR_REG VIC_REG(VIC_EDGE_CLR_OFFSET)
/* CPU offload functions */
#if (VIC_SUPPORT_CPU_OFFLOAD == 1)
#define VIC_INT_SEL_INT_REG VIC_REG(VIC_INT_SEL_INT_OFFSET)
#define VIC_INT_SEL_CLR_INT_REG VIC_REG(VIC_INT_SEL_CLR_INT_OFFSET)
#define VIC_INT_EN_INT_REG VIC_REG(VIC_INT_EN_INT_OFFSET)
#define VIC_INT_EN_CLR_INT_REG VIC_REG(VIC_INT_EN_CLR_INT_OFFSET)
#define VIC_SOFT_INT_INT_REG VIC_REG(VIC_SOFT_INT_INT_OFFSET)
#define VIC_SOFT_INT_CLR_INT_REG VIC_REG(VIC_SOFT_INT_CLR_INT_OFFSET)
#define VIC_INT_SENSE_INT_REG VIC_REG(VIC_INT_SENSE_INT_OFFSET)
#define VIC_INT_SENSE_CLR_INT_REG VIC_REG(VIC_INT_SENSE_CLR_INT_OFFSET)
#define VIC_INT_BOTHEDGE_INT_REG VIC_REG(VIC_INT_BOTHEDGE_INT_OFFSET)
#define VIC_INT_BOTHEDGE_CLR_INT_REG VIC_REG(VIC_INT_BOTHEDGE_CLR_INT_OFFSET)
#define VIC_INT_EVT_INT_REG VIC_REG(VIC_INT_EVT_INT_OFFSET)
#define VIC_INT_EVT_CLR_INT_REG VIC_REG(VIC_INT_EVT_CLR_INT_OFFSET)
#define VIC_INT_PENDING_REG VIC_REG(VIC_INT_PENDING_OFFSET)
#endif
/* Priority and delay */
#if (VIC_SUPPORT_REPRIORITIZE_INTR_SRC == 1)
#define VIC_INT_RE_PRIORITIZE_EN_REG VIC_REG(VIC_INT_RE_PRIORITIZE_EN_OFFSET)
#define VIC_INT_PRIORITY_0_REG VIC_REG(VIC_INT_PRIORITY_0_OFFSET)
#define VIC_INT_PRIORITY_1_REG VIC_REG(VIC_INT_PRIORITY_1_OFFSET)
#define VIC_INT_PRIORITY_2_REG VIC_REG(VIC_INT_PRIORITY_2_OFFSET)
#define VIC_INT_PRIORITY_3_REG VIC_REG(VIC_INT_PRIORITY_3_OFFSET)
#define VIC_INT_PRIORITY_4_REG VIC_REG(VIC_INT_PRIORITY_4_OFFSET)
#define VIC_INT_PRIORITY_5_REG VIC_REG(VIC_INT_PRIORITY_5_OFFSET)
#define VIC_INT_DELAY_EN_REG VIC_REG(VIC_INT_DELAY_EN_OFFSET)
#define VIC_INT_DELAY_REG VIC_REG(VIC_INT_DELAY_OFFSET)
#endif
#if (VIC_INSTANCES >= 2)
#define VIC2_IRQ_STA_REG VIC2_REG(VIC_IRQ_STA_OFFSET)
#define VIC2_FIQ_STA_REG VIC2_REG(VIC_FIQ_STA_OFFSET)
#define VIC2_RAW_STA_REG VIC2_REG(VIC_RAW_STA_OFFSET)
#define VIC2_INT_SEL_REG VIC2_REG(VIC_INT_SEL_OFFSET)
#define VIC2_INTEN_REG VIC2_REG(VIC_INTEN_OFFSET)
#define VIC2_INTEN_CLR_REG VIC2_REG(VIC_INTEN_CLR_OFFSET)
#define VIC2_SOFTEN_REG VIC2_REG(VIC_SOFTEN_OFFSET)
#define VIC2_SOFTEN_CLR_REG VIC2_REG(VIC_SOFTEN_CLR_OFFSET)
#define VIC2_PROTEN_REG VIC2_REG(VIC_PROTEN_OFFSET)
#define VIC2_SENSE_REG VIC2_REG(VIC_SENSE_OFFSET)
#define VIC2_BOTHEDGE_REG VIC2_REG(VIC_BOTHEDGE_OFFSET)
#define VIC2_EVENT_REG VIC2_REG(VIC_EVENT_OFFSET)
#define VIC2_EDGE_CLR_REG VIC2_REG(VIC_EDGE_CLR_OFFSET)
/* CPU offload functions */
#if (VIC_SUPPORT_CPU_OFFLOAD == 1)
#define VIC2_INT_SEL_INT_REG VIC2_REG(VIC_INT_SEL_INT_OFFSET)
#define VIC2_INT_SEL_CLR_INT_REG VIC2_REG(VIC_INT_SEL_CLR_INT_OFFSET)
#define VIC2_INT_EN_INT_REG VIC2_REG(VIC_INT_EN_INT_OFFSET)
#define VIC2_INT_EN_CLR_INT_REG VIC2_REG(VIC_INT_EN_CLR_INT_OFFSET)
#define VIC2_SOFT_INT_INT_REG VIC2_REG(VIC_SOFT_INT_INT_OFFSET)
#define VIC2_SOFT_INT_CLR_INT_REG VIC2_REG(VIC_SOFT_INT_CLR_INT_OFFSET)
#define VIC2_INT_SENSE_INT_REG VIC2_REG(VIC_INT_SENSE_INT_OFFSET)
#define VIC2_INT_SENSE_CLR_INT_REG VIC2_REG(VIC_INT_SENSE_CLR_INT_OFFSET)
#define VIC2_INT_BOTHEDGE_INT_REG VIC2_REG(VIC_INT_BOTHEDGE_INT_OFFSET)
#define VIC2_INT_BOTHEDGE_CLR_INT_REG VIC2_REG(VIC_INT_BOTHEDGE_CLR_INT_OFFSET)
#define VIC2_INT_EVT_INT_REG VIC2_REG(VIC_INT_EVT_INT_OFFSET)
#define VIC2_INT_EVT_CLR_INT_REG VIC2_REG(VIC_INT_EVT_CLR_INT_OFFSET)
#define VIC2_INT_PENDING_REG VIC2_REG(VIC_INT_PENDING_OFFSET)
#endif
/* Priority and delay */
#if (VIC_SUPPORT_REPRIORITIZE_INTR_SRC == 1)
#define VIC2_INT_RE_PRIORITIZE_EN_REG VIC2_REG(VIC_INT_RE_PRIORITIZE_EN_OFFSET)
#define VIC2_INT_PRIORITY_0_REG VIC2_REG(VIC_INT_PRIORITY_0_OFFSET)
#define VIC2_INT_PRIORITY_1_REG VIC2_REG(VIC_INT_PRIORITY_1_OFFSET)
#define VIC2_INT_PRIORITY_2_REG VIC2_REG(VIC_INT_PRIORITY_2_OFFSET)
#define VIC2_INT_PRIORITY_3_REG VIC2_REG(VIC_INT_PRIORITY_3_OFFSET)
#define VIC2_INT_PRIORITY_4_REG VIC2_REG(VIC_INT_PRIORITY_4_OFFSET)
#define VIC2_INT_PRIORITY_5_REG VIC2_REG(VIC_INT_PRIORITY_5_OFFSET)
#define VIC2_INT_DELAY_EN_REG VIC2_REG(VIC_INT_DELAY_EN_OFFSET)
#define VIC2_INT_DELAY_REG VIC2_REG(VIC_INT_DELAY_OFFSET)
#endif
#endif
#if (VIC_INSTANCES >= 3)
#define VIC3_IRQ_STA_REG VIC3_REG(VIC_IRQ_STA_OFFSET)
#define VIC3_FIQ_STA_REG VIC3_REG(VIC_FIQ_STA_OFFSET)
#define VIC3_RAW_STA_REG VIC3_REG(VIC_RAW_STA_OFFSET)
#define VIC3_INT_SEL_REG VIC3_REG(VIC_INT_SEL_OFFSET)
#define VIC3_INTEN_REG VIC3_REG(VIC_INTEN_OFFSET)
#define VIC3_INTEN_CLR_REG VIC3_REG(VIC_INTEN_CLR_OFFSET)
#define VIC3_SOFTEN_REG VIC3_REG(VIC_SOFTEN_OFFSET)
#define VIC3_SOFTEN_CLR_REG VIC3_REG(VIC_SOFTEN_CLR_OFFSET)
#define VIC3_PROTEN_REG VIC3_REG(VIC_PROTEN_OFFSET)
#define VIC3_SENSE_REG VIC3_REG(VIC_SENSE_OFFSET)
#define VIC3_BOTHEDGE_REG VIC3_REG(VIC_BOTHEDGE_OFFSET)
#define VIC3_EVENT_REG VIC3_REG(VIC_EVENT_OFFSET)
#define VIC3_EDGE_CLR_REG VIC3_REG(VIC_EDGE_CLR_OFFSET)
/* CPU offload functions */
#if (VIC_SUPPORT_CPU_OFFLOAD == 1)
#define VIC3_INT_SEL_INT_REG VIC3_REG(VIC_INT_SEL_INT_OFFSET)
#define VIC3_INT_SEL_CLR_INT_REG VIC3_REG(VIC_INT_SEL_CLR_INT_OFFSET)
#define VIC3_INT_EN_INT_REG VIC3_REG(VIC_INT_EN_INT_OFFSET)
#define VIC3_INT_EN_CLR_INT_REG VIC3_REG(VIC_INT_EN_CLR_INT_OFFSET)
#define VIC3_SOFT_INT_INT_REG VIC3_REG(VIC_SOFT_INT_INT_OFFSET)
#define VIC3_SOFT_INT_CLR_INT_REG VIC3_REG(VIC_SOFT_INT_CLR_INT_OFFSET)
#define VIC3_INT_SENSE_INT_REG VIC3_REG(VIC_INT_SENSE_INT_OFFSET)
#define VIC3_INT_SENSE_CLR_INT_REG VIC3_REG(VIC_INT_SENSE_CLR_INT_OFFSET)
#define VIC3_INT_BOTHEDGE_INT_REG VIC3_REG(VIC_INT_BOTHEDGE_INT_OFFSET)
#define VIC3_INT_BOTHEDGE_CLR_INT_REG VIC3_REG(VIC_INT_BOTHEDGE_CLR_INT_OFFSET)
#define VIC3_INT_EVT_INT_REG VIC3_REG(VIC_INT_EVT_INT_OFFSET)
#define VIC3_INT_EVT_CLR_INT_REG VIC3_REG(VIC_INT_EVT_CLR_INT_OFFSET)
#define VIC3_INT_PENDING_REG VIC3_REG(VIC_INT_PENDING_OFFSET)
#endif
/* Priority and delay */
#if (VIC_SUPPORT_REPRIORITIZE_INTR_SRC == 1)
#define VIC3_INT_RE_PRIORITIZE_EN_REG VIC3_REG(VIC_INT_RE_PRIORITIZE_EN_OFFSET)
#define VIC3_INT_PRIORITY_0_REG VIC3_REG(VIC_INT_PRIORITY_0_OFFSET)
#define VIC3_INT_PRIORITY_1_REG VIC3_REG(VIC_INT_PRIORITY_1_OFFSET)
#define VIC3_INT_PRIORITY_2_REG VIC3_REG(VIC_INT_PRIORITY_2_OFFSET)
#define VIC3_INT_PRIORITY_3_REG VIC3_REG(VIC_INT_PRIORITY_3_OFFSET)
#define VIC3_INT_PRIORITY_4_REG VIC3_REG(VIC_INT_PRIORITY_4_OFFSET)
#define VIC3_INT_PRIORITY_5_REG VIC3_REG(VIC_INT_PRIORITY_5_OFFSET)
#define VIC3_INT_DELAY_EN_REG VIC3_REG(VIC_INT_DELAY_EN_OFFSET)
#define VIC3_INT_DELAY_REG VIC3_REG(VIC_INT_DELAY_OFFSET)
#endif
#endif
#endif