netlib.narod.ru< Назад | Оглавление | Далее >

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

netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz