1/*
2 * Copyright 2010, Clemens Zeidler, haiku@clemens-zeidler.de.
3 * Distributed under the terms of the MIT License.
4 */
5#ifndef IRQ_ROUTING_TABLE_H
6#define IRQ_ROUTING_TABLE_H
7
8
9#include <ACPI.h>
10
11
12#include "util/Vector.h"
13
14
15struct irq_routing_entry {
16	// ACPI specifics
17	uint64		device_address;
18	uint8		pin;
19
20	acpi_handle	source;
21	uint32		source_index;
22	bool		needs_configuration;
23
24	// PCI bus_manager connection
25	uint8		pci_bus;
26	uint8		pci_device;
27	uint32		pci_function_mask;
28
29	// Distilled configuration info
30	uint8		irq;			// Global System Interrupt (GSI)
31	uint8		bios_irq;		// BIOS assigned original IRQ
32	uint8		polarity;		// B_{HIGH|LOW}_ACTIVE_POLARITY
33	uint8		trigger_mode;	// B_{LEVEL|EDGE}_TRIGGERED
34};
35
36
37typedef Vector<irq_routing_entry> IRQRoutingTable;
38
39
40struct irq_descriptor {
41	irq_descriptor();
42
43	uint8			irq;
44	bool			shareable;
45	// B_LOW_ACTIVE_POLARITY or B_HIGH_ACTIVE_POLARITY
46	uint8			polarity;
47	// B_LEVEL_TRIGGERED or B_EDGE_TRIGGERED
48	uint8			trigger_mode;
49};
50
51
52typedef Vector<irq_descriptor> irq_descriptor_list;
53
54
55struct pci_address {
56	uint8	segment;
57	uint8	bus;
58	uint8	device;
59	uint8	function;
60};
61
62
63struct link_device {
64	acpi_handle					handle;
65	irq_descriptor				current_irq;
66	Vector<irq_descriptor>		possible_irqs;
67	Vector<irq_routing_entry*>	used_by;
68};
69
70
71typedef bool (*interrupt_available_check_function)(int32 globalSystemInterrupt);
72
73
74void print_irq_descriptor(const irq_descriptor& descriptor);
75void print_irq_routing_table(const IRQRoutingTable& table);
76
77
78status_t prepare_irq_routing(acpi_module_info* acpi, IRQRoutingTable& table,
79			interrupt_available_check_function checkFunction);
80status_t enable_irq_routing(acpi_module_info* acpi,
81			IRQRoutingTable& routingTable);
82
83status_t read_current_irq(acpi_module_info* acpi, acpi_handle device,
84			irq_descriptor& descriptor);
85status_t read_possible_irqs(acpi_module_info* acpi, acpi_handle device,
86			irq_descriptor_list& descriptorList);
87
88status_t set_current_irq(acpi_module_info* acpi, acpi_handle device,
89			const irq_descriptor& descriptor);
90
91#endif	// IRQ_ROUTING_TABLE_H
92