include/asm-i386/smp.h
12249 #ifndef __ASM_SMP_H
12250 #define __ASM_SMP_H
12251
12252 /* We need the APIC definitions automatically as part of
12253 * 'smp.h' */
12254 #include <linux/config.h>
12255 #ifdef CONFIG_X86_LOCAL_APIC
12256 #ifndef ASSEMBLY
12257 #include <asm/fixmap.h>
12258 #include <asm/i82489.h>
12259 #include <asm/bitops.h>
12260 #endif
12261 #endif
12262
12263 #ifdef __SMP__
12264 #ifndef ASSEMBLY
12265
12266 #include <linux/tasks.h>
12267 #include <linux/ptrace.h>
12268
12269 /* Support definitions for SMP machines following
12270 * the intel multiprocessing specification */
12271
12272 /* This tag identifies where the SMP configuration
12273 * information is. */
12274
12275 #define SMP_MAGIC_IDENT \
12276 (('_'<<24)|('P'<<16)|('M'<<8)|'_')
12277
12278 struct intel_mp_floating
12279 {
12280 char mpf_signature[4]; /* "_MP_" */
12281 unsigned long mpf_physptr; /* Config table address */
12282 unsigned char mpf_length; /* Our len (paragraphs) */
12283 unsigned char mpf_specification;/* Spec version */
12284 unsigned char mpf_checksum; /* Checksum (makes sum 0)*/
12285 unsigned char mpf_feature1; /* Std or configuration? */
12286 unsigned char mpf_feature2; /* Bit7 set for IMCR|PIC */
12287 unsigned char mpf_feature3; /* Unused (0) */
12288 unsigned char mpf_feature4; /* Unused (0) */
12289 unsigned char mpf_feature5; /* Unused (0) */
12290 };
12291
12292 struct mp_config_table
12293 {
12294 char mpc_signature[4];
12295 #define MPC_SIGNATURE "PCMP"
12296 unsigned short mpc_length; /* Size of table */
12297 char mpc_spec; /* 0x01 */
12298 char mpc_checksum;
12299 char mpc_oem[8];
12300 char mpc_productid[12];
12301 unsigned long mpc_oemptr; /* 0 if not present */
12302 unsigned short mpc_oemsize; /* 0 if not present */
12303 unsigned short mpc_oemcount;
12304 unsigned long mpc_lapic; /* APIC address */
12305 unsigned long reserved;
12306 };
12307
12308 /* Followed by entries */
12309
12310 #define MP_PROCESSOR 0
12311 #define MP_BUS 1
12312 #define MP_IOAPIC 2
12313 #define MP_INTSRC 3
12314 #define MP_LINTSRC 4
12315
12316 struct mpc_config_processor
12317 {
12318 unsigned char mpc_type;
12319 unsigned char mpc_apicid; /* Local APIC number */
12320 unsigned char mpc_apicver; /* Its versions */
12321 unsigned char mpc_cpuflag;
12322 #define CPU_ENABLED 1 /* Processor is available */
12323 #define CPU_BOOTPROCESSOR 2 /* Processor is the BP */
12324 unsigned long mpc_cpufeature;
12325 #define CPU_STEPPING_MASK 0x0F
12326 #define CPU_MODEL_MASK 0xF0
12327 #define CPU_FAMILY_MASK 0xF00
12328 unsigned long mpc_featureflag; /* CPUID feature value*/
12329 unsigned long mpc_reserved[2];
12330 };
12331
12332 struct mpc_config_bus
12333 {
12334 unsigned char mpc_type;
12335 unsigned char mpc_busid;
12336 unsigned char mpc_bustype[6] __attribute((packed));
12337 };
12338
12339 #define BUSTYPE_EISA "EISA"
12340 #define BUSTYPE_ISA "ISA"
12341 #define BUSTYPE_INTERN "INTERN" /* Internal BUS */
12342 #define BUSTYPE_MCA "MCA"
12343 #define BUSTYPE_VL "VL" /* Local bus */
12344 #define BUSTYPE_PCI "PCI"
12345 #define BUSTYPE_PCMCIA "PCMCIA"
12346
12347 /* We don't understand the others */
12348
12349 struct mpc_config_ioapic
12350 {
12351 unsigned char mpc_type;
12352 unsigned char mpc_apicid;
12353 unsigned char mpc_apicver;
12354 unsigned char mpc_flags;
12355 #define MPC_APIC_USABLE 0x01
12356 unsigned long mpc_apicaddr;
12357 };
12358
12359 struct mpc_config_intsrc
12360 {
12361 unsigned char mpc_type;
12362 unsigned char mpc_irqtype;
12363 unsigned short mpc_irqflag;
12364 unsigned char mpc_srcbus;
12365 unsigned char mpc_srcbusirq;
12366 unsigned char mpc_dstapic;
12367 unsigned char mpc_dstirq;
12368 };
12369
12370 #define MP_INT_VECTORED 0
12371 #define MP_INT_NMI 1
12372 #define MP_INT_SMI 2
12373 #define MP_INT_EXTINT 3
12374
12375 #define MP_IRQDIR_DEFAULT 0
12376 #define MP_IRQDIR_HIGH 1
12377 #define MP_IRQDIR_LOW 3
12378
12379
12380 struct mpc_config_intlocal
12381 {
12382 unsigned char mpc_type;
12383 unsigned char mpc_irqtype;
12384 unsigned short mpc_irqflag;
12385 unsigned char mpc_srcbusid;
12386 unsigned char mpc_srcbusirq;
12387 unsigned char mpc_destapic;
12388 #define MP_APIC_ALL 0xFF
12389 unsigned char mpc_destapiclint;
12390 };
12391
12392
12393 /* Default configurations
12394 *
12395 * 1 2 CPU ISA 82489DX
12396 * 2 2 CPU EISA 82489DX no IRQ 8 or timer chaining
12397 * 3 2 CPU EISA 82489DX
12398 * 4 2 CPU MCA 82489DX
12399 * 5 2 CPU ISA+PCI
12400 * 6 2 CPU EISA+PCI
12401 * 7 2 CPU MCA+PCI */
12402
12403 /* Private routines/data */
12404
12405 extern int smp_found_config;
12406 extern void init_smp_config(void);
12407 extern unsigned long smp_alloc_memory(
12408 unsigned long mem_base);
12409 extern unsigned char boot_cpu_id;
12410 extern unsigned long cpu_present_map;
12411 extern unsigned long cpu_online_map;
12412 extern volatile int cpu_number_map[NR_CPUS];
12413 extern volatile unsigned long smp_invalidate_needed;
12414 extern void smp_flush_tlb(void);
12415
12416 extern volatile unsigned long cpu_callin_map[NR_CPUS];
12417 extern void smp_message_irq(int cpl, void *dev_id,
12418 struct pt_regs *regs);
12419 extern void smp_send_reschedule(int cpu);
12420 extern unsigned long ipi_count;
12421 extern void smp_invalidate_rcv(void); /* Process NMI */
12422 extern void smp_local_timer_interrupt(
12423 struct pt_regs * regs);
12424 extern void (*mtrr_hook) (void);
12425 extern void setup_APIC_clock (void);
12426 extern volatile int __cpu_logical_map[NR_CPUS];
12427 extern inline int cpu_logical_map(int cpu)
12428 {
12429 return __cpu_logical_map[cpu];
12430 }
12431
12432
12433 /* General fns that each host system must provide. */
12434
12435 extern void smp_callin(void);
12436 extern void smp_boot_cpus(void);
12437 /* Store per CPU info (like the initial udelay numbers */
12438 extern void smp_store_cpu_info(int id);
12439
12440 /* This function is needed by all SMP systems. It must
12441 * _always_ be valid from the initial startup. We map
12442 * APIC_BASE very early in page_setup(), so this is
12443 * correct in the x86 case. */
12444
12445 #define smp_processor_id() (current->processor)
12446
12447 extern __inline int hard_smp_processor_id(void)
12448 {
12449 /* we don't want to mark this access volatile - bad
12450 * code generation */
12451 return GET_APIC_ID(*(unsigned long *)
12452 (APIC_BASE+APIC_ID));
12453 }
12454
12455 #endif /* !ASSEMBLY */
12456
12457 #define NO_PROC_ID 0xFF /* No processor magic marker */
12458
12459 /* This magic constant controls our willingness to
12460 * transfer a process across CPUs. Such a transfer incurs
12461 * misses on the L1 cache, and on a P6 or P5 with
12462 * multiple L2 caches L2 hits. My gut feeling is this
12463 * will vary by board in value. For a board with separate
12464 * L2 cache it probably depends also on the RSS, and for
12465 * a board with shared L2 cache it ought to decay fast as
12466 * other processes are run. */
12467
12468 #define PROC_CHANGE_PENALTY 15 /* Schedule penalty */
12469
12470 #endif
12471 #endif
Сайт управляется системой
uCoz