blob: e90ac7e9ae2c6dee1abdac0fc1b3ecc638bf66e7 [file] [log] [blame]
Greg Kroah-Hartmanb2441312017-11-01 15:07:57 +01001/* SPDX-License-Identifier: GPL-2.0 */
H. Peter Anvin1965aae2008-10-22 22:26:29 -07002#ifndef _ASM_X86_MPSPEC_H
3#define _ASM_X86_MPSPEC_H
Thomas Gleixnerc2805aa2008-01-30 13:30:35 +01004
Ingo Molnar86c98352008-03-28 11:59:57 +01005
Thomas Gleixnerc2805aa2008-01-30 13:30:35 +01006#include <asm/mpspec_def.h>
Thomas Gleixnerb3f1b612009-08-20 11:11:52 +02007#include <asm/x86_init.h>
Yinghai Lucb2ded32011-01-04 16:38:52 -08008#include <asm/apicdef.h>
Thomas Gleixnerc2805aa2008-01-30 13:30:35 +01009
Jaswinder Singh Rajputa1ae2992008-12-29 20:32:52 +053010extern int pic_mode;
Yinghai Lu114945472008-08-21 01:01:19 -070011
Thomas Gleixner96a388d2007-10-11 11:20:03 +020012#ifdef CONFIG_X86_32
Ingo Molnarb2af0182009-01-28 17:36:56 +010013
14/*
15 * Summit or generic (i.e. installer) kernels need lots of bus entries.
16 * Maximum 256 PCI busses, plus 1 ISA bus in each of 4 cabinets.
17 */
18#if CONFIG_BASE_SMALL == 0
19# define MAX_MP_BUSSES 260
20#else
21# define MAX_MP_BUSSES 32
22#endif
23
24#define MAX_IRQ_SOURCES 256
Thomas Gleixnerc2805aa2008-01-30 13:30:35 +010025
Thomas Gleixnerc2805aa2008-01-30 13:30:35 +010026extern unsigned int def_to_bigsmp;
Thomas Gleixnerc2805aa2008-01-30 13:30:35 +010027
Ingo Molnarb2af0182009-01-28 17:36:56 +010028#else /* CONFIG_X86_64: */
Thomas Gleixnerc2805aa2008-01-30 13:30:35 +010029
Ingo Molnarb2af0182009-01-28 17:36:56 +010030#define MAX_MP_BUSSES 256
Thomas Gleixnerc2805aa2008-01-30 13:30:35 +010031/* Each PCI slot may be a combo card with its own bus. 4 IRQ pins per slot. */
Ingo Molnarb2af0182009-01-28 17:36:56 +010032#define MAX_IRQ_SOURCES (MAX_MP_BUSSES * 4)
Thomas Gleixnerc2805aa2008-01-30 13:30:35 +010033
Ingo Molnarb2af0182009-01-28 17:36:56 +010034#endif /* CONFIG_X86_64 */
Yinghai Luab530e12008-06-03 10:25:54 -070035
Paul Gortmakerbb8187d2012-05-17 19:06:13 -040036#ifdef CONFIG_EISA
Alexey Starikovskiyc0a282c2008-03-20 14:55:02 +030037extern int mp_bus_id_to_type[MAX_MP_BUSSES];
38#endif
39
Alexey Starikovskiya6333c32008-03-20 14:54:09 +030040extern DECLARE_BITMAP(mp_bus_not_pci, MAX_MP_BUSSES);
Alexey Starikovskiyc0a282c2008-03-20 14:55:02 +030041
Thomas Gleixnerc2805aa2008-01-30 13:30:35 +010042extern unsigned int boot_cpu_physical_apicid;
Denys Vlasenkocff9ab22016-09-13 20:12:32 +020043extern u8 boot_cpu_apic_version;
Thomas Gleixnerc2805aa2008-01-30 13:30:35 +010044extern unsigned long mp_lapic_addr;
45
Thomas Gleixnerb3f1b612009-08-20 11:11:52 +020046#ifdef CONFIG_X86_LOCAL_APIC
47extern int smp_found_config;
48#else
49# define smp_found_config 0
50#endif
51
52static inline void get_smp_config(void)
53{
54 x86_init.mpparse.get_smp_config(0);
55}
56
57static inline void early_get_smp_config(void)
58{
59 x86_init.mpparse.get_smp_config(1);
60}
61
62static inline void find_smp_config(void)
63{
Yinghai Lub24c2a92009-11-24 02:48:18 -080064 x86_init.mpparse.find_smp_config();
Thomas Gleixnerb3f1b612009-08-20 11:11:52 +020065}
Ingo Molnar550fe4f2009-01-27 17:28:08 +010066
Ingo Molnaraf1cf202008-05-25 21:16:06 +020067#ifdef CONFIG_X86_MPPARSE
Ingo Molnar5da217c2017-01-28 13:46:28 +010068extern void e820__memblock_alloc_reserved_mpc_new(void);
Yinghai Luabfe0af2009-05-20 00:37:40 -070069extern int enable_update_mptable;
Yinghai Lub24c2a92009-11-24 02:48:18 -080070extern void default_find_smp_config(void);
Thomas Gleixnerb3f1b612009-08-20 11:11:52 +020071extern void default_get_smp_config(unsigned int early);
Ingo Molnaraf1cf202008-05-25 21:16:06 +020072#else
Ingo Molnar5da217c2017-01-28 13:46:28 +010073static inline void e820__memblock_alloc_reserved_mpc_new(void) { }
Yinghai Luabfe0af2009-05-20 00:37:40 -070074#define enable_update_mptable 0
Yinghai Lub24c2a92009-11-24 02:48:18 -080075#define default_find_smp_config x86_init_noop
Thomas Gleixnerb3f1b612009-08-20 11:11:52 +020076#define default_get_smp_config x86_init_uint_noop
Ingo Molnaraf1cf202008-05-25 21:16:06 +020077#endif
Thomas Gleixnerc2805aa2008-01-30 13:30:35 +010078
Jiang Liu7e1f85f2013-09-02 11:57:36 +080079int generic_processor_info(int apicid, int version);
Thomas Gleixnerc2805aa2008-01-30 13:30:35 +010080
Yinghai Lucb2ded32011-01-04 16:38:52 -080081#define PHYSID_ARRAY_SIZE BITS_TO_LONGS(MAX_LOCAL_APIC)
Thomas Gleixnerc2805aa2008-01-30 13:30:35 +010082
Joe Perches30971e12008-03-23 01:02:49 -070083struct physid_mask {
Thomas Gleixnerc2805aa2008-01-30 13:30:35 +010084 unsigned long mask[PHYSID_ARRAY_SIZE];
85};
86
87typedef struct physid_mask physid_mask_t;
88
89#define physid_set(physid, map) set_bit(physid, (map).mask)
90#define physid_clear(physid, map) clear_bit(physid, (map).mask)
91#define physid_isset(physid, map) test_bit(physid, (map).mask)
Joe Perches30971e12008-03-23 01:02:49 -070092#define physid_test_and_set(physid, map) \
Thomas Gleixnerc2805aa2008-01-30 13:30:35 +010093 test_and_set_bit(physid, (map).mask)
94
Joe Perches30971e12008-03-23 01:02:49 -070095#define physids_and(dst, src1, src2) \
Yinghai Lucb2ded32011-01-04 16:38:52 -080096 bitmap_and((dst).mask, (src1).mask, (src2).mask, MAX_LOCAL_APIC)
Thomas Gleixnerc2805aa2008-01-30 13:30:35 +010097
Joe Perches30971e12008-03-23 01:02:49 -070098#define physids_or(dst, src1, src2) \
Yinghai Lucb2ded32011-01-04 16:38:52 -080099 bitmap_or((dst).mask, (src1).mask, (src2).mask, MAX_LOCAL_APIC)
Thomas Gleixnerc2805aa2008-01-30 13:30:35 +0100100
Joe Perches30971e12008-03-23 01:02:49 -0700101#define physids_clear(map) \
Yinghai Lucb2ded32011-01-04 16:38:52 -0800102 bitmap_zero((map).mask, MAX_LOCAL_APIC)
Thomas Gleixnerc2805aa2008-01-30 13:30:35 +0100103
Joe Perches30971e12008-03-23 01:02:49 -0700104#define physids_complement(dst, src) \
Yinghai Lucb2ded32011-01-04 16:38:52 -0800105 bitmap_complement((dst).mask, (src).mask, MAX_LOCAL_APIC)
Thomas Gleixnerc2805aa2008-01-30 13:30:35 +0100106
Joe Perches30971e12008-03-23 01:02:49 -0700107#define physids_empty(map) \
Yinghai Lucb2ded32011-01-04 16:38:52 -0800108 bitmap_empty((map).mask, MAX_LOCAL_APIC)
Thomas Gleixnerc2805aa2008-01-30 13:30:35 +0100109
Joe Perches30971e12008-03-23 01:02:49 -0700110#define physids_equal(map1, map2) \
Yinghai Lucb2ded32011-01-04 16:38:52 -0800111 bitmap_equal((map1).mask, (map2).mask, MAX_LOCAL_APIC)
Thomas Gleixnerc2805aa2008-01-30 13:30:35 +0100112
Joe Perches30971e12008-03-23 01:02:49 -0700113#define physids_weight(map) \
Yinghai Lucb2ded32011-01-04 16:38:52 -0800114 bitmap_weight((map).mask, MAX_LOCAL_APIC)
Thomas Gleixnerc2805aa2008-01-30 13:30:35 +0100115
Joe Perches30971e12008-03-23 01:02:49 -0700116#define physids_shift_right(d, s, n) \
Yinghai Lucb2ded32011-01-04 16:38:52 -0800117 bitmap_shift_right((d).mask, (s).mask, n, MAX_LOCAL_APIC)
Thomas Gleixnerc2805aa2008-01-30 13:30:35 +0100118
Joe Perches30971e12008-03-23 01:02:49 -0700119#define physids_shift_left(d, s, n) \
Yinghai Lucb2ded32011-01-04 16:38:52 -0800120 bitmap_shift_left((d).mask, (s).mask, n, MAX_LOCAL_APIC)
Thomas Gleixnerc2805aa2008-01-30 13:30:35 +0100121
Cyrill Gorcunov7abc0752009-11-10 01:06:59 +0300122static inline unsigned long physids_coerce(physid_mask_t *map)
123{
124 return map->mask[0];
125}
Thomas Gleixnerc2805aa2008-01-30 13:30:35 +0100126
Cyrill Gorcunov7abc0752009-11-10 01:06:59 +0300127static inline void physids_promote(unsigned long physids, physid_mask_t *map)
128{
129 physids_clear(*map);
130 map->mask[0] = physids;
131}
Thomas Gleixnerc2805aa2008-01-30 13:30:35 +0100132
Jack Steinerb6df1b82008-06-19 21:51:05 -0500133static inline void physid_set_mask_of_physid(int physid, physid_mask_t *map)
134{
135 physids_clear(*map);
136 physid_set(physid, *map);
137}
138
Thomas Gleixnerc2805aa2008-01-30 13:30:35 +0100139#define PHYSID_MASK_ALL { {[0 ... PHYSID_ARRAY_SIZE-1] = ~0UL} }
140#define PHYSID_MASK_NONE { {[0 ... PHYSID_ARRAY_SIZE-1] = 0UL} }
141
142extern physid_mask_t phys_cpu_present_map;
143
H. Peter Anvin1965aae2008-10-22 22:26:29 -0700144#endif /* _ASM_X86_MPSPEC_H */