0001 ===============================================
0002 The irq_domain interrupt number mapping library
0003 ===============================================
0004
0005 The current design of the Linux kernel uses a single large number
0006 space where each separate IRQ source is assigned a different number.
0007 This is simple when there is only one interrupt controller, but in
0008 systems with multiple interrupt controllers the kernel must ensure
0009 that each one gets assigned non-overlapping allocations of Linux
0010 IRQ numbers.
0011
0012 The number of interrupt controllers registered as unique irqchips
0013 show a rising tendency: for example subdrivers of different kinds
0014 such as GPIO controllers avoid reimplementing identical callback
0015 mechanisms as the IRQ core system by modelling their interrupt
0016 handlers as irqchips, i.e. in effect cascading interrupt controllers.
0017
0018 Here the interrupt number loose all kind of correspondence to
0019 hardware interrupt numbers: whereas in the past, IRQ numbers could
0020 be chosen so they matched the hardware IRQ line into the root
0021 interrupt controller (i.e. the component actually fireing the
0022 interrupt line to the CPU) nowadays this number is just a number.
0023
0024 For this reason we need a mechanism to separate controller-local
0025 interrupt numbers, called hardware irq's, from Linux IRQ numbers.
0026
0027 The irq_alloc_desc*() and irq_free_desc*() APIs provide allocation of
0028 irq numbers, but they don't provide any support for reverse mapping of
0029 the controller-local IRQ (hwirq) number into the Linux IRQ number
0030 space.
0031
0032 The irq_domain library adds mapping between hwirq and IRQ numbers on
0033 top of the irq_alloc_desc*() API. An irq_domain to manage mapping is
0034 preferred over interrupt controller drivers open coding their own
0035 reverse mapping scheme.
0036
0037 irq_domain also implements translation from an abstract irq_fwspec
0038 structure to hwirq numbers (Device Tree and ACPI GSI so far), and can
0039 be easily extended to support other IRQ topology data sources.
0040
0041 irq_domain usage
0042 ================
0043
0044 An interrupt controller driver creates and registers an irq_domain by
0045 calling one of the irq_domain_add_*() or irq_domain_create_*() functions
0046 (each mapping method has a different allocator function, more on that later).
0047 The function will return a pointer to the irq_domain on success. The caller
0048 must provide the allocator function with an irq_domain_ops structure.
0049
0050 In most cases, the irq_domain will begin empty without any mappings
0051 between hwirq and IRQ numbers. Mappings are added to the irq_domain
0052 by calling irq_create_mapping() which accepts the irq_domain and a
0053 hwirq number as arguments. If a mapping for the hwirq doesn't already
0054 exist then it will allocate a new Linux irq_desc, associate it with
0055 the hwirq, and call the .map() callback so the driver can perform any
0056 required hardware setup.
0057
0058 Once a mapping has been established, it can be retrieved or used via a
0059 variety of methods:
0060
0061 - irq_resolve_mapping() returns a pointer to the irq_desc structure
0062 for a given domain and hwirq number, and NULL if there was no
0063 mapping.
0064 - irq_find_mapping() returns a Linux IRQ number for a given domain and
0065 hwirq number, and 0 if there was no mapping
0066 - irq_linear_revmap() is now identical to irq_find_mapping(), and is
0067 deprecated
0068 - generic_handle_domain_irq() handles an interrupt described by a
0069 domain and a hwirq number
0070
0071 Note that irq domain lookups must happen in contexts that are
0072 compatible with a RCU read-side critical section.
0073
0074 The irq_create_mapping() function must be called *atleast once*
0075 before any call to irq_find_mapping(), lest the descriptor will not
0076 be allocated.
0077
0078 If the driver has the Linux IRQ number or the irq_data pointer, and
0079 needs to know the associated hwirq number (such as in the irq_chip
0080 callbacks) then it can be directly obtained from irq_data->hwirq.
0081
0082 Types of irq_domain mappings
0083 ============================
0084
0085 There are several mechanisms available for reverse mapping from hwirq
0086 to Linux irq, and each mechanism uses a different allocation function.
0087 Which reverse map type should be used depends on the use case. Each
0088 of the reverse map types are described below:
0089
0090 Linear
0091 ------
0092
0093 ::
0094
0095 irq_domain_add_linear()
0096 irq_domain_create_linear()
0097
0098 The linear reverse map maintains a fixed size table indexed by the
0099 hwirq number. When a hwirq is mapped, an irq_desc is allocated for
0100 the hwirq, and the IRQ number is stored in the table.
0101
0102 The Linear map is a good choice when the maximum number of hwirqs is
0103 fixed and a relatively small number (~ < 256). The advantages of this
0104 map are fixed time lookup for IRQ numbers, and irq_descs are only
0105 allocated for in-use IRQs. The disadvantage is that the table must be
0106 as large as the largest possible hwirq number.
0107
0108 irq_domain_add_linear() and irq_domain_create_linear() are functionally
0109 equivalent, except for the first argument is different - the former
0110 accepts an Open Firmware specific 'struct device_node', while the latter
0111 accepts a more general abstraction 'struct fwnode_handle'.
0112
0113 The majority of drivers should use the linear map.
0114
0115 Tree
0116 ----
0117
0118 ::
0119
0120 irq_domain_add_tree()
0121 irq_domain_create_tree()
0122
0123 The irq_domain maintains a radix tree map from hwirq numbers to Linux
0124 IRQs. When an hwirq is mapped, an irq_desc is allocated and the
0125 hwirq is used as the lookup key for the radix tree.
0126
0127 The tree map is a good choice if the hwirq number can be very large
0128 since it doesn't need to allocate a table as large as the largest
0129 hwirq number. The disadvantage is that hwirq to IRQ number lookup is
0130 dependent on how many entries are in the table.
0131
0132 irq_domain_add_tree() and irq_domain_create_tree() are functionally
0133 equivalent, except for the first argument is different - the former
0134 accepts an Open Firmware specific 'struct device_node', while the latter
0135 accepts a more general abstraction 'struct fwnode_handle'.
0136
0137 Very few drivers should need this mapping.
0138
0139 No Map
0140 ------
0141
0142 ::
0143
0144 irq_domain_add_nomap()
0145
0146 The No Map mapping is to be used when the hwirq number is
0147 programmable in the hardware. In this case it is best to program the
0148 Linux IRQ number into the hardware itself so that no mapping is
0149 required. Calling irq_create_direct_mapping() will allocate a Linux
0150 IRQ number and call the .map() callback so that driver can program the
0151 Linux IRQ number into the hardware.
0152
0153 Most drivers cannot use this mapping, and it is now gated on the
0154 CONFIG_IRQ_DOMAIN_NOMAP option. Please refrain from introducing new
0155 users of this API.
0156
0157 Legacy
0158 ------
0159
0160 ::
0161
0162 irq_domain_add_simple()
0163 irq_domain_add_legacy()
0164 irq_domain_create_simple()
0165 irq_domain_create_legacy()
0166
0167 The Legacy mapping is a special case for drivers that already have a
0168 range of irq_descs allocated for the hwirqs. It is used when the
0169 driver cannot be immediately converted to use the linear mapping. For
0170 example, many embedded system board support files use a set of #defines
0171 for IRQ numbers that are passed to struct device registrations. In that
0172 case the Linux IRQ numbers cannot be dynamically assigned and the legacy
0173 mapping should be used.
0174
0175 As the name implies, the \*_legacy() functions are deprecated and only
0176 exist to ease the support of ancient platforms. No new users should be
0177 added. Same goes for the \*_simple() functions when their use results
0178 in the legacy behaviour.
0179
0180 The legacy map assumes a contiguous range of IRQ numbers has already
0181 been allocated for the controller and that the IRQ number can be
0182 calculated by adding a fixed offset to the hwirq number, and
0183 visa-versa. The disadvantage is that it requires the interrupt
0184 controller to manage IRQ allocations and it requires an irq_desc to be
0185 allocated for every hwirq, even if it is unused.
0186
0187 The legacy map should only be used if fixed IRQ mappings must be
0188 supported. For example, ISA controllers would use the legacy map for
0189 mapping Linux IRQs 0-15 so that existing ISA drivers get the correct IRQ
0190 numbers.
0191
0192 Most users of legacy mappings should use irq_domain_add_simple() or
0193 irq_domain_create_simple() which will use a legacy domain only if an IRQ range
0194 is supplied by the system and will otherwise use a linear domain mapping.
0195 The semantics of this call are such that if an IRQ range is specified then
0196 descriptors will be allocated on-the-fly for it, and if no range is
0197 specified it will fall through to irq_domain_add_linear() or
0198 irq_domain_create_linear() which means *no* irq descriptors will be allocated.
0199
0200 A typical use case for simple domains is where an irqchip provider
0201 is supporting both dynamic and static IRQ assignments.
0202
0203 In order to avoid ending up in a situation where a linear domain is
0204 used and no descriptor gets allocated it is very important to make sure
0205 that the driver using the simple domain call irq_create_mapping()
0206 before any irq_find_mapping() since the latter will actually work
0207 for the static IRQ assignment case.
0208
0209 irq_domain_add_simple() and irq_domain_create_simple() as well as
0210 irq_domain_add_legacy() and irq_domain_create_legacy() are functionally
0211 equivalent, except for the first argument is different - the former
0212 accepts an Open Firmware specific 'struct device_node', while the latter
0213 accepts a more general abstraction 'struct fwnode_handle'.
0214
0215 Hierarchy IRQ domain
0216 --------------------
0217
0218 On some architectures, there may be multiple interrupt controllers
0219 involved in delivering an interrupt from the device to the target CPU.
0220 Let's look at a typical interrupt delivering path on x86 platforms::
0221
0222 Device --> IOAPIC -> Interrupt remapping Controller -> Local APIC -> CPU
0223
0224 There are three interrupt controllers involved:
0225
0226 1) IOAPIC controller
0227 2) Interrupt remapping controller
0228 3) Local APIC controller
0229
0230 To support such a hardware topology and make software architecture match
0231 hardware architecture, an irq_domain data structure is built for each
0232 interrupt controller and those irq_domains are organized into hierarchy.
0233 When building irq_domain hierarchy, the irq_domain near to the device is
0234 child and the irq_domain near to CPU is parent. So a hierarchy structure
0235 as below will be built for the example above::
0236
0237 CPU Vector irq_domain (root irq_domain to manage CPU vectors)
0238 ^
0239 |
0240 Interrupt Remapping irq_domain (manage irq_remapping entries)
0241 ^
0242 |
0243 IOAPIC irq_domain (manage IOAPIC delivery entries/pins)
0244
0245 There are four major interfaces to use hierarchy irq_domain:
0246
0247 1) irq_domain_alloc_irqs(): allocate IRQ descriptors and interrupt
0248 controller related resources to deliver these interrupts.
0249 2) irq_domain_free_irqs(): free IRQ descriptors and interrupt controller
0250 related resources associated with these interrupts.
0251 3) irq_domain_activate_irq(): activate interrupt controller hardware to
0252 deliver the interrupt.
0253 4) irq_domain_deactivate_irq(): deactivate interrupt controller hardware
0254 to stop delivering the interrupt.
0255
0256 Following changes are needed to support hierarchy irq_domain:
0257
0258 1) a new field 'parent' is added to struct irq_domain; it's used to
0259 maintain irq_domain hierarchy information.
0260 2) a new field 'parent_data' is added to struct irq_data; it's used to
0261 build hierarchy irq_data to match hierarchy irq_domains. The irq_data
0262 is used to store irq_domain pointer and hardware irq number.
0263 3) new callbacks are added to struct irq_domain_ops to support hierarchy
0264 irq_domain operations.
0265
0266 With support of hierarchy irq_domain and hierarchy irq_data ready, an
0267 irq_domain structure is built for each interrupt controller, and an
0268 irq_data structure is allocated for each irq_domain associated with an
0269 IRQ. Now we could go one step further to support stacked(hierarchy)
0270 irq_chip. That is, an irq_chip is associated with each irq_data along
0271 the hierarchy. A child irq_chip may implement a required action by
0272 itself or by cooperating with its parent irq_chip.
0273
0274 With stacked irq_chip, interrupt controller driver only needs to deal
0275 with the hardware managed by itself and may ask for services from its
0276 parent irq_chip when needed. So we could achieve a much cleaner
0277 software architecture.
0278
0279 For an interrupt controller driver to support hierarchy irq_domain, it
0280 needs to:
0281
0282 1) Implement irq_domain_ops.alloc and irq_domain_ops.free
0283 2) Optionally implement irq_domain_ops.activate and
0284 irq_domain_ops.deactivate.
0285 3) Optionally implement an irq_chip to manage the interrupt controller
0286 hardware.
0287 4) No need to implement irq_domain_ops.map and irq_domain_ops.unmap,
0288 they are unused with hierarchy irq_domain.
0289
0290 Hierarchy irq_domain is in no way x86 specific, and is heavily used to
0291 support other architectures, such as ARM, ARM64 etc.
0292
0293 Debugging
0294 =========
0295
0296 Most of the internals of the IRQ subsystem are exposed in debugfs by
0297 turning CONFIG_GENERIC_IRQ_DEBUGFS on.