1/*
2 * Copyright 2008, Dustin Howett, dustin.howett@gmail.com. All rights reserved.
3 * Copyright 2005, Axel Dörfler, axeld@pinc-software.de. All rights reserved.
4 * Distributed under the terms of the MIT License.
5 *
6 * Copyright 2001-2002, Travis Geiselbrecht. All rights reserved.
7 * Distributed under the terms of the NewOS License.
8 */
9#ifndef _KERNEL_ARCH_x86_ARCH_SMP_H
10#define _KERNEL_ARCH_x86_ARCH_SMP_H
11
12#define MP_FLOATING_SIGNATURE			'_PM_'
13#define MP_CONFIG_TABLE_SIGNATURE		'PCMP'
14
15/*
16#define IPI_CACHE_FLUSH			0x40
17#define IPI_INV_TLB				0x41
18#define IPI_INV_PTE				0x42
19#define IPI_INV_RESCHED			0x43
20#define IPI_STOP				0x44
21*/
22
23struct mp_config_table {
24	uint32	signature;			/* "PCMP" */
25	uint16	base_table_length;	/* length of the base table entries and this structure */
26	uint8	spec_revision;		/* spec supported, 1 for 1.1 or 4 for 1.4 */
27	uint8	checksum;			/* checksum, all bytes add up to zero */
28	char	oem[8];				/* oem identification, not null-terminated */
29	char	product[12];		/* product name, not null-terminated */
30	void	*oem_table;			/* addr of oem-defined table, zero if none */
31	uint16	oem_length;			/* length of oem table */
32	uint16	num_base_entries;	/* number of entries in base table */
33	uint32	apic;				/* address of apic */
34	uint16	ext_length;			/* length of extended section */
35	uint8	ext_checksum;		/* checksum of extended table entries */
36	uint8	reserved;
37};
38
39struct mp_floating_struct {
40	uint32	signature;			/* "_MP_" */
41	struct mp_config_table *config_table; /* address of mp configuration table */
42	uint8	config_length;		/* length of the table in 16-byte units */
43	uint8	spec_revision;		/* spec supported, 1 for 1.1 or 4 for 1.4 */
44	uint8	checksum;			/* checksum, all bytes add up to zero */
45	uint8	mp_feature_1;		/* mp system configuration type if no mpc */
46	uint8	mp_feature_2;		/* imcrp */
47	uint8	mp_feature_3, mp_feature_4, mp_feature_5; /* reserved */
48};
49
50/* base config entry types */
51enum {
52	MP_BASE_PROCESSOR = 0,
53	MP_BASE_BUS,
54	MP_BASE_IO_APIC,
55	MP_BASE_IO_INTR,
56	MP_BASE_LOCAL_INTR,
57};
58
59struct mp_base_processor {
60	uint8	type;
61	uint8	apic_id;
62	uint8	apic_version;
63	uint8	cpu_flags;
64	uint32	signature;			/* stepping, model, family, each four bits */
65	uint32	feature_flags;
66	uint32	res1, res2;
67};
68
69struct mp_base_ioapic {
70	uint8	type;
71	uint8	ioapic_id;
72	uint8	ioapic_version;
73	uint8	ioapic_flags;
74	uint32	*addr;
75};
76
77struct mp_base_bus {
78	uint8	type;
79	uint8	bus_id;
80	char	name[6];
81};
82
83struct mp_base_interrupt {
84	uint8	type;
85	uint8	interrupt_type;
86	uint16	polarity : 2;
87	uint16	trigger_mode : 2;
88	uint16	_reserved : 12;
89	uint8	source_bus_id;
90	uint8	source_bus_irq;
91	uint8	dest_apic_id;
92	uint8	dest_apic_int;
93};
94
95enum {
96	MP_INTR_TYPE_INT = 0,
97	MP_INTR_TYPE_NMI,
98	MP_INTR_TYPE_SMI,
99	MP_INTR_TYPE_ExtINT,
100};
101
102
103#ifdef __cplusplus
104extern "C" {
105#endif
106
107
108uint32 x86_get_cpu_apic_id(int32 cpu);
109
110
111#ifdef __cplusplus
112}
113#endif
114
115
116#endif	/* _KERNEL_ARCH_x86_ARCH_SMP_H */
117