# Kconfig - interrupt controller configuration options

#
# Copyright (c) 2015 Intel Corporation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#


menu "Interrupt Controllers"

config LOAPIC
	bool "LOAPIC"
	default n
	select IOAPIC
	depends on X86
	help
	This option selects local APIC as the interrupt controller.

config LOAPIC_BASE_ADDRESS
	hex "Local APIC Base Address"
	default 0xFEE00000
	depends on LOAPIC || MVIC
	help
	This option specifies the base address of the Local APIC device.

config LOAPIC_SPURIOUS_VECTOR
	bool "Handle LOAPIC spurious interrupts"
	default n
	depends on LOAPIC
	help
	A special situation may occur when a processor raises its task
	priority to be greater than or equal to the level of the
	interrupt for which the processor INTR signal is currently being
	asserted. If at the time the INTA cycle is issued, the
	interrupt that was to be dispensed has become masked (programmed
	by software), the local APIC will deliver a spurious-interrupt
	vector. Dispensing the spurious-interrupt vector does not affect
	the ISR, so the handler for this vector should return without an EOI.
	From x86 manual Volume 3 Section 10.9.

config LOAPIC_SPURIOUS_VECTOR_ID
	int "LOAPIC spurious vector ID"
	default -1
	depends on LOAPIC_SPURIOUS_VECTOR
	help
	IDT vector to use for spurious LOAPIC interrupts. Note that some
	arches (P6, Pentium) ignore the low 4 bits and fix them at 0xF.
	If this value is left at -1 the last entry in the IDT will be used.

config IOAPIC
	bool "IO-APIC"
	default y
	depends on LOAPIC
	help
	This option signifies that the target has an IO-APIC device. This
	capability allows IO-APIC-dependent code to be included.

config IOAPIC_DEBUG
	bool "IO-APIC Debugging"
	default n
	depends on IOAPIC
	help
	Enable debugging for IO-APIC driver.

config IOAPIC_BASE_ADDRESS
	hex "IO-APIC Base Address"
	default 0xFEC00000
	depends on IOAPIC || MVIC
	help
	This option specifies the base address of the IO-APIC device.

config IOAPIC_NUM_RTES
	int "Number of Redirection Table Entries available"
	default 24
	depends on IOAPIC
	help
	This option indicates the maximum number of Redirection Table Entries
	(RTEs) (one per IRQ available to the IO-APIC) made available to the
	kernel, regardless of the number provided by the hardware itself. For
	most efficient usage of memory, it should match the number of IRQ lines
	needed by devices connected to the IO-APIC.

config  MVIC
	bool "Intel Quark D2000 Interrupt Controller (MVIC)"
	default n
	depends on X86
	help
	The MVIC (Intel Quark microcontroller D2000 Interrupt Controller) is
	configured by default to support 32 external interrupt lines. Unlike the
	traditional IA LAPIC/IOAPIC, the interrupt vectors in MVIC are fixed and
	not programmable. In addition, the priorities of these interrupt
	lines are also fixed.

config ARCV2_INTERRUPT_UNIT
	bool "ARCv2 Interrupt Unit"
	default y
	depends on ARC
	help
	The ARCv2 interrupt unit has 16 allocated exceptions associated with
	vectors 0 to 15 and 240 interrupts associated with vectors 16 to 255.
	The interrupt unit is optional in the ARCv2-based processors. When
	building a processor, you can configure the processor to include an
	interrupt unit. The ARCv2 interrupt unit is highly programmable.
endmenu
