]>
git.saurik.com Git - apple/xnu.git/blob - osfmk/i386/cpu_topology.h
2 * Copyright (c) 2003-2007 Apple Inc. All rights reserved.
4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. The rights granted to you under the License
10 * may not be used to create, or enable the creation or redistribution of,
11 * unlawful or unlicensed copies of an Apple operating system, or to
12 * circumvent, violate, or enable the circumvention or violation of, any
13 * terms of an Apple operating system software license agreement.
15 * Please obtain a copy of the License at
16 * http://www.opensource.apple.com/apsl/ and read it before using this file.
18 * The Original Code and all software distributed under the License are
19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23 * Please see the License for the specific language governing rights and
24 * limitations under the License.
26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
29 #ifndef _I386_CPU_TOPOLOGY_H_
30 #define _I386_CPU_TOPOLOGY_H_
33 * This was originally part of cpu_threads.h. It was split out so that
34 * these structures could be referenced without pulling in all of the headers
35 * required for the definition of cpu_data. These data structures are
36 * used by KEXTs in order to deal with the physical topology.
38 * NOTE: this header must stand on its own as much as possible
39 * and not be dependent upon any unexported, kernel-private header.
43 * Cache structure that can be used to identify the cache heirarchy.
45 typedef struct x86_cpu_cache
47 struct x86_cpu_cache
*next
; /* next cache at this level/lcpu */
48 uint8_t maxcpus
; /* maximum # of cpus that can share */
49 uint8_t nlcpus
; /* # of logical cpus sharing this cache */
50 uint8_t type
; /* type of cache */
51 uint8_t level
; /* level of cache */
52 uint16_t ways
; /* # of ways in cache */
53 uint16_t partitions
; /* # of partitions in cache */
54 uint16_t line_size
; /* size of a cache line */
55 uint32_t cache_size
; /* total size of cache */
56 struct x86_lcpu
*cpus
[0]; /* cpus sharing this cache */
59 #define CPU_CACHE_TYPE_DATA 1 /* data cache */
60 #define CPU_CACHE_TYPE_INST 2 /* instruction cache */
61 #define CPU_CACHE_TYPE_UNIF 3 /* unified cache */
63 #define CPU_CACHE_DEPTH_L1 0
64 #define CPU_CACHE_DEPTH_L2 1
65 #define CPU_CACHE_DEPTH_L3 2
67 #define MAX_CACHE_DEPTH 3 /* deepest cache */
72 typedef struct x86_lcpu
74 struct x86_lcpu
*next
; /* next logical cpu in core */
75 struct x86_lcpu
*lcpu
; /* pointer back to self */
76 struct x86_core
*core
; /* core containing the logical cpu */
77 struct cpu_data
*cpu
; /* cpu_data structure */
78 uint32_t lnum
; /* logical cpu number */
79 uint32_t pnum
; /* physical cpu number */
80 boolean_t master
; /* logical cpu is the master (boot) CPU */
81 boolean_t primary
;/* logical cpu is primary CPU in package */
82 boolean_t halted
; /* logical cpu is halted */
83 boolean_t idle
; /* logical cpu is idle */
84 uint64_t rtcPop
; /* when etimer wants a timer pop */
86 x86_cpu_cache_t
*caches
[MAX_CACHE_DEPTH
];
89 #define X86CORE_FL_PRESENT 0x80000000 /* core is present */
90 #define X86CORE_FL_READY 0x40000000 /* core struct is init'd */
91 #define X86CORE_FL_HALTED 0x00008000 /* core is halted */
92 #define X86CORE_FL_IDLE 0x00004000 /* core is idle */
94 typedef struct x86_core
96 struct x86_core
*next
; /* next core in package */
97 struct x86_lcpu
*lcpus
; /* list of logical cpus in core */
98 struct x86_pkg
*package
; /* package containing core */
100 uint32_t lcore_num
; /* logical core # (unique to package) */
101 uint32_t pcore_num
; /* physical core # (globally unique) */
102 uint32_t num_lcpus
; /* Number of logical cpus */
103 uint32_t active_lcpus
; /* Number of non-halted cpus */
104 struct pmc
*pmc
; /* Pointer to perfmon data */
105 struct hpetTimer
*Hpet
; /* Address of the HPET for this core */
106 uint32_t HpetVec
; /* Interrupt vector for HPET */
107 uint64_t HpetInt
; /* Number of HPET Interrupts */
108 uint64_t HpetCmp
; /* HPET Comparitor */
109 uint64_t HpetCfg
; /* HPET configuration */
111 void *pmStats
; /* Power management stats for core */
112 void *pmState
; /* Power management state for core */
115 #define X86PKG_FL_PRESENT 0x80000000 /* package is present */
116 #define X86PKG_FL_READY 0x40000000 /* package struct init'd */
117 #define X86PKG_FL_HAS_HPET 0x10000000 /* package has HPET assigned */
118 #define X86PKG_FL_HALTED 0x00008000 /* package is halted */
119 #define X86PKG_FL_IDLE 0x00004000 /* package is idle */
121 typedef struct x86_pkg
123 struct x86_pkg
*next
; /* next package */
124 struct x86_core
*cores
; /* list of cores in package */
126 uint32_t lpkg_num
; /* logical package # */
127 uint32_t ppkg_num
; /* physical package # */
128 uint32_t num_cores
; /* number of cores in package */
129 struct hpetTimer
*Hpet
; /* address of HPET for this package */
130 uint32_t HpetVec
; /* Interrupt vector for HPET */
131 uint64_t HpetInt
; /* Number of HPET interrupts */
132 uint64_t HpetCmp
; /* HPET comparitor */
133 uint64_t HpetCfg
; /* HPET configuration */
135 void *pmStats
; /* Power Management stats for package*/
136 void *pmState
; /* Power Management state for package*/
139 extern x86_pkg_t
*x86_pkgs
; /* root of all CPU packages */
141 /* Called after cpu discovery */
142 extern void cpu_topology_start(void);
146 #endif /* _I386_CPU_TOPOLOGY_H_ */
147 #endif /* KERNEL_PRIVATE */