0% found this document useful (0 votes)
206 views

Message Signaled Interrupts

This document discusses Message Signaled Interrupts (MSI) as an alternative to the traditional interrupt handling method used in PCs. It describes how MSI allows interrupt information to be delivered in a single step from a device to the CPU, using new registers added to the PCI configuration space. These MSI capability registers include the MSI control, address, and data registers which are used to enable MSI and provide the interrupt vector and destination information. Sample code is provided to demonstrate configuring a NIC to use MSI and trigger interrupts.

Uploaded by

prashanthkumarus
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
206 views

Message Signaled Interrupts

This document discusses Message Signaled Interrupts (MSI) as an alternative to the traditional interrupt handling method used in PCs. It describes how MSI allows interrupt information to be delivered in a single step from a device to the CPU, using new registers added to the PCI configuration space. These MSI capability registers include the MSI control, address, and data registers which are used to enable MSI and provide the interrupt vector and destination information. Sample code is provided to demonstrate configuring a NIC to use MSI and trigger interrupts.

Uploaded by

prashanthkumarus
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
You are on page 1/ 14

Message Signaled Interrupts

A look at our network controller’s


optional capability to utilize
Message Signaled Interrupts
The ‘old’ way
• In order to appreciate the benefits of using
Message Signaled Interrupts, let’s first see
how devices do interrupts in a legacy PC
I/O Device Interrupt main
Controller memory
IRQ2 CPU
ISR
I/O Device EFLAGS
IRR INTR
ESP stack
IRQ1
I/O Device IMR INTA EIP
APP
IRQ0 ISR IVT
I/O Device

system bus
Multi-step communication
• A device signals that it needs CPU service
• The Interrupt Controller signals the CPU
• The CPU responds with two INTA cycles
– First INTA causes bit-changes in IRR and ISR
– Second INTA puts ID-number on system bus
• CPU uses ID-number to lookup IVT entry
• CPU saves minimum context on its stack,
adjusts eflags, and jumps to specified ISR
Faster, cheaper, and more
• Faster response to interrupts is possible if
the old multi-step communication scheme
can be replaced by a single-step protocol
• Less expensive PCs can be manufactured
if their total number of signal pins and the
physical interconnections can be reduced
• More devices can have their own ‘private’
interrupt(s) if signal lines aren’t required
The ‘new’ way
• Message Signaling allows all the needed
information to arrive in a single package,
and go directly from a device to the CPU
main
memory
I/O Device CPU
ISR
EFLAGS

ESP stack
I/O Device I/O Device
EIP
APP

IVT

system bus
Implementation
• The customary PCI Configuration Space is
modified to accommodate three additional
registers, which collectively are known as
the MSI Capability Register Set:
• An MSI Control Register (16 bits)
• An MSI Address Register (32 bits/64 bits)
• An MSI Data Register (32 bits)
• (In fact these additions fit within a broader
scheme of so-called “new capabilities”)
PCI Command Register
15 10 9 8 7 6 5 4 3 2 1 0

Interrupt Disable
Fast Back-to-Back Enable
SERR# Enable
Stepping Control
Parity Error Response
VGA Palette Snoop Enable
Memory Write and Invalidate Enable
Special Cycles
Bus Master Enable
Memory Space Enable
I/O Space Enable
PCI Status Register
15 14 13 12 11 10 9 8 7 6 5 4 3 0

Interrupt Status
Capabilities List
Reserved
Reserved
Fast Back-to-Back Capable
Master Data Parity Error
DEVSEL Timing
Signaled Target-Abort
Received Target-Abort
Received Master-Abort
Signaled System Error
Detected Parity-Error
MSI Control Register
15 8 7 6 4 3 1 0

reserved 1 0 0 0 0 0 0 0

64-bit address capable (1=yes, 0=no)

multiple messages enable


multiple messages capable
000 = 1 message
001 = 2 messages
010 = 4 messages
011 = 8 messages
100 = 16 messages MSI Enable (1=yes, 0=no)
101 = 32 messages
110 = reserved
111 = reserved
MSI Address Register
63 32

00000000000000000000000000000000

31 20 19 12 3 2 1 0
Destination R D
111111101110 ID
reserved 00
H M

0xFEE
Specifies which processor in the system will be
the recipient the Message Signaled Interrupt

RH = Redirection Hint (0=No redirection, 1=Utilize


destination mode to determine message recipient)

DM = Destination Mode (0=Physical,1=Logical)


Specifies how Destination ID will be interpreted
MSI Data Register
31 16

reserved

15 14 11 8 7 0
T T Delivery
reserved vector
M L Mode

Delivery Mode
000=Fixed 001=Lowest Priority
010=SMI 011=Reserved
100=NMI 101=INIT
110=Reserved 111=ExtINT

Trigger Level (1=Assert, 0=Deassert)

Trigger Mode (0=Edge, 1=Level)


Recall NIC’s interrupt registers
enum {
E1000_ICR = 0x00C0, // Interrupt Cause Read
E1000_ICS = 0x00C8, // Interrupt Cause Set
E1000_IMS = 0x00D0, // Interrupt Mask Set
E1000_IMC = 0x00D8, // Interrupt Mask Clear
};

Registers’ usage

You use Interrupt Mask Set to selectively enable the NIC’s various interrupts;
You use Interrupt Mask Clear to selectively disable any of the NIC’s interrupts;
You use Interrupt Cause Read to find out which events have caused the NIC
to generate an interrupt (and then you can ‘clear’ those bits by writing to ICR);
You can write to the Interrupt Cause Set register to selectively trigger the NIC
to generate any of its various interrupts -- provided they have been ‘enabled’
by bits being previously set in the NIC’s Interrupt Mask Register.
Demo module: ‘msidemo.c’
• This module installs an interrupt-handler
for an otherwise unused interrupt-vector
• It initializes the MSI Capability Registers
residing in our Intel Pro1000 controller’s
PCI Configuration Space, to enable the
NIC to issue Message Signaled Interrupts
• It creates a pseudo-file (‘/proc/msidemo’)
that triggers an interrupt when it’s read
Tools
• The ‘unused’ interrupt-number is selected
by examining the settings in the IOAPIC’s
Redirection Table (e.g., for serial-UART)
• Our NIC’s PCI Configuration Space can be
viewed by installing our ‘82573.c’ module
and reading its pseudo-file (‘/proc/82573’)
• We can watch interrupts being generated
with our ‘smpwatch’ application-program

You might also like