blob: 976399debb3f1511a6b2c8faedf26c491fc97ce1 [file] [log] [blame]
Yinghai Lu1176fa92008-07-25 02:17:21 -07001#ifndef __ASM_MACH_APIC_H
2#define __ASM_MACH_APIC_H
Linus Torvalds1da177e2005-04-16 15:20:36 -07003
Glauber de Oliveira Costacbe879f2008-03-19 14:25:19 -03004#define xapic_phys_to_log_apicid(cpu) (per_cpu(x86_bios_cpu_apicid, cpu))
Linus Torvalds1da177e2005-04-16 15:20:36 -07005#define esr_disable (1)
6
Linus Torvalds1da177e2005-04-16 15:20:36 -07007static inline int apic_id_registered(void)
8{
9 return (1);
10}
11
Mike Travise7986732008-12-16 17:33:52 -080012static inline const cpumask_t *target_cpus(void)
Yinghai Lu1176fa92008-07-25 02:17:21 -070013{
Yinghai Lu497c9a12008-08-19 20:50:28 -070014#ifdef CONFIG_SMP
Mike Travise7986732008-12-16 17:33:52 -080015 return &cpu_online_map;
Yinghai Lu497c9a12008-08-19 20:50:28 -070016#else
Mike Travise7986732008-12-16 17:33:52 -080017 return &cpumask_of_cpu(0);
Yinghai Lu497c9a12008-08-19 20:50:28 -070018#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -070019}
Linus Torvalds1da177e2005-04-16 15:20:36 -070020
Ashok Raj1855a2c2006-01-06 00:12:08 -080021#undef APIC_DEST_LOGICAL
Yinghai Lu1176fa92008-07-25 02:17:21 -070022#define APIC_DEST_LOGICAL 0
Ashok Raj1855a2c2006-01-06 00:12:08 -080023#define APIC_DFR_VALUE (APIC_DFR_FLAT)
24#define INT_DELIVERY_MODE (dest_Fixed)
25#define INT_DEST_MODE (0) /* phys delivery to target proc */
26#define NO_BALANCE_IRQ (0)
Linus Torvalds1da177e2005-04-16 15:20:36 -070027
28static inline unsigned long check_apicid_used(physid_mask_t bitmap, int apicid)
29{
Ashok Raj1855a2c2006-01-06 00:12:08 -080030 return (0);
Linus Torvalds1da177e2005-04-16 15:20:36 -070031}
32
Ashok Raj1855a2c2006-01-06 00:12:08 -080033static inline unsigned long check_apicid_present(int bit)
Linus Torvalds1da177e2005-04-16 15:20:36 -070034{
Ashok Raj1855a2c2006-01-06 00:12:08 -080035 return (1);
Linus Torvalds1da177e2005-04-16 15:20:36 -070036}
37
Ashok Raj1855a2c2006-01-06 00:12:08 -080038static inline unsigned long calculate_ldr(int cpu)
Linus Torvalds1da177e2005-04-16 15:20:36 -070039{
Ashok Raj1855a2c2006-01-06 00:12:08 -080040 unsigned long val, id;
41 val = apic_read(APIC_LDR) & ~APIC_LDR_MASK;
42 id = xapic_phys_to_log_apicid(cpu);
43 val |= SET_APIC_LOGICAL_ID(id);
44 return val;
Linus Torvalds1da177e2005-04-16 15:20:36 -070045}
46
47/*
48 * Set up the logical destination ID.
49 *
50 * Intel recommends to set DFR, LDR and TPR before enabling
51 * an APIC. See e.g. "AP-388 82489DX User's Manual" (Intel
52 * document number 292116). So here it goes...
53 */
54static inline void init_apic_ldr(void)
55{
56 unsigned long val;
Ashok Raj1855a2c2006-01-06 00:12:08 -080057 int cpu = smp_processor_id();
Linus Torvalds1da177e2005-04-16 15:20:36 -070058
Maciej W. Rozycki593f4a72008-07-16 19:15:30 +010059 apic_write(APIC_DFR, APIC_DFR_VALUE);
Ashok Raj1855a2c2006-01-06 00:12:08 -080060 val = calculate_ldr(cpu);
Maciej W. Rozycki593f4a72008-07-16 19:15:30 +010061 apic_write(APIC_LDR, val);
Linus Torvalds1da177e2005-04-16 15:20:36 -070062}
63
Ingo Molnar3c43f032007-05-02 19:27:04 +020064static inline void setup_apic_routing(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -070065{
66 printk("Enabling APIC mode: %s. Using %d I/O APICs\n",
Ashok Raj1855a2c2006-01-06 00:12:08 -080067 "Physflat", nr_ioapics);
Linus Torvalds1da177e2005-04-16 15:20:36 -070068}
69
70static inline int multi_timer_check(int apic, int irq)
71{
Ashok Raj1855a2c2006-01-06 00:12:08 -080072 return (0);
Linus Torvalds1da177e2005-04-16 15:20:36 -070073}
74
75static inline int apicid_to_node(int logical_apicid)
76{
Yinghai Luf47f9d52008-06-24 22:13:15 -070077 return apicid_2_node[hard_smp_processor_id()];
Linus Torvalds1da177e2005-04-16 15:20:36 -070078}
79
Linus Torvalds1da177e2005-04-16 15:20:36 -070080static inline int cpu_present_to_apicid(int mps_cpu)
81{
Mike Travise7986732008-12-16 17:33:52 -080082 if (mps_cpu < nr_cpu_ids)
Glauber de Oliveira Costacbe879f2008-03-19 14:25:19 -030083 return (int) per_cpu(x86_bios_cpu_apicid, mps_cpu);
Ashok Raj1855a2c2006-01-06 00:12:08 -080084
85 return BAD_APICID;
Linus Torvalds1da177e2005-04-16 15:20:36 -070086}
87
88static inline physid_mask_t apicid_to_cpu_present(int phys_apicid)
89{
90 return physid_mask_of_physid(phys_apicid);
91}
92
93extern u8 cpu_2_logical_apicid[];
94/* Mapping from cpu number to logical apicid */
95static inline int cpu_to_logical_apicid(int cpu)
96{
Mike Travise7986732008-12-16 17:33:52 -080097 if (cpu >= nr_cpu_ids)
Ashok Raj1855a2c2006-01-06 00:12:08 -080098 return BAD_APICID;
99 return cpu_physical_id(cpu);
100}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700101
Linus Torvalds1da177e2005-04-16 15:20:36 -0700102static inline physid_mask_t ioapic_phys_id_map(physid_mask_t phys_map)
103{
104 /* For clustered we don't have a good way to do this yet - hack */
Ashok Raj1855a2c2006-01-06 00:12:08 -0800105 return physids_promote(0xFFL);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700106}
107
Linus Torvalds1da177e2005-04-16 15:20:36 -0700108static inline void setup_portio_remap(void)
109{
110}
111
112static inline void enable_apic_mode(void)
113{
114}
115
116static inline int check_phys_apicid_present(int boot_cpu_physical_apicid)
117{
118 return (1);
119}
120
121/* As we are using single CPU as destination, pick only one CPU here */
Mike Travise7986732008-12-16 17:33:52 -0800122static inline unsigned int cpu_mask_to_apicid(const cpumask_t *cpumask)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700123{
124 int cpu;
125 int apicid;
126
Mike Travise7986732008-12-16 17:33:52 -0800127 cpu = first_cpu(*cpumask);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700128 apicid = cpu_to_logical_apicid(cpu);
129 return apicid;
130}
131
Mike Travis6eeb7c52008-12-16 17:33:55 -0800132static inline unsigned int cpu_mask_to_apicid_and(const struct cpumask *cpumask,
133 const struct cpumask *andmask)
Mike Travis95d313c2008-12-16 17:33:54 -0800134{
135 int cpu;
136
137 /*
138 * We're using fixed IRQ delivery, can only return one phys APIC ID.
139 * May as well be the first.
140 */
Mike Travis6eeb7c52008-12-16 17:33:55 -0800141 cpu = cpumask_any_and(cpumask, andmask);
142 if (cpu < nr_cpu_ids)
143 return cpu_to_logical_apicid(cpu);
Mike Travis95d313c2008-12-16 17:33:54 -0800144
145 return BAD_APICID;
146}
147
Linus Torvalds1da177e2005-04-16 15:20:36 -0700148static inline u32 phys_pkg_id(u32 cpuid_apic, int index_msb)
149{
150 return cpuid_apic >> index_msb;
151}
152
Yinghai Lu1176fa92008-07-25 02:17:21 -0700153#endif /* __ASM_MACH_APIC_H */