Specifications
EISA and ISA Bus Support
14.7 EISA Bus Support on DEC 2000
14.7.5.2 SCB Vectors
On OpenVMS AXP EISA device I/O interrupts are dispatched through SCB
vectors 800h-8F0h. Each IRQ level is assigned a vector using the following
formula:
SCB = 800h + (IRQ * 10h)
So IRQ 0 reports through SCB vector 800, IRQ1 through 810, etc. In the special
DEC 2000 release version, interrupt dispatching is indirectly vectored, and all
SCB vectors 800-8F0 point to the indirect dispatcher, which will then call the
appropriate driver’s Interrupt Service Routine.
14.7.5.3 EOI
The End Of Interrupt command is used to release an interrupt on DEC 2000.
The release of an interrupt enables future interrupts of equal or lower priority,
thus is critical to the interrupt flow. The EOI command is sent out over the EISA
bus to the 82357 chip, which sends it to the associated logical 8259 chip to release
the interrupt. OpenVMS AXP uses indirect dispatching to control the dispatch of
interrupts. The indirect dispatcher is responsible for issuing the EOI command
for all EISA interrupts.
14.7.6 EISA Bus Interface Registers
14.7.6.1 Interrupt Enable Register
EISA I/O interrupts are enabled or disabled via the Interrupt Enable Register.
This 82357 register is accessed via the IOC$NODE_FUNCTION routine using
the IOC$K_ENABLE_INTR and IOC$K_DISABLE_INTR function codes.. When
a driver is ready to handle device interrupts, it should call the IOC$NODE_
FUNCTION routine with the IOC$K_ENABLE_INTR function code. This will
cause a bit in the Interrupt Enable register to be asserted, enabling EISA
interrupts from the IRQ assigned to the device driver calling the routine. The
interrupts can also be disabled by using the IOC$K_DISABLE_INTR command
index. This will clear the enable bit in the Interrupt Enable Register, prohibiting
further interrupts from the IRQ associated with the device. As an example call of
this routine is shown below:
status = IOC$NODE_FUNCTION (crb_address,
ioc$k_enable_intr);
14.7.6.2 End of Interrupt Command
As mentioned above the EOI command is critical to the success of the EISA
interrupts. This 82357 register is accessed via the IOC$NODE_FUNCTION
routine with the command index IOC$K_ISSUE_EOI. This routine call will write
the EOI register with the IRQ level assigned to the calling device, releasing the
interrupt. Early test versions of OpenVMS AXP required drivers to use this call
in the driver interrupt service routine to release the interrupt, however, the EOI
is now done by the indirect interrupt dispatcher. It is not necessary for drivers to
isse the call to IOC$NODE_FUNCTION to cause an EOI.
14.7.6.3 IOC$NODE_FUNCTION and IOC$NODE_DATA
14.7.6.3.1 IOC$NODE_FUNCTION On DEC 2000 this routine is used to enable
/disable EISA interrupts. The parameters are CRB address and function code.
The available functions are ioc$k_enable_intr and ioc$k_disable_intr. Both
ioc$k_enable_intr and ioc$k_disable_intr work on the Interrupt Mask Register
in the Interrupt Controller Chip (82357) for the EISA bus. In the driver unit
or controller init routine, after the device is set up to handle interrupts, the
driver should call IOC$NODE_FUNCTION with the ioc$k_enable_intr code. Note
14–17