diff options
author | Suresh Siddha <suresh.b.siddha@intel.com> | 2005-04-25 16:25:06 -0400 |
---|---|---|
committer | Tony Luck <tony.luck@intel.com> | 2005-04-25 16:25:06 -0400 |
commit | e927ecb05e1ce4bbb1e10f57008c94994e2160f5 (patch) | |
tree | bc8256cc074f02d557088696035982fa7ae0b301 /include | |
parent | 6118ec847e8e35393efc0f88394c2f5dd48c3313 (diff) |
[IA64] multi-core/multi-thread identification
Version 3 - rediffed to apply on top of Ashok's hotplug cpu
patch. /proc/cpuinfo output in step with x86.
This is an updated MC/MT identification patch based on the
previous discussions on list.
Add the Multi-core and Multi-threading detection for IPF.
- Add new core and threading related fields in /proc/cpuinfo.
Physical id
Core id
Thread id
Siblings
- setup the cpu_core_map and cpu_sibling_map appropriately
- Handles Hot plug CPU
Signed-off-by: Suresh Siddha <suresh.b.siddha@intel.com>
Signed-off-by: Gordon Jin <gordon.jin@intel.com>
Signed-off-by: Rohit Seth <rohit.seth@intel.com>
Signed-off-by: Tony Luck <tony.luck@intel.com>
Diffstat (limited to 'include')
-rw-r--r-- | include/asm-ia64/pal.h | 68 | ||||
-rw-r--r-- | include/asm-ia64/processor.h | 7 | ||||
-rw-r--r-- | include/asm-ia64/sal.h | 12 | ||||
-rw-r--r-- | include/asm-ia64/smp.h | 5 |
4 files changed, 92 insertions, 0 deletions
diff --git a/include/asm-ia64/pal.h b/include/asm-ia64/pal.h index 5dd477ffb88e..2303a10ee595 100644 --- a/include/asm-ia64/pal.h +++ b/include/asm-ia64/pal.h | |||
@@ -67,6 +67,7 @@ | |||
67 | #define PAL_REGISTER_INFO 39 /* return AR and CR register information*/ | 67 | #define PAL_REGISTER_INFO 39 /* return AR and CR register information*/ |
68 | #define PAL_SHUTDOWN 40 /* enter processor shutdown state */ | 68 | #define PAL_SHUTDOWN 40 /* enter processor shutdown state */ |
69 | #define PAL_PREFETCH_VISIBILITY 41 /* Make Processor Prefetches Visible */ | 69 | #define PAL_PREFETCH_VISIBILITY 41 /* Make Processor Prefetches Visible */ |
70 | #define PAL_LOGICAL_TO_PHYSICAL 42 /* returns information on logical to physical processor mapping */ | ||
70 | 71 | ||
71 | #define PAL_COPY_PAL 256 /* relocate PAL procedures and PAL PMI */ | 72 | #define PAL_COPY_PAL 256 /* relocate PAL procedures and PAL PMI */ |
72 | #define PAL_HALT_INFO 257 /* return the low power capabilities of processor */ | 73 | #define PAL_HALT_INFO 257 /* return the low power capabilities of processor */ |
@@ -1559,6 +1560,73 @@ ia64_pal_prefetch_visibility (s64 trans_type) | |||
1559 | return iprv.status; | 1560 | return iprv.status; |
1560 | } | 1561 | } |
1561 | 1562 | ||
1563 | /* data structure for getting information on logical to physical mappings */ | ||
1564 | typedef union pal_log_overview_u { | ||
1565 | struct { | ||
1566 | u64 num_log :16, /* Total number of logical | ||
1567 | * processors on this die | ||
1568 | */ | ||
1569 | tpc :8, /* Threads per core */ | ||
1570 | reserved3 :8, /* Reserved */ | ||
1571 | cpp :8, /* Cores per processor */ | ||
1572 | reserved2 :8, /* Reserved */ | ||
1573 | ppid :8, /* Physical processor ID */ | ||
1574 | reserved1 :8; /* Reserved */ | ||
1575 | } overview_bits; | ||
1576 | u64 overview_data; | ||
1577 | } pal_log_overview_t; | ||
1578 | |||
1579 | typedef union pal_proc_n_log_info1_u{ | ||
1580 | struct { | ||
1581 | u64 tid :16, /* Thread id */ | ||
1582 | reserved2 :16, /* Reserved */ | ||
1583 | cid :16, /* Core id */ | ||
1584 | reserved1 :16; /* Reserved */ | ||
1585 | } ppli1_bits; | ||
1586 | u64 ppli1_data; | ||
1587 | } pal_proc_n_log_info1_t; | ||
1588 | |||
1589 | typedef union pal_proc_n_log_info2_u { | ||
1590 | struct { | ||
1591 | u64 la :16, /* Logical address */ | ||
1592 | reserved :48; /* Reserved */ | ||
1593 | } ppli2_bits; | ||
1594 | u64 ppli2_data; | ||
1595 | } pal_proc_n_log_info2_t; | ||
1596 | |||
1597 | typedef struct pal_logical_to_physical_s | ||
1598 | { | ||
1599 | pal_log_overview_t overview; | ||
1600 | pal_proc_n_log_info1_t ppli1; | ||
1601 | pal_proc_n_log_info2_t ppli2; | ||
1602 | } pal_logical_to_physical_t; | ||
1603 | |||
1604 | #define overview_num_log overview.overview_bits.num_log | ||
1605 | #define overview_tpc overview.overview_bits.tpc | ||
1606 | #define overview_cpp overview.overview_bits.cpp | ||
1607 | #define overview_ppid overview.overview_bits.ppid | ||
1608 | #define log1_tid ppli1.ppli1_bits.tid | ||
1609 | #define log1_cid ppli1.ppli1_bits.cid | ||
1610 | #define log2_la ppli2.ppli2_bits.la | ||
1611 | |||
1612 | /* Get information on logical to physical processor mappings. */ | ||
1613 | static inline s64 | ||
1614 | ia64_pal_logical_to_phys(u64 proc_number, pal_logical_to_physical_t *mapping) | ||
1615 | { | ||
1616 | struct ia64_pal_retval iprv; | ||
1617 | |||
1618 | PAL_CALL(iprv, PAL_LOGICAL_TO_PHYSICAL, proc_number, 0, 0); | ||
1619 | |||
1620 | if (iprv.status == PAL_STATUS_SUCCESS) | ||
1621 | { | ||
1622 | if (proc_number == 0) | ||
1623 | mapping->overview.overview_data = iprv.v0; | ||
1624 | mapping->ppli1.ppli1_data = iprv.v1; | ||
1625 | mapping->ppli2.ppli2_data = iprv.v2; | ||
1626 | } | ||
1627 | |||
1628 | return iprv.status; | ||
1629 | } | ||
1562 | #endif /* __ASSEMBLY__ */ | 1630 | #endif /* __ASSEMBLY__ */ |
1563 | 1631 | ||
1564 | #endif /* _ASM_IA64_PAL_H */ | 1632 | #endif /* _ASM_IA64_PAL_H */ |
diff --git a/include/asm-ia64/processor.h b/include/asm-ia64/processor.h index 983798ec1791..9e1ba8b7fb68 100644 --- a/include/asm-ia64/processor.h +++ b/include/asm-ia64/processor.h | |||
@@ -148,6 +148,13 @@ struct cpuinfo_ia64 { | |||
148 | #ifdef CONFIG_SMP | 148 | #ifdef CONFIG_SMP |
149 | __u64 loops_per_jiffy; | 149 | __u64 loops_per_jiffy; |
150 | int cpu; | 150 | int cpu; |
151 | __u32 socket_id; /* physical processor socket id */ | ||
152 | __u16 core_id; /* core id */ | ||
153 | __u16 thread_id; /* thread id */ | ||
154 | __u16 num_log; /* Total number of logical processors on | ||
155 | * this socket that were successfully booted */ | ||
156 | __u8 cores_per_socket; /* Cores per processor socket */ | ||
157 | __u8 threads_per_core; /* Threads per core */ | ||
151 | #endif | 158 | #endif |
152 | 159 | ||
153 | /* CPUID-derived information: */ | 160 | /* CPUID-derived information: */ |
diff --git a/include/asm-ia64/sal.h b/include/asm-ia64/sal.h index 240676f75390..29df88bdd2bc 100644 --- a/include/asm-ia64/sal.h +++ b/include/asm-ia64/sal.h | |||
@@ -91,6 +91,7 @@ extern spinlock_t sal_lock; | |||
91 | #define SAL_PCI_CONFIG_READ 0x01000010 | 91 | #define SAL_PCI_CONFIG_READ 0x01000010 |
92 | #define SAL_PCI_CONFIG_WRITE 0x01000011 | 92 | #define SAL_PCI_CONFIG_WRITE 0x01000011 |
93 | #define SAL_FREQ_BASE 0x01000012 | 93 | #define SAL_FREQ_BASE 0x01000012 |
94 | #define SAL_PHYSICAL_ID_INFO 0x01000013 | ||
94 | 95 | ||
95 | #define SAL_UPDATE_PAL 0x01000020 | 96 | #define SAL_UPDATE_PAL 0x01000020 |
96 | 97 | ||
@@ -815,6 +816,17 @@ ia64_sal_update_pal (u64 param_buf, u64 scratch_buf, u64 scratch_buf_size, | |||
815 | return isrv.status; | 816 | return isrv.status; |
816 | } | 817 | } |
817 | 818 | ||
819 | /* Get physical processor die mapping in the platform. */ | ||
820 | static inline s64 | ||
821 | ia64_sal_physical_id_info(u16 *splid) | ||
822 | { | ||
823 | struct ia64_sal_retval isrv; | ||
824 | SAL_CALL(isrv, SAL_PHYSICAL_ID_INFO, 0, 0, 0, 0, 0, 0, 0); | ||
825 | if (splid) | ||
826 | *splid = isrv.v0; | ||
827 | return isrv.status; | ||
828 | } | ||
829 | |||
818 | extern unsigned long sal_platform_features; | 830 | extern unsigned long sal_platform_features; |
819 | 831 | ||
820 | extern int (*salinfo_platform_oemdata)(const u8 *, u8 **, u64 *); | 832 | extern int (*salinfo_platform_oemdata)(const u8 *, u8 **, u64 *); |
diff --git a/include/asm-ia64/smp.h b/include/asm-ia64/smp.h index c4a227acfeb0..3ba1a061e4ae 100644 --- a/include/asm-ia64/smp.h +++ b/include/asm-ia64/smp.h | |||
@@ -56,6 +56,10 @@ extern struct smp_boot_data { | |||
56 | extern char no_int_routing __devinitdata; | 56 | extern char no_int_routing __devinitdata; |
57 | 57 | ||
58 | extern cpumask_t cpu_online_map; | 58 | extern cpumask_t cpu_online_map; |
59 | extern cpumask_t cpu_core_map[NR_CPUS]; | ||
60 | extern cpumask_t cpu_sibling_map[NR_CPUS]; | ||
61 | extern int smp_num_siblings; | ||
62 | extern int smp_num_cpucores; | ||
59 | extern void __iomem *ipi_base_addr; | 63 | extern void __iomem *ipi_base_addr; |
60 | extern unsigned char smp_int_redirect; | 64 | extern unsigned char smp_int_redirect; |
61 | 65 | ||
@@ -124,6 +128,7 @@ extern int smp_call_function_single (int cpuid, void (*func) (void *info), void | |||
124 | extern void smp_send_reschedule (int cpu); | 128 | extern void smp_send_reschedule (int cpu); |
125 | extern void lock_ipi_calllock(void); | 129 | extern void lock_ipi_calllock(void); |
126 | extern void unlock_ipi_calllock(void); | 130 | extern void unlock_ipi_calllock(void); |
131 | extern void identify_siblings (struct cpuinfo_ia64 *); | ||
127 | 132 | ||
128 | #else | 133 | #else |
129 | 134 | ||