aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm26
Commit message (Expand)AuthorAge
* [PATCH] getting rid of all casts of k[cmz]alloc() callsRobert P. J. Day2006-12-13
* [PATCH] LOG2: Implement a general integer log2 facility in the kernelDavid Howells2006-12-08
* [PATCH] arm26: replace kmalloc+memset with kzallocYan Burman2006-12-07
* [PATCH] slab: remove kmem_cache_tChristoph Lameter2006-12-07
* [PATCH] mm: arch do_page_fault() vs in_atomic()Peter Zijlstra2006-12-07
* [PATCH] remove bogus arch-specific syscall exportsAl Viro2006-10-11
* Remove all inclusions of <linux/config.h>Dave Jones2006-10-04
* [PATCH] rename the provided execve functions to kernel_execveArnd Bergmann2006-10-02
* [PATCH] namespaces: utsname: use init_utsname when appropriateSerge E. Hallyn2006-10-02
* [PATCH] nsproxy: move init_nsproxy into kernel/nsproxy.cSerge E. Hallyn2006-10-02
* [PATCH] namespaces: add nsproxySerge E. Hallyn2006-10-02
* [PATCH] kill wall_jiffiesAtsushi Nemoto2006-10-01
* [PATCH] simplify update_times (avoid jiffies/jiffies_64 aliasing problem)Atsushi Nemoto2006-09-29
* [PATCH] pidspace: is_init()Sukadev Bhattiprolu2006-09-29
* [PATCH] make PROT_WRITE imply PROT_READJason Baron2006-09-29
* [PATCH] tty: Remove include of screen_info.h from tty.hJon Smirl2006-07-10
* [PATCH] irq-flags: ARM26: Use the new IRQF_ constantsThomas Gleixner2006-07-02
* Remove obsolete #include <linux/config.h>Jörn Engel2006-06-30
* arch/arm26/Kconfig typosMatt LaPlante2006-06-30
* [PATCH] No arch-specific strpbrk implementationsKyle McMartin2006-04-11
* [PATCH] unexport get_wchanAdrian Bunk2006-03-31
* [PATCH] unify PFN_* macrosDave Hansen2006-03-27
* [PATCH] bitops: arm26: use generic bitopsAkinobu Mita2006-03-26
* [PATCH] sem2mutex: misc static one-file mutexesIngo Molnar2006-03-26
* Merge master.kernel.org:/pub/scm/linux/kernel/git/sam/kbuildLinus Torvalds2006-03-25
|\
| * kbuild: change kbuild to not rely on incorrect GNU make behaviorPaul Smith2006-03-05
* | [PATCH] remove set_page_count() outside mm/Nick Piggin2006-03-22
|/
* [PATCH] arm26: select BLK_DEV_FD only on A5KAlexey Dobriyan2006-02-01
* [PATCH] arm26: fixup asm statement in kernel/fiq.cAlexey Dobriyan2006-02-01
* [PATCH] arm26: fixup get_signal_to_deliver callAlexey Dobriyan2006-02-01
* [PATCH] arm26: select system type via "choice"Alexey Dobriyan2006-02-01
* [PATCH] arm26: s/task_threas_info/task_thread_info/Alexey Dobriyan2006-01-17
* [PATCH] arm26: kernel/irq.c: fix compilationAlexey Dobriyan2006-01-17
* [PATCH] arm26: task_stack_page()Al Viro2006-01-12
* [PATCH] arm26: task_pt_regs()Al Viro2006-01-12
* [PATCH] arm26: task_thread_info()Al Viro2006-01-12
* [PATCH] dump_thread() cleanupakpm@osdl.org2006-01-10
* [PATCH] tiny: Make *[ug]id16 support optionalMatt Mackall2006-01-08
* [PATCH] remove gcc-2 checksAndrew Morton2006-01-08
* arch/arm26/nwfpe/fpmodule.c: remove kernel 2.0 #ifdefAdrian Bunk2006-01-03
* [PATCH] sched: disable preempt in idle tasksNick Piggin2005-11-09
* [PATCH] consolidate sys_ptrace()Christoph Hellwig2005-11-07
* [PATCH] jiffies_64 cleanupThomas Gleixner2005-10-30
* [PATCH] unify sys_ptrace prototypeChristoph Hellwig2005-10-30
* [PATCH] mm: arches skip ptlockHugh Dickins2005-10-30
* [PATCH] mm: init_mm without ptlockHugh Dickins2005-10-30
* [PATCH] Remove arch/arm26/boot/compressed/hw-bse.cDomen Puncer2005-09-17
* kbuild: arm26,sparc use generic asm-offset supportSam Ravnborg2005-09-09
* [PATCH] Kconfig fix (BLK_DEV_FD dependencies)viro@ZenIV.linux.org.uk2005-09-07
* [PATCH] NTP: ntp-helper functionsjohn stultz2005-09-07
f (ACPI_FAILURE(acpi_get_table(ACPI_SIG_MADT, 0, (struct acpi_table_header **)&madt))) madt = NULL; read_madt++; } if (!madt) return apic_id; entry = (unsigned long)madt; madt_end = entry + madt->header.length; /* Parse all entries looking for a match. */ entry += sizeof(struct acpi_table_madt); while (entry + sizeof(struct acpi_subtable_header) < madt_end) { struct acpi_subtable_header *header = (struct acpi_subtable_header *)entry; if (header->type == ACPI_MADT_TYPE_LOCAL_APIC) { if (map_lapic_id(header, acpi_id, &apic_id)) break; } else if (header->type == ACPI_MADT_TYPE_LOCAL_X2APIC) { if (map_x2apic_id(header, type, acpi_id, &apic_id)) break; } else if (header->type == ACPI_MADT_TYPE_LOCAL_SAPIC) { if (map_lsapic_id(header, type, acpi_id, &apic_id)) break; } entry += header->length; } return apic_id; } static int map_mat_entry(acpi_handle handle, int type, u32 acpi_id) { struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; union acpi_object *obj; struct acpi_subtable_header *header; int apic_id = -1; if (ACPI_FAILURE(acpi_evaluate_object(handle, "_MAT", NULL, &buffer))) goto exit; if (!buffer.length || !buffer.pointer) goto exit; obj = buffer.pointer; if (obj->type != ACPI_TYPE_BUFFER || obj->buffer.length < sizeof(struct acpi_subtable_header)) { goto exit; } header = (struct acpi_subtable_header *)obj->buffer.pointer; if (header->type == ACPI_MADT_TYPE_LOCAL_APIC) { map_lapic_id(header, acpi_id, &apic_id); } else if (header->type == ACPI_MADT_TYPE_LOCAL_SAPIC) { map_lsapic_id(header, type, acpi_id, &apic_id); } exit: if (buffer.pointer) kfree(buffer.pointer); return apic_id; } int acpi_get_cpuid(acpi_handle handle, int type, u32 acpi_id) { #ifdef CONFIG_SMP int i; #endif int apic_id = -1; apic_id = map_mat_entry(handle, type, acpi_id); if (apic_id == -1) apic_id = map_madt_entry(type, acpi_id); if (apic_id == -1) { /* * On UP processor, there is no _MAT or MADT table. * So above apic_id is always set to -1. * * BIOS may define multiple CPU handles even for UP processor. * For example, * * Scope (_PR) * { * Processor (CPU0, 0x00, 0x00000410, 0x06) {} * Processor (CPU1, 0x01, 0x00000410, 0x06) {} * Processor (CPU2, 0x02, 0x00000410, 0x06) {} * Processor (CPU3, 0x03, 0x00000410, 0x06) {} * } * * Ignores apic_id and always return 0 for CPU0's handle. * Return -1 for other CPU's handle. */ if (acpi_id == 0) return acpi_id; else return apic_id; } #ifdef CONFIG_SMP for_each_possible_cpu(i) { if (cpu_physical_id(i) == apic_id) return i; } #else /* In UP kernel, only processor 0 is valid */ if (apic_id == 0) return apic_id; #endif return -1; } EXPORT_SYMBOL_GPL(acpi_get_cpuid); static bool __init processor_physically_present(acpi_handle handle) { int cpuid, type; u32 acpi_id; acpi_status status; acpi_object_type acpi_type; unsigned long long tmp; union acpi_object object = { 0 }; struct acpi_buffer buffer = { sizeof(union acpi_object), &object }; status = acpi_get_type(handle, &acpi_type); if (ACPI_FAILURE(status)) return false; switch (acpi_type) { case ACPI_TYPE_PROCESSOR: status = acpi_evaluate_object(handle, NULL, NULL, &buffer); if (ACPI_FAILURE(status)) return false; acpi_id = object.processor.proc_id; break; case ACPI_TYPE_DEVICE: status = acpi_evaluate_integer(handle, "_UID", NULL, &tmp); if (ACPI_FAILURE(status)) return false; acpi_id = tmp; break; default: return false; } type = (acpi_type == ACPI_TYPE_DEVICE) ? 1 : 0; cpuid = acpi_get_cpuid(handle, type, acpi_id); if (cpuid == -1) return false; return true; } static void __cpuinit acpi_set_pdc_bits(u32 *buf) { buf[0] = ACPI_PDC_REVISION_ID; buf[1] = 1; /* Enable coordination with firmware's _TSD info */ buf[2] = ACPI_PDC_SMP_T_SWCOORD; /* Twiddle arch-specific bits needed for _PDC */ arch_acpi_set_pdc_bits(buf); } static struct acpi_object_list *__cpuinit acpi_processor_alloc_pdc(void) { struct acpi_object_list *obj_list; union acpi_object *obj; u32 *buf; /* allocate and initialize pdc. It will be used later. */ obj_list = kmalloc(sizeof(struct acpi_object_list), GFP_KERNEL); if (!obj_list) { printk(KERN_ERR "Memory allocation error\n"); return NULL; } obj = kmalloc(sizeof(union acpi_object), GFP_KERNEL); if (!obj) { printk(KERN_ERR "Memory allocation error\n"); kfree(obj_list); return NULL; } buf = kmalloc(12, GFP_KERNEL); if (!buf) { printk(KERN_ERR "Memory allocation error\n"); kfree(obj); kfree(obj_list); return NULL; } acpi_set_pdc_bits(buf); obj->type = ACPI_TYPE_BUFFER; obj->buffer.length = 12; obj->buffer.pointer = (u8 *) buf; obj_list->count = 1; obj_list->pointer = obj; return obj_list; } /* * _PDC is required for a BIOS-OS handshake for most of the newer * ACPI processor features. */ static int __cpuinit acpi_processor_eval_pdc(acpi_handle handle, struct acpi_object_list *pdc_in) { acpi_status status = AE_OK; if (boot_option_idle_override == IDLE_NOMWAIT) { /* * If mwait is disabled for CPU C-states, the C2C3_FFH access * mode will be disabled in the parameter of _PDC object. * Of course C1_FFH access mode will also be disabled. */ union acpi_object *obj; u32 *buffer = NULL; obj = pdc_in->pointer; buffer = (u32 *)(obj->buffer.pointer); buffer[2] &= ~(ACPI_PDC_C_C2C3_FFH | ACPI_PDC_C_C1_FFH); } status = acpi_evaluate_object(handle, "_PDC", pdc_in, NULL); if (ACPI_FAILURE(status)) ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Could not evaluate _PDC, using legacy perf. control.\n")); return status; } void __cpuinit acpi_processor_set_pdc(acpi_handle handle) { struct acpi_object_list *obj_list; if (arch_has_acpi_pdc() == false) return; obj_list = acpi_processor_alloc_pdc(); if (!obj_list) return; acpi_processor_eval_pdc(handle, obj_list); kfree(obj_list->pointer->buffer.pointer); kfree(obj_list->pointer); kfree(obj_list); } static acpi_status __init early_init_pdc(acpi_handle handle, u32 lvl, void *context, void **rv) { if (processor_physically_present(handle) == false) return AE_OK; acpi_processor_set_pdc(handle); return AE_OK; } void __init acpi_early_processor_set_pdc(void) { /* * Check whether the system is DMI table. If yes, OSPM * should not use mwait for CPU-states. */ dmi_check_system(processor_idle_dmi_table); acpi_walk_namespace(ACPI_TYPE_PROCESSOR, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, early_init_pdc, NULL, NULL, NULL); acpi_get_devices("ACPI0007", early_init_pdc, NULL, NULL); }