blob: 765c4d5124cbb9ed59c6bf3f93bd2cd2c85c2b84 [file] [log] [blame]
Yinghai Luedb181a2008-07-25 02:17:55 -07001#ifndef __ASM_NUMAQ_APIC_H
2#define __ASM_NUMAQ_APIC_H
Linus Torvalds1da177e2005-04-16 15:20:36 -07003
4#include <asm/io.h>
5#include <linux/mmzone.h>
6#include <linux/nodemask.h>
7
8#define APIC_DFR_VALUE (APIC_DFR_CLUSTER)
9
Ingo Molnar0a9cc202009-01-28 04:30:40 +010010static inline const cpumask_t *numaq_target_cpus(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -070011{
Mike Travise7986732008-12-16 17:33:52 -080012 return &CPU_MASK_ALL;
Linus Torvalds1da177e2005-04-16 15:20:36 -070013}
14
Ingo Molnard1d7cae2009-01-28 05:41:42 +010015static inline unsigned long
16numaq_check_apicid_used(physid_mask_t bitmap, int apicid)
Yinghai Lud49c4282008-06-08 18:31:54 -070017{
18 return physid_isset(apicid, bitmap);
19}
Ingo Molnard1d7cae2009-01-28 05:41:42 +010020static inline unsigned long numaq_check_apicid_present(int bit)
Yinghai Lud49c4282008-06-08 18:31:54 -070021{
22 return physid_isset(bit, phys_cpu_present_map);
23}
Linus Torvalds1da177e2005-04-16 15:20:36 -070024#define apicid_cluster(apicid) (apicid & 0xF0)
25
Ingo Molnar7ed248d2009-01-28 03:43:47 +010026static inline int numaq_apic_id_registered(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -070027{
28 return 1;
29}
30
Ingo Molnara5c43292009-01-28 06:50:47 +010031static inline void numaq_init_apic_ldr(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -070032{
33 /* Already done in NUMA-Q firmware */
34}
35
Ingo Molnar72ce0162009-01-28 06:50:47 +010036static inline void numaq_setup_apic_routing(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -070037{
38 printk("Enabling APIC mode: %s. Using %d I/O APICs\n",
39 "NUMA-Q", nr_ioapics);
40}
41
42/*
43 * Skip adding the timer int on secondary nodes, which causes
44 * a small but painful rift in the time-space continuum.
45 */
Ingo Molnar33a201f2009-01-28 07:17:26 +010046static inline int numaq_multi_timer_check(int apic, int irq)
Linus Torvalds1da177e2005-04-16 15:20:36 -070047{
48 return apic != 0 && irq == 0;
49}
50
Ingo Molnard190cb82009-01-28 06:50:47 +010051static inline physid_mask_t numaq_ioapic_phys_id_map(physid_mask_t phys_map)
Linus Torvalds1da177e2005-04-16 15:20:36 -070052{
53 /* We don't have a good way to do this yet - hack */
54 return physids_promote(0xFUL);
55}
56
57/* Mapping from cpu number to logical apicid */
58extern u8 cpu_2_logical_apicid[];
Ingo Molnar5257c512009-01-28 06:50:47 +010059
60static inline int numaq_cpu_to_logical_apicid(int cpu)
Linus Torvalds1da177e2005-04-16 15:20:36 -070061{
Mike Travis96289372008-12-31 18:08:46 -080062 if (cpu >= nr_cpu_ids)
63 return BAD_APICID;
Linus Torvalds1da177e2005-04-16 15:20:36 -070064 return (int)cpu_2_logical_apicid[cpu];
65}
66
67/*
68 * Supporting over 60 cpus on NUMA-Q requires a locality-dependent
69 * cpu to APIC ID relation to properly interact with the intelligent
70 * mode of the cluster controller.
71 */
Ingo Molnara21769a42009-01-28 06:50:47 +010072static inline int numaq_cpu_present_to_apicid(int mps_cpu)
Linus Torvalds1da177e2005-04-16 15:20:36 -070073{
74 if (mps_cpu < 60)
75 return ((mps_cpu >> 2) << 4) | (1 << (mps_cpu & 0x3));
76 else
77 return BAD_APICID;
78}
79
Ingo Molnar3f57a312009-01-28 06:50:47 +010080static inline int numaq_apicid_to_node(int logical_apicid)
Linus Torvalds1da177e2005-04-16 15:20:36 -070081{
82 return logical_apicid >> 4;
83}
84
Ingo Molnar80587142009-01-28 06:50:47 +010085static inline physid_mask_t numaq_apicid_to_cpu_present(int logical_apicid)
Linus Torvalds1da177e2005-04-16 15:20:36 -070086{
Ingo Molnar3f57a312009-01-28 06:50:47 +010087 int node = numaq_apicid_to_node(logical_apicid);
Linus Torvalds1da177e2005-04-16 15:20:36 -070088 int cpu = __ffs(logical_apicid & 0xf);
89
90 return physid_mask_of_physid(cpu + 4*node);
91}
92
Andi Kleenc7e844f2008-02-04 16:48:03 +010093extern void *xquad_portio;
94
Ingo Molnara27a6212009-01-28 12:43:18 +010095static inline int numaq_check_phys_apicid_present(int boot_cpu_physical_apicid)
Linus Torvalds1da177e2005-04-16 15:20:36 -070096{
Ingo Molnara27a6212009-01-28 12:43:18 +010097 return 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -070098}
99
Linus Torvalds1da177e2005-04-16 15:20:36 -0700100/*
101 * We use physical apicids here, not logical, so just return the default
102 * physical broadcast to stop people from breaking us
103 */
Mike Travise7986732008-12-16 17:33:52 -0800104static inline unsigned int cpu_mask_to_apicid(const cpumask_t *cpumask)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700105{
106 return (int) 0xF;
107}
108
Mike Travis6eeb7c52008-12-16 17:33:55 -0800109static inline unsigned int cpu_mask_to_apicid_and(const struct cpumask *cpumask,
110 const struct cpumask *andmask)
Mike Travis95d313c2008-12-16 17:33:54 -0800111{
112 return (int) 0xF;
113}
114
Linus Torvalds1da177e2005-04-16 15:20:36 -0700115/* No NUMA-Q box has a HT CPU, but it can't hurt to use the default code. */
Ingo Molnarcb8cc442009-01-28 13:24:54 +0100116static inline int numaq_phys_pkg_id(int cpuid_apic, int index_msb)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700117{
118 return cpuid_apic >> index_msb;
119}
120
Yinghai Luedb181a2008-07-25 02:17:55 -0700121#endif /* __ASM_NUMAQ_APIC_H */