mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-16 08:44:21 +08:00
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/sparc-2.6
* 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/sparc-2.6: [VIDEO] sunxvr500fb: Fix pseudo_palette array size [VIDEO] sunxvr2500fb: Fix pseudo_palette array size [VIDEO] ffb: The pseudo_palette is only 16 elements long [VIDEO]: Fix section mismatch warning in promcon. [ATA]: Back out bogus (SPARC64 && !PCI) Kconfig depends. [SPARC64]: Fill in gaps in non-PCI dma_*() NOP implementation. [SPARC64]: Fix {mc,smt}_capable(). [SPARC64]: Make core and sibling groups equal on UltraSPARC-IV. [SPARC64]: Proper multi-core scheduling support. [SPARC64]: Provide mmu statistics via sysfs. [SPARC64]: Fix service channel hypervisor function names. [SPARC64]: Export basic cpu properties via sysfs. [SPARC64]: Move topology init code into new file, sysfs.c
This commit is contained in:
commit
7244d545c1
@ -396,6 +396,15 @@ config SCHED_SMT
|
||||
when dealing with UltraSPARC cpus at a cost of slightly increased
|
||||
overhead in some places. If unsure say N here.
|
||||
|
||||
config SCHED_MC
|
||||
bool "Multi-core scheduler support"
|
||||
depends on SMP
|
||||
default y
|
||||
help
|
||||
Multi-core scheduler support improves the CPU scheduler's decision
|
||||
making when dealing with multi-core CPU chips at a cost of slightly
|
||||
increased overhead in some places. If unsure say N here.
|
||||
|
||||
source "kernel/Kconfig.preempt"
|
||||
|
||||
config CMDLINE_BOOL
|
||||
|
@ -1,4 +1,4 @@
|
||||
# $Id: Makefile,v 1.70 2002/02/09 19:49:30 davem Exp $
|
||||
#
|
||||
# Makefile for the linux kernel.
|
||||
#
|
||||
|
||||
@ -8,7 +8,7 @@ EXTRA_CFLAGS := -Werror
|
||||
extra-y := head.o init_task.o vmlinux.lds
|
||||
|
||||
obj-y := process.o setup.o cpu.o idprom.o \
|
||||
traps.o auxio.o una_asm.o \
|
||||
traps.o auxio.o una_asm.o sysfs.o \
|
||||
irq.o ptrace.o time.o sys_sparc.o signal.o \
|
||||
unaligned.o central.o pci.o starfire.o semaphore.o \
|
||||
power.o sbus.o iommu_common.o sparc64_ksyms.o chmc.o \
|
||||
|
@ -2514,9 +2514,9 @@ sun4v_ncs_request:
|
||||
nop
|
||||
.size sun4v_ncs_request, .-sun4v_ncs_request
|
||||
|
||||
.globl sun4v_scv_send
|
||||
.type sun4v_scv_send,#function
|
||||
sun4v_scv_send:
|
||||
.globl sun4v_svc_send
|
||||
.type sun4v_svc_send,#function
|
||||
sun4v_svc_send:
|
||||
save %sp, -192, %sp
|
||||
mov %i0, %o0
|
||||
mov %i1, %o1
|
||||
@ -2526,11 +2526,11 @@ sun4v_scv_send:
|
||||
stx %o1, [%i3]
|
||||
ret
|
||||
restore
|
||||
.size sun4v_scv_send, .-sun4v_scv_send
|
||||
.size sun4v_svc_send, .-sun4v_svc_send
|
||||
|
||||
.globl sun4v_scv_recv
|
||||
.type sun4v_scv_recv,#function
|
||||
sun4v_scv_recv:
|
||||
.globl sun4v_svc_recv
|
||||
.type sun4v_svc_recv,#function
|
||||
sun4v_svc_recv:
|
||||
save %sp, -192, %sp
|
||||
mov %i0, %o0
|
||||
mov %i1, %o1
|
||||
@ -2540,33 +2540,55 @@ sun4v_scv_recv:
|
||||
stx %o1, [%i3]
|
||||
ret
|
||||
restore
|
||||
.size sun4v_scv_recv, .-sun4v_scv_recv
|
||||
.size sun4v_svc_recv, .-sun4v_svc_recv
|
||||
|
||||
.globl sun4v_scv_getstatus
|
||||
.type sun4v_scv_getstatus,#function
|
||||
sun4v_scv_getstatus:
|
||||
.globl sun4v_svc_getstatus
|
||||
.type sun4v_svc_getstatus,#function
|
||||
sun4v_svc_getstatus:
|
||||
mov HV_FAST_SVC_GETSTATUS, %o5
|
||||
mov %o1, %o4
|
||||
ta HV_FAST_TRAP
|
||||
stx %o1, [%o4]
|
||||
retl
|
||||
nop
|
||||
.size sun4v_scv_getstatus, .-sun4v_scv_getstatus
|
||||
.size sun4v_svc_getstatus, .-sun4v_svc_getstatus
|
||||
|
||||
.globl sun4v_scv_setstatus
|
||||
.type sun4v_scv_setstatus,#function
|
||||
sun4v_scv_setstatus:
|
||||
.globl sun4v_svc_setstatus
|
||||
.type sun4v_svc_setstatus,#function
|
||||
sun4v_svc_setstatus:
|
||||
mov HV_FAST_SVC_SETSTATUS, %o5
|
||||
ta HV_FAST_TRAP
|
||||
retl
|
||||
nop
|
||||
.size sun4v_scv_setstatus, .-sun4v_scv_setstatus
|
||||
.size sun4v_svc_setstatus, .-sun4v_svc_setstatus
|
||||
|
||||
.globl sun4v_scv_clrstatus
|
||||
.type sun4v_scv_clrstatus,#function
|
||||
sun4v_scv_clrstatus:
|
||||
.globl sun4v_svc_clrstatus
|
||||
.type sun4v_svc_clrstatus,#function
|
||||
sun4v_svc_clrstatus:
|
||||
mov HV_FAST_SVC_CLRSTATUS, %o5
|
||||
ta HV_FAST_TRAP
|
||||
retl
|
||||
nop
|
||||
.size sun4v_scv_clrstatus, .-sun4v_scv_clrstatus
|
||||
.size sun4v_svc_clrstatus, .-sun4v_svc_clrstatus
|
||||
|
||||
.globl sun4v_mmustat_conf
|
||||
.type sun4v_mmustat_conf,#function
|
||||
sun4v_mmustat_conf:
|
||||
mov %o1, %o4
|
||||
mov HV_FAST_MMUSTAT_CONF, %o5
|
||||
ta HV_FAST_TRAP
|
||||
stx %o1, [%o4]
|
||||
retl
|
||||
nop
|
||||
.size sun4v_mmustat_conf, .-sun4v_mmustat_conf
|
||||
|
||||
.globl sun4v_mmustat_info
|
||||
.type sun4v_mmustat_info,#function
|
||||
sun4v_mmustat_info:
|
||||
mov %o0, %o4
|
||||
mov HV_FAST_MMUSTAT_INFO, %o5
|
||||
ta HV_FAST_TRAP
|
||||
stx %o1, [%o4]
|
||||
retl
|
||||
nop
|
||||
.size sun4v_mmustat_info, .-sun4v_mmustat_info
|
||||
|
@ -473,6 +473,53 @@ static void __init set_core_ids(void)
|
||||
}
|
||||
}
|
||||
|
||||
static void __init mark_proc_ids(struct mdesc_node *mp, int proc_id)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < mp->num_arcs; i++) {
|
||||
struct mdesc_node *t = mp->arcs[i].arc;
|
||||
const u64 *id;
|
||||
|
||||
if (strcmp(mp->arcs[i].name, "back"))
|
||||
continue;
|
||||
|
||||
if (strcmp(t->name, "cpu"))
|
||||
continue;
|
||||
|
||||
id = md_get_property(t, "id", NULL);
|
||||
if (*id < NR_CPUS)
|
||||
cpu_data(*id).proc_id = proc_id;
|
||||
}
|
||||
}
|
||||
|
||||
static void __init __set_proc_ids(const char *exec_unit_name)
|
||||
{
|
||||
struct mdesc_node *mp;
|
||||
int idx;
|
||||
|
||||
idx = 0;
|
||||
md_for_each_node_by_name(mp, exec_unit_name) {
|
||||
const char *type;
|
||||
int len;
|
||||
|
||||
type = md_get_property(mp, "type", &len);
|
||||
if (!find_in_proplist(type, "int", len) &&
|
||||
!find_in_proplist(type, "integer", len))
|
||||
continue;
|
||||
|
||||
mark_proc_ids(mp, idx);
|
||||
|
||||
idx++;
|
||||
}
|
||||
}
|
||||
|
||||
static void __init set_proc_ids(void)
|
||||
{
|
||||
__set_proc_ids("exec_unit");
|
||||
__set_proc_ids("exec-unit");
|
||||
}
|
||||
|
||||
static void __init get_one_mondo_bits(const u64 *p, unsigned int *mask, unsigned char def)
|
||||
{
|
||||
u64 val;
|
||||
@ -574,9 +621,15 @@ static void __init mdesc_fill_in_cpu_data(void)
|
||||
#endif
|
||||
|
||||
c->core_id = 0;
|
||||
c->proc_id = -1;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
sparc64_multi_core = 1;
|
||||
#endif
|
||||
|
||||
set_core_ids();
|
||||
set_proc_ids();
|
||||
|
||||
smp_fill_in_sib_core_maps();
|
||||
}
|
||||
|
@ -1781,6 +1781,10 @@ static void __init of_fill_in_cpu_data(void)
|
||||
}
|
||||
|
||||
cpu_data(cpuid).core_id = portid + 1;
|
||||
cpu_data(cpuid).proc_id = portid;
|
||||
#ifdef CONFIG_SMP
|
||||
sparc64_multi_core = 1;
|
||||
#endif
|
||||
} else {
|
||||
cpu_data(cpuid).dcache_size =
|
||||
of_getintprop_default(dp, "dcache-size", 16 * 1024);
|
||||
@ -1799,6 +1803,7 @@ static void __init of_fill_in_cpu_data(void)
|
||||
of_getintprop_default(dp, "ecache-line-size", 64);
|
||||
|
||||
cpu_data(cpuid).core_id = 0;
|
||||
cpu_data(cpuid).proc_id = -1;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
|
@ -513,22 +513,3 @@ void sun_do_break(void)
|
||||
|
||||
int serial_console = -1;
|
||||
int stop_a_enabled = 1;
|
||||
|
||||
static int __init topology_init(void)
|
||||
{
|
||||
int i, err;
|
||||
|
||||
err = -ENOMEM;
|
||||
|
||||
for_each_possible_cpu(i) {
|
||||
struct cpu *p = kzalloc(sizeof(*p), GFP_KERNEL);
|
||||
if (p) {
|
||||
register_cpu(p, i);
|
||||
err = 0;
|
||||
}
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
subsys_initcall(topology_init);
|
||||
|
@ -44,6 +44,8 @@
|
||||
|
||||
extern void calibrate_delay(void);
|
||||
|
||||
int sparc64_multi_core __read_mostly;
|
||||
|
||||
/* Please don't make this stuff initdata!!! --DaveM */
|
||||
unsigned char boot_cpu_id;
|
||||
|
||||
@ -51,6 +53,8 @@ cpumask_t cpu_online_map __read_mostly = CPU_MASK_NONE;
|
||||
cpumask_t phys_cpu_present_map __read_mostly = CPU_MASK_NONE;
|
||||
cpumask_t cpu_sibling_map[NR_CPUS] __read_mostly =
|
||||
{ [0 ... NR_CPUS-1] = CPU_MASK_NONE };
|
||||
cpumask_t cpu_core_map[NR_CPUS] __read_mostly =
|
||||
{ [0 ... NR_CPUS-1] = CPU_MASK_NONE };
|
||||
static cpumask_t smp_commenced_mask;
|
||||
static cpumask_t cpu_callout_map;
|
||||
|
||||
@ -1217,13 +1221,28 @@ void __devinit smp_fill_in_sib_core_maps(void)
|
||||
unsigned int j;
|
||||
|
||||
if (cpu_data(i).core_id == 0) {
|
||||
cpu_set(i, cpu_sibling_map[i]);
|
||||
cpu_set(i, cpu_core_map[i]);
|
||||
continue;
|
||||
}
|
||||
|
||||
for_each_possible_cpu(j) {
|
||||
if (cpu_data(i).core_id ==
|
||||
cpu_data(j).core_id)
|
||||
cpu_set(j, cpu_core_map[i]);
|
||||
}
|
||||
}
|
||||
|
||||
for_each_possible_cpu(i) {
|
||||
unsigned int j;
|
||||
|
||||
if (cpu_data(i).proc_id == -1) {
|
||||
cpu_set(i, cpu_sibling_map[i]);
|
||||
continue;
|
||||
}
|
||||
|
||||
for_each_possible_cpu(j) {
|
||||
if (cpu_data(i).proc_id ==
|
||||
cpu_data(j).proc_id)
|
||||
cpu_set(j, cpu_sibling_map[i]);
|
||||
}
|
||||
}
|
||||
|
297
arch/sparc64/kernel/sysfs.c
Normal file
297
arch/sparc64/kernel/sysfs.c
Normal file
@ -0,0 +1,297 @@
|
||||
/* sysfs.c: Toplogy sysfs support code for sparc64.
|
||||
*
|
||||
* Copyright (C) 2007 David S. Miller <davem@davemloft.net>
|
||||
*/
|
||||
#include <linux/sysdev.h>
|
||||
#include <linux/cpu.h>
|
||||
#include <linux/smp.h>
|
||||
#include <linux/percpu.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
#include <asm/hypervisor.h>
|
||||
#include <asm/spitfire.h>
|
||||
|
||||
static DEFINE_PER_CPU(struct hv_mmu_statistics, mmu_stats) __attribute__((aligned(64)));
|
||||
|
||||
#define SHOW_MMUSTAT_ULONG(NAME) \
|
||||
static ssize_t show_##NAME(struct sys_device *dev, char *buf) \
|
||||
{ \
|
||||
struct hv_mmu_statistics *p = &per_cpu(mmu_stats, dev->id); \
|
||||
return sprintf(buf, "%lu\n", p->NAME); \
|
||||
} \
|
||||
static SYSDEV_ATTR(NAME, 0444, show_##NAME, NULL)
|
||||
|
||||
SHOW_MMUSTAT_ULONG(immu_tsb_hits_ctx0_8k_tte);
|
||||
SHOW_MMUSTAT_ULONG(immu_tsb_ticks_ctx0_8k_tte);
|
||||
SHOW_MMUSTAT_ULONG(immu_tsb_hits_ctx0_64k_tte);
|
||||
SHOW_MMUSTAT_ULONG(immu_tsb_ticks_ctx0_64k_tte);
|
||||
SHOW_MMUSTAT_ULONG(immu_tsb_hits_ctx0_4mb_tte);
|
||||
SHOW_MMUSTAT_ULONG(immu_tsb_ticks_ctx0_4mb_tte);
|
||||
SHOW_MMUSTAT_ULONG(immu_tsb_hits_ctx0_256mb_tte);
|
||||
SHOW_MMUSTAT_ULONG(immu_tsb_ticks_ctx0_256mb_tte);
|
||||
SHOW_MMUSTAT_ULONG(immu_tsb_hits_ctxnon0_8k_tte);
|
||||
SHOW_MMUSTAT_ULONG(immu_tsb_ticks_ctxnon0_8k_tte);
|
||||
SHOW_MMUSTAT_ULONG(immu_tsb_hits_ctxnon0_64k_tte);
|
||||
SHOW_MMUSTAT_ULONG(immu_tsb_ticks_ctxnon0_64k_tte);
|
||||
SHOW_MMUSTAT_ULONG(immu_tsb_hits_ctxnon0_4mb_tte);
|
||||
SHOW_MMUSTAT_ULONG(immu_tsb_ticks_ctxnon0_4mb_tte);
|
||||
SHOW_MMUSTAT_ULONG(immu_tsb_hits_ctxnon0_256mb_tte);
|
||||
SHOW_MMUSTAT_ULONG(immu_tsb_ticks_ctxnon0_256mb_tte);
|
||||
SHOW_MMUSTAT_ULONG(dmmu_tsb_hits_ctx0_8k_tte);
|
||||
SHOW_MMUSTAT_ULONG(dmmu_tsb_ticks_ctx0_8k_tte);
|
||||
SHOW_MMUSTAT_ULONG(dmmu_tsb_hits_ctx0_64k_tte);
|
||||
SHOW_MMUSTAT_ULONG(dmmu_tsb_ticks_ctx0_64k_tte);
|
||||
SHOW_MMUSTAT_ULONG(dmmu_tsb_hits_ctx0_4mb_tte);
|
||||
SHOW_MMUSTAT_ULONG(dmmu_tsb_ticks_ctx0_4mb_tte);
|
||||
SHOW_MMUSTAT_ULONG(dmmu_tsb_hits_ctx0_256mb_tte);
|
||||
SHOW_MMUSTAT_ULONG(dmmu_tsb_ticks_ctx0_256mb_tte);
|
||||
SHOW_MMUSTAT_ULONG(dmmu_tsb_hits_ctxnon0_8k_tte);
|
||||
SHOW_MMUSTAT_ULONG(dmmu_tsb_ticks_ctxnon0_8k_tte);
|
||||
SHOW_MMUSTAT_ULONG(dmmu_tsb_hits_ctxnon0_64k_tte);
|
||||
SHOW_MMUSTAT_ULONG(dmmu_tsb_ticks_ctxnon0_64k_tte);
|
||||
SHOW_MMUSTAT_ULONG(dmmu_tsb_hits_ctxnon0_4mb_tte);
|
||||
SHOW_MMUSTAT_ULONG(dmmu_tsb_ticks_ctxnon0_4mb_tte);
|
||||
SHOW_MMUSTAT_ULONG(dmmu_tsb_hits_ctxnon0_256mb_tte);
|
||||
SHOW_MMUSTAT_ULONG(dmmu_tsb_ticks_ctxnon0_256mb_tte);
|
||||
|
||||
static struct attribute *mmu_stat_attrs[] = {
|
||||
&attr_immu_tsb_hits_ctx0_8k_tte.attr,
|
||||
&attr_immu_tsb_ticks_ctx0_8k_tte.attr,
|
||||
&attr_immu_tsb_hits_ctx0_64k_tte.attr,
|
||||
&attr_immu_tsb_ticks_ctx0_64k_tte.attr,
|
||||
&attr_immu_tsb_hits_ctx0_4mb_tte.attr,
|
||||
&attr_immu_tsb_ticks_ctx0_4mb_tte.attr,
|
||||
&attr_immu_tsb_hits_ctx0_256mb_tte.attr,
|
||||
&attr_immu_tsb_ticks_ctx0_256mb_tte.attr,
|
||||
&attr_immu_tsb_hits_ctxnon0_8k_tte.attr,
|
||||
&attr_immu_tsb_ticks_ctxnon0_8k_tte.attr,
|
||||
&attr_immu_tsb_hits_ctxnon0_64k_tte.attr,
|
||||
&attr_immu_tsb_ticks_ctxnon0_64k_tte.attr,
|
||||
&attr_immu_tsb_hits_ctxnon0_4mb_tte.attr,
|
||||
&attr_immu_tsb_ticks_ctxnon0_4mb_tte.attr,
|
||||
&attr_immu_tsb_hits_ctxnon0_256mb_tte.attr,
|
||||
&attr_immu_tsb_ticks_ctxnon0_256mb_tte.attr,
|
||||
&attr_dmmu_tsb_hits_ctx0_8k_tte.attr,
|
||||
&attr_dmmu_tsb_ticks_ctx0_8k_tte.attr,
|
||||
&attr_dmmu_tsb_hits_ctx0_64k_tte.attr,
|
||||
&attr_dmmu_tsb_ticks_ctx0_64k_tte.attr,
|
||||
&attr_dmmu_tsb_hits_ctx0_4mb_tte.attr,
|
||||
&attr_dmmu_tsb_ticks_ctx0_4mb_tte.attr,
|
||||
&attr_dmmu_tsb_hits_ctx0_256mb_tte.attr,
|
||||
&attr_dmmu_tsb_ticks_ctx0_256mb_tte.attr,
|
||||
&attr_dmmu_tsb_hits_ctxnon0_8k_tte.attr,
|
||||
&attr_dmmu_tsb_ticks_ctxnon0_8k_tte.attr,
|
||||
&attr_dmmu_tsb_hits_ctxnon0_64k_tte.attr,
|
||||
&attr_dmmu_tsb_ticks_ctxnon0_64k_tte.attr,
|
||||
&attr_dmmu_tsb_hits_ctxnon0_4mb_tte.attr,
|
||||
&attr_dmmu_tsb_ticks_ctxnon0_4mb_tte.attr,
|
||||
&attr_dmmu_tsb_hits_ctxnon0_256mb_tte.attr,
|
||||
&attr_dmmu_tsb_ticks_ctxnon0_256mb_tte.attr,
|
||||
NULL,
|
||||
};
|
||||
|
||||
static struct attribute_group mmu_stat_group = {
|
||||
.attrs = mmu_stat_attrs,
|
||||
.name = "mmu_stats",
|
||||
};
|
||||
|
||||
/* XXX convert to rusty's on_one_cpu */
|
||||
static unsigned long run_on_cpu(unsigned long cpu,
|
||||
unsigned long (*func)(unsigned long),
|
||||
unsigned long arg)
|
||||
{
|
||||
cpumask_t old_affinity = current->cpus_allowed;
|
||||
unsigned long ret;
|
||||
|
||||
/* should return -EINVAL to userspace */
|
||||
if (set_cpus_allowed(current, cpumask_of_cpu(cpu)))
|
||||
return 0;
|
||||
|
||||
ret = func(arg);
|
||||
|
||||
set_cpus_allowed(current, old_affinity);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static unsigned long read_mmustat_enable(unsigned long junk)
|
||||
{
|
||||
unsigned long ra = 0;
|
||||
|
||||
sun4v_mmustat_info(&ra);
|
||||
|
||||
return ra != 0;
|
||||
}
|
||||
|
||||
static unsigned long write_mmustat_enable(unsigned long val)
|
||||
{
|
||||
unsigned long ra, orig_ra;
|
||||
|
||||
if (val)
|
||||
ra = __pa(&per_cpu(mmu_stats, smp_processor_id()));
|
||||
else
|
||||
ra = 0UL;
|
||||
|
||||
return sun4v_mmustat_conf(ra, &orig_ra);
|
||||
}
|
||||
|
||||
static ssize_t show_mmustat_enable(struct sys_device *s, char *buf)
|
||||
{
|
||||
unsigned long val = run_on_cpu(s->id, read_mmustat_enable, 0);
|
||||
return sprintf(buf, "%lx\n", val);
|
||||
}
|
||||
|
||||
static ssize_t store_mmustat_enable(struct sys_device *s, const char *buf, size_t count)
|
||||
{
|
||||
unsigned long val, err;
|
||||
int ret = sscanf(buf, "%ld", &val);
|
||||
|
||||
if (ret != 1)
|
||||
return -EINVAL;
|
||||
|
||||
err = run_on_cpu(s->id, write_mmustat_enable, val);
|
||||
if (err)
|
||||
return -EIO;
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static SYSDEV_ATTR(mmustat_enable, 0644, show_mmustat_enable, store_mmustat_enable);
|
||||
|
||||
static int mmu_stats_supported;
|
||||
|
||||
static int register_mmu_stats(struct sys_device *s)
|
||||
{
|
||||
if (!mmu_stats_supported)
|
||||
return 0;
|
||||
sysdev_create_file(s, &attr_mmustat_enable);
|
||||
return sysfs_create_group(&s->kobj, &mmu_stat_group);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
static void unregister_mmu_stats(struct sys_device *s)
|
||||
{
|
||||
if (!mmu_stats_supported)
|
||||
return;
|
||||
sysfs_remove_group(&s->kobj, &mmu_stat_group);
|
||||
sysdev_remove_file(s, &attr_mmustat_enable);
|
||||
}
|
||||
#endif
|
||||
|
||||
#define SHOW_CPUDATA_ULONG_NAME(NAME, MEMBER) \
|
||||
static ssize_t show_##NAME(struct sys_device *dev, char *buf) \
|
||||
{ \
|
||||
cpuinfo_sparc *c = &cpu_data(dev->id); \
|
||||
return sprintf(buf, "%lu\n", c->MEMBER); \
|
||||
}
|
||||
|
||||
#define SHOW_CPUDATA_UINT_NAME(NAME, MEMBER) \
|
||||
static ssize_t show_##NAME(struct sys_device *dev, char *buf) \
|
||||
{ \
|
||||
cpuinfo_sparc *c = &cpu_data(dev->id); \
|
||||
return sprintf(buf, "%u\n", c->MEMBER); \
|
||||
}
|
||||
|
||||
SHOW_CPUDATA_ULONG_NAME(clock_tick, clock_tick);
|
||||
SHOW_CPUDATA_ULONG_NAME(udelay_val, udelay_val);
|
||||
SHOW_CPUDATA_UINT_NAME(l1_dcache_size, dcache_size);
|
||||
SHOW_CPUDATA_UINT_NAME(l1_dcache_line_size, dcache_line_size);
|
||||
SHOW_CPUDATA_UINT_NAME(l1_icache_size, icache_size);
|
||||
SHOW_CPUDATA_UINT_NAME(l1_icache_line_size, icache_line_size);
|
||||
SHOW_CPUDATA_UINT_NAME(l2_cache_size, ecache_size);
|
||||
SHOW_CPUDATA_UINT_NAME(l2_cache_line_size, ecache_line_size);
|
||||
|
||||
static struct sysdev_attribute cpu_core_attrs[] = {
|
||||
_SYSDEV_ATTR(clock_tick, 0444, show_clock_tick, NULL),
|
||||
_SYSDEV_ATTR(udelay_val, 0444, show_udelay_val, NULL),
|
||||
_SYSDEV_ATTR(l1_dcache_size, 0444, show_l1_dcache_size, NULL),
|
||||
_SYSDEV_ATTR(l1_dcache_line_size, 0444, show_l1_dcache_line_size, NULL),
|
||||
_SYSDEV_ATTR(l1_icache_size, 0444, show_l1_icache_size, NULL),
|
||||
_SYSDEV_ATTR(l1_icache_line_size, 0444, show_l1_icache_line_size, NULL),
|
||||
_SYSDEV_ATTR(l2_cache_size, 0444, show_l2_cache_size, NULL),
|
||||
_SYSDEV_ATTR(l2_cache_line_size, 0444, show_l2_cache_line_size, NULL),
|
||||
};
|
||||
|
||||
static DEFINE_PER_CPU(struct cpu, cpu_devices);
|
||||
|
||||
static void register_cpu_online(unsigned int cpu)
|
||||
{
|
||||
struct cpu *c = &per_cpu(cpu_devices, cpu);
|
||||
struct sys_device *s = &c->sysdev;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(cpu_core_attrs); i++)
|
||||
sysdev_create_file(s, &cpu_core_attrs[i]);
|
||||
|
||||
register_mmu_stats(s);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
static void unregister_cpu_online(unsigned int cpu)
|
||||
{
|
||||
struct cpu *c = &per_cpu(cpu_devices, cpu);
|
||||
struct sys_device *s = &c->sysdev;
|
||||
int i;
|
||||
|
||||
unregister_mmu_stats(s);
|
||||
for (i = 0; i < ARRAY_SIZE(cpu_core_attrs); i++)
|
||||
sysdev_remove_file(s, &cpu_core_attrs[i]);
|
||||
}
|
||||
#endif
|
||||
|
||||
static int __cpuinit sysfs_cpu_notify(struct notifier_block *self,
|
||||
unsigned long action, void *hcpu)
|
||||
{
|
||||
unsigned int cpu = (unsigned int)(long)hcpu;
|
||||
|
||||
switch (action) {
|
||||
case CPU_ONLINE:
|
||||
case CPU_ONLINE_FROZEN:
|
||||
register_cpu_online(cpu);
|
||||
break;
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
case CPU_DEAD:
|
||||
case CPU_DEAD_FROZEN:
|
||||
unregister_cpu_online(cpu);
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
return NOTIFY_OK;
|
||||
}
|
||||
|
||||
static struct notifier_block __cpuinitdata sysfs_cpu_nb = {
|
||||
.notifier_call = sysfs_cpu_notify,
|
||||
};
|
||||
|
||||
static void __init check_mmu_stats(void)
|
||||
{
|
||||
unsigned long dummy1, err;
|
||||
|
||||
if (tlb_type != hypervisor)
|
||||
return;
|
||||
|
||||
err = sun4v_mmustat_info(&dummy1);
|
||||
if (!err)
|
||||
mmu_stats_supported = 1;
|
||||
}
|
||||
|
||||
static int __init topology_init(void)
|
||||
{
|
||||
int cpu;
|
||||
|
||||
check_mmu_stats();
|
||||
|
||||
register_cpu_notifier(&sysfs_cpu_nb);
|
||||
|
||||
for_each_possible_cpu(cpu) {
|
||||
struct cpu *c = &per_cpu(cpu_devices, cpu);
|
||||
|
||||
register_cpu(c, cpu);
|
||||
if (cpu_online(cpu))
|
||||
register_cpu_online(cpu);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
subsys_initcall(topology_init);
|
@ -8,7 +8,6 @@ menuconfig ATA
|
||||
depends on BLOCK
|
||||
depends on !(M32R || M68K) || BROKEN
|
||||
depends on !SUN4 || BROKEN
|
||||
depends on !(SPARC64 && !PCI)
|
||||
select SCSI
|
||||
---help---
|
||||
If you want to use a ATA hard disk, ATA tape drive, ATA CD-ROM or
|
||||
|
@ -47,7 +47,7 @@ targets := promcon_tbl.c
|
||||
quiet_cmd_conmakehash = CNMKHSH $@
|
||||
cmd_conmakehash = scripts/conmakehash $< | \
|
||||
sed -e '/\#include <[^>]*>/p' -e 's/types/init/' \
|
||||
-e 's/dfont\(_uni.*\]\)/promfont\1 __initdata/' > $@
|
||||
-e 's/dfont\(_uni.*\]\)/promfont\1 /' > $@
|
||||
|
||||
$(obj)/promcon_tbl.c: $(src)/prom.uni
|
||||
$(call cmd,conmakehash)
|
||||
|
@ -656,7 +656,7 @@ static int ffb_setcolreg(unsigned regno,
|
||||
{
|
||||
u32 value;
|
||||
|
||||
if (regno >= 256)
|
||||
if (regno >= 16)
|
||||
return 1;
|
||||
|
||||
red >>= 8;
|
||||
@ -903,7 +903,7 @@ ffb_init_fix(struct fb_info *info)
|
||||
struct all_info {
|
||||
struct fb_info info;
|
||||
struct ffb_par par;
|
||||
u32 pseudo_palette[256];
|
||||
u32 pseudo_palette[16];
|
||||
};
|
||||
|
||||
static int ffb_init_one(struct of_device *op)
|
||||
|
@ -28,7 +28,7 @@ struct s3d_info {
|
||||
unsigned int depth;
|
||||
unsigned int fb_size;
|
||||
|
||||
u32 pseudo_palette[256];
|
||||
u32 pseudo_palette[16];
|
||||
};
|
||||
|
||||
static int __devinit s3d_get_props(struct s3d_info *sp)
|
||||
@ -52,15 +52,14 @@ static int s3d_setcolreg(unsigned regno,
|
||||
{
|
||||
u32 value;
|
||||
|
||||
if (regno >= 256)
|
||||
return 1;
|
||||
if (regno < 16) {
|
||||
red >>= 8;
|
||||
green >>= 8;
|
||||
blue >>= 8;
|
||||
|
||||
red >>= 8;
|
||||
green >>= 8;
|
||||
blue >>= 8;
|
||||
|
||||
value = (blue << 24) | (green << 16) | (red << 8);
|
||||
((u32 *)info->pseudo_palette)[regno] = value;
|
||||
value = (blue << 24) | (green << 16) | (red << 8);
|
||||
((u32 *)info->pseudo_palette)[regno] = value;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -50,7 +50,7 @@ struct e3d_info {
|
||||
u32 fb8_0_off;
|
||||
u32 fb8_1_off;
|
||||
|
||||
u32 pseudo_palette[256];
|
||||
u32 pseudo_palette[16];
|
||||
};
|
||||
|
||||
static int __devinit e3d_get_props(struct e3d_info *ep)
|
||||
@ -126,7 +126,9 @@ static int e3d_setcolreg(unsigned regno,
|
||||
blue_8 = blue >> 8;
|
||||
|
||||
value = (blue_8 << 24) | (green_8 << 16) | (red_8 << 8);
|
||||
((u32 *)info->pseudo_palette)[regno] = value;
|
||||
|
||||
if (info->fix.visual == FB_VISUAL_TRUECOLOR && regno < 16)
|
||||
((u32 *)info->pseudo_palette)[regno] = value;
|
||||
|
||||
|
||||
red_10 = red >> 6;
|
||||
|
@ -31,7 +31,7 @@ typedef struct {
|
||||
unsigned int ecache_size;
|
||||
unsigned int ecache_line_size;
|
||||
int core_id;
|
||||
unsigned int __pad3;
|
||||
int proc_id;
|
||||
} cpuinfo_sparc;
|
||||
|
||||
DECLARE_PER_CPU(cpuinfo_sparc, __cpu_data);
|
||||
|
@ -162,6 +162,22 @@ dma_mapping_error(dma_addr_t dma_addr)
|
||||
#else
|
||||
|
||||
struct device;
|
||||
struct page;
|
||||
struct scatterlist;
|
||||
|
||||
static inline int
|
||||
dma_supported(struct device *dev, u64 mask)
|
||||
{
|
||||
BUG();
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int
|
||||
dma_set_mask(struct device *dev, u64 dma_mask)
|
||||
{
|
||||
BUG();
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void *dma_alloc_coherent(struct device *dev, size_t size,
|
||||
dma_addr_t *dma_handle, gfp_t flag)
|
||||
@ -176,6 +192,52 @@ static inline void dma_free_coherent(struct device *dev, size_t size,
|
||||
BUG();
|
||||
}
|
||||
|
||||
static inline dma_addr_t
|
||||
dma_map_single(struct device *dev, void *cpu_addr, size_t size,
|
||||
enum dma_data_direction direction)
|
||||
{
|
||||
BUG();
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void
|
||||
dma_unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size,
|
||||
enum dma_data_direction direction)
|
||||
{
|
||||
BUG();
|
||||
}
|
||||
|
||||
static inline dma_addr_t
|
||||
dma_map_page(struct device *dev, struct page *page,
|
||||
unsigned long offset, size_t size,
|
||||
enum dma_data_direction direction)
|
||||
{
|
||||
BUG();
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void
|
||||
dma_unmap_page(struct device *dev, dma_addr_t dma_address, size_t size,
|
||||
enum dma_data_direction direction)
|
||||
{
|
||||
BUG();
|
||||
}
|
||||
|
||||
static inline int
|
||||
dma_map_sg(struct device *dev, struct scatterlist *sg, int nents,
|
||||
enum dma_data_direction direction)
|
||||
{
|
||||
BUG();
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void
|
||||
dma_unmap_sg(struct device *dev, struct scatterlist *sg, int nhwentries,
|
||||
enum dma_data_direction direction)
|
||||
{
|
||||
BUG();
|
||||
}
|
||||
|
||||
static inline void
|
||||
dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle, size_t size,
|
||||
enum dma_data_direction direction)
|
||||
@ -190,6 +252,27 @@ dma_sync_single_for_device(struct device *dev, dma_addr_t dma_handle, size_t siz
|
||||
BUG();
|
||||
}
|
||||
|
||||
static inline void
|
||||
dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, int nelems,
|
||||
enum dma_data_direction direction)
|
||||
{
|
||||
BUG();
|
||||
}
|
||||
|
||||
static inline void
|
||||
dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, int nelems,
|
||||
enum dma_data_direction direction)
|
||||
{
|
||||
BUG();
|
||||
}
|
||||
|
||||
static inline int
|
||||
dma_mapping_error(dma_addr_t dma_addr)
|
||||
{
|
||||
BUG();
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* PCI */
|
||||
|
||||
|
||||
|
@ -2798,6 +2798,11 @@ struct hv_mmu_statistics {
|
||||
*/
|
||||
#define HV_FAST_MMUSTAT_INFO 0x103
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
extern unsigned long sun4v_mmustat_conf(unsigned long ra, unsigned long *orig_ra);
|
||||
extern unsigned long sun4v_mmustat_info(unsigned long *ra);
|
||||
#endif
|
||||
|
||||
/* NCS crypto services */
|
||||
|
||||
/* ncs_request() sub-function numbers */
|
||||
|
@ -33,6 +33,8 @@ extern cpumask_t phys_cpu_present_map;
|
||||
#define cpu_possible_map phys_cpu_present_map
|
||||
|
||||
extern cpumask_t cpu_sibling_map[NR_CPUS];
|
||||
extern cpumask_t cpu_core_map[NR_CPUS];
|
||||
extern int sparc64_multi_core;
|
||||
|
||||
/*
|
||||
* General functions that each host system must provide.
|
||||
|
@ -1,12 +1,17 @@
|
||||
#ifndef _ASM_SPARC64_TOPOLOGY_H
|
||||
#define _ASM_SPARC64_TOPOLOGY_H
|
||||
|
||||
#include <asm/spitfire.h>
|
||||
#define smt_capable() (tlb_type == hypervisor)
|
||||
#ifdef CONFIG_SMP
|
||||
#define topology_physical_package_id(cpu) (cpu_data(cpu).proc_id)
|
||||
#define topology_core_id(cpu) (cpu_data(cpu).core_id)
|
||||
#define topology_core_siblings(cpu) (cpu_core_map[cpu])
|
||||
#define topology_thread_siblings(cpu) (cpu_sibling_map[cpu])
|
||||
#define mc_capable() (sparc64_multi_core)
|
||||
#define smt_capable() (sparc64_multi_core)
|
||||
#endif /* CONFIG_SMP */
|
||||
|
||||
#include <asm-generic/topology.h>
|
||||
|
||||
#define topology_core_id(cpu) (cpu_data(cpu).core_id)
|
||||
#define topology_thread_siblings(cpu) (cpu_sibling_map[cpu])
|
||||
#define cpu_coregroup_map(cpu) (cpu_core_map[cpu])
|
||||
|
||||
#endif /* _ASM_SPARC64_TOPOLOGY_H */
|
||||
|
Loading…
Reference in New Issue
Block a user