From: "Martin J. Bligh" <mbligh@aracnet.com>
To: Linus Torvalds <torvalds@transmeta.com>
Cc: linux-kernel <linux-kernel@vger.kernel.org>
Subject: [PATCH] Summit support for 2.5 [2/4]
Date: Sun, 13 Oct 2002 13:42:02 -0700 [thread overview]
Message-ID: <39890000.1034541722@flay> (raw)
Patch originally by James Cleverdon
This patch adds APIC support for the Summit chipset, all hidden
under CLUSTERED_APIC_XAPIC. These chips have a different
addressing mode, and a larger broadcast ID. This will change
nothing for normal boxes ....
-------
diff -purN -X /home/mbligh/.diff.exclude summit-1/arch/i386/kernel/apic.c summit-2/arch/i386/kernel/apic.c
--- summit-1/arch/i386/kernel/apic.c Sun Oct 13 11:10:36 2002
+++ summit-2/arch/i386/kernel/apic.c Sun Oct 13 11:11:03 2002
@@ -290,6 +290,17 @@ void __init init_bsp_APIC(void)
apic_write_around(APIC_LVT1, value);
}
+static inline unsigned long calculate_ldr(unsigned long old)
+{
+ unsigned long id;
+
+ if (clustered_apic_mode == CLUSTERED_APIC_XAPIC)
+ id = xapic_phys_to_log_apicid(hard_smp_processor_id());
+ else
+ id = 1UL << smp_processor_id();
+ return ((old & ~APIC_LDR_MASK) | SET_APIC_LOGICAL_ID(id));
+}
+
void __init setup_local_APIC (void)
{
unsigned long value, ver, maxlvt;
@@ -322,21 +333,18 @@ void __init setup_local_APIC (void)
* document number 292116). So here it goes...
*/
+ /* For NUMA-Q, the firmware does this for us. */
if (clustered_apic_mode != CLUSTERED_APIC_NUMAQ) {
- /*
- * In clustered apic mode, the firmware does this for us
- * Put the APIC into flat delivery mode.
- * Must be "all ones" explicitly for 82489DX.
- */
- apic_write_around(APIC_DFR, 0xffffffff);
-
- /*
- * Set up the logical destination ID.
- */
+ if (clustered_apic_mode == CLUSTERED_APIC_XAPIC)
+ /* Put the APIC into clustered delivery mode */
+ apic_write_around(APIC_DFR, APIC_DFR_CLUSTER);
+ else
+ /* Put the APIC into flat delivery mode */
+ apic_write_around(APIC_DFR, APIC_DFR_FLAT);
+
+ /* Set up the logical destination ID */
value = apic_read(APIC_LDR);
- value &= ~APIC_LDR_MASK;
- value |= (1<<(smp_processor_id()+24));
- apic_write_around(APIC_LDR, value);
+ apic_write_around(APIC_LDR, calculate_ldr(value));
}
/*
diff -purN -X /home/mbligh/.diff.exclude summit-1/arch/i386/kernel/io_apic.c summit-2/arch/i386/kernel/io_apic.c
--- summit-1/arch/i386/kernel/io_apic.c Sun Oct 13 11:10:36 2002
+++ summit-2/arch/i386/kernel/io_apic.c Sun Oct 13 11:11:03 2002
@@ -1130,7 +1130,7 @@ static void __init setup_ioapic_ids_from
int apic;
int i;
unsigned char old_id;
- unsigned long flags;
+ unsigned long flags, apic_broadcast_id;
if (acpi_ioapic)
/* This gets done during IOAPIC enumeration for ACPI. */
@@ -1139,6 +1139,12 @@ static void __init setup_ioapic_ids_from
if (clustered_apic_mode)
/* We don't have a good way to do this yet - hack */
phys_id_present_map = (u_long) 0xf;
+
+ if (clustered_apic_mode == CLUSTERED_APIC_XAPIC)
+ apic_broadcast_id = XAPIC_BROADCAST_ID;
+ else
+ apic_broadcast_id = APIC_BROADCAST_ID;
+
/*
* Set the IOAPIC ID to the value stored in the MPC table.
*/
@@ -1151,7 +1157,7 @@ static void __init setup_ioapic_ids_from
old_id = mp_ioapics[apic].mpc_apicid;
- if (mp_ioapics[apic].mpc_apicid >= 0xf) {
+ if (mp_ioapics[apic].mpc_apicid >= apic_broadcast_id) {
printk(KERN_ERR "BIOS bug, IO-APIC#%d ID is %d in the MPC table!...\n",
apic, mp_ioapics[apic].mpc_apicid);
printk(KERN_ERR "... fixing up to %d. (tell your hw vendor)\n",
@@ -1163,14 +1169,16 @@ static void __init setup_ioapic_ids_from
* Sanity check, is the ID really free? Every APIC in a
* system must have a unique ID or we get lots of nice
* 'stuck on smp_invalidate_needed IPI wait' messages.
+ * I/O APIC IDs no longer have any meaning for xAPICs.
*/
- if (phys_id_present_map & (1 << mp_ioapics[apic].mpc_apicid)) {
+ if ((clustered_apic_mode != CLUSTERED_APIC_XAPIC) &&
+ (phys_id_present_map & (1<<mp_ioapics[apic].mpc_apicid))) {
printk(KERN_ERR "BIOS bug, IO-APIC#%d ID %d is already used!...\n",
apic, mp_ioapics[apic].mpc_apicid);
for (i = 0; i < 0xf; i++)
if (!(phys_id_present_map & (1 << i)))
break;
- if (i >= 0xf)
+ if (i >= apic_broadcast_id)
panic("Max APIC ID exceeded!\n");
printk(KERN_ERR "... fixing up to %d. (tell your hw vendor)\n",
i);
diff -purN -X /home/mbligh/.diff.exclude summit-1/include/asm-i386/apicdef.h summit-2/include/asm-i386/apicdef.h
--- summit-1/include/asm-i386/apicdef.h Fri Oct 11 21:22:09 2002
+++ summit-2/include/asm-i386/apicdef.h Sun Oct 13 11:11:03 2002
@@ -32,6 +32,8 @@
#define SET_APIC_LOGICAL_ID(x) (((x)<<24))
#define APIC_ALL_CPUS 0xFF
#define APIC_DFR 0xE0
+#define APIC_DFR_CLUSTER 0x0FFFFFFFul
+#define APIC_DFR_FLAT 0xFFFFFFFFul
#define APIC_SPIV 0xF0
#define APIC_SPIV_FOCUS_DISABLED (1<<9)
#define APIC_SPIV_APIC_ENABLED (1<<8)
@@ -108,7 +110,14 @@
#define APIC_BASE (fix_to_virt(FIX_APIC_BASE))
-#define MAX_IO_APICS 8
+#ifdef CONFIG_X86_SUMMIT
+ #define MAX_IO_APICS 32 /* Summit boxes can have 4*(2+3*2) I/O APICs */
+#else
+ #define MAX_IO_APICS 8
+#endif
+
+#define APIC_BROADCAST_ID 0x0F
+#define XAPIC_BROADCAST_ID 0xFF
/*
* the local APIC register structure, memory mapped. Not terribly well
diff -purN -X /home/mbligh/.diff.exclude summit-1/include/asm-i386/smp.h summit-2/include/asm-i386/smp.h
--- summit-1/include/asm-i386/smp.h Sun Oct 13 11:10:36 2002
+++ summit-2/include/asm-i386/smp.h Sun Oct 13 11:19:40 2002
@@ -38,6 +38,12 @@
#define CLUSTERED_APIC_NUMAQ 0x01
#define CLUSTERED_APIC_XAPIC 0x02
+#define XAPIC_DEST_CPUS_MASK 0x0Fu
+#define XAPIC_DEST_CLUSTER_MASK 0xF0u
+
+#define xapic_phys_to_log_apicid(phys_apic) ( (1ul << ((phys_apic) & 0x3)) |\
+ ((phys_apic) & XAPIC_DEST_CLUSTER_MASK) )
+
/*
* The following makes all the clustered apic mode switches optimise out at
* compile time for all systems except summit
@@ -52,11 +58,12 @@
#define clustered_apic_mode (0)
#endif /* CONFIG_CLUSTERED_APIC */
+#ifndef __ASSEMBLY__
+
extern int clustered_apic;
extern int esr_disable;
#ifdef CONFIG_SMP
-#ifndef __ASSEMBLY__
/*
* Private routines/data
reply other threads:[~2002-10-13 20:45 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=39890000.1034541722@flay \
--to=mbligh@aracnet.com \
--cc=linux-kernel@vger.kernel.org \
--cc=torvalds@transmeta.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.