Commit 7244d545 authored by Linus Torvalds's avatar Linus Torvalds

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
parents 143a2759 e7e8cc5a
...@@ -396,6 +396,15 @@ config SCHED_SMT ...@@ -396,6 +396,15 @@ config SCHED_SMT
when dealing with UltraSPARC cpus at a cost of slightly increased when dealing with UltraSPARC cpus at a cost of slightly increased
overhead in some places. If unsure say N here. 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" source "kernel/Kconfig.preempt"
config CMDLINE_BOOL config CMDLINE_BOOL
......
# $Id: Makefile,v 1.70 2002/02/09 19:49:30 davem Exp $ #
# Makefile for the linux kernel. # Makefile for the linux kernel.
# #
...@@ -8,7 +8,7 @@ EXTRA_CFLAGS := -Werror ...@@ -8,7 +8,7 @@ EXTRA_CFLAGS := -Werror
extra-y := head.o init_task.o vmlinux.lds extra-y := head.o init_task.o vmlinux.lds
obj-y := process.o setup.o cpu.o idprom.o \ 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 \ irq.o ptrace.o time.o sys_sparc.o signal.o \
unaligned.o central.o pci.o starfire.o semaphore.o \ unaligned.o central.o pci.o starfire.o semaphore.o \
power.o sbus.o iommu_common.o sparc64_ksyms.o chmc.o \ power.o sbus.o iommu_common.o sparc64_ksyms.o chmc.o \
......
...@@ -2514,9 +2514,9 @@ sun4v_ncs_request: ...@@ -2514,9 +2514,9 @@ sun4v_ncs_request:
nop nop
.size sun4v_ncs_request, .-sun4v_ncs_request .size sun4v_ncs_request, .-sun4v_ncs_request
.globl sun4v_scv_send .globl sun4v_svc_send
.type sun4v_scv_send,#function .type sun4v_svc_send,#function
sun4v_scv_send: sun4v_svc_send:
save %sp, -192, %sp save %sp, -192, %sp
mov %i0, %o0 mov %i0, %o0
mov %i1, %o1 mov %i1, %o1
...@@ -2526,11 +2526,11 @@ sun4v_scv_send: ...@@ -2526,11 +2526,11 @@ sun4v_scv_send:
stx %o1, [%i3] stx %o1, [%i3]
ret ret
restore restore
.size sun4v_scv_send, .-sun4v_scv_send .size sun4v_svc_send, .-sun4v_svc_send
.globl sun4v_scv_recv .globl sun4v_svc_recv
.type sun4v_scv_recv,#function .type sun4v_svc_recv,#function
sun4v_scv_recv: sun4v_svc_recv:
save %sp, -192, %sp save %sp, -192, %sp
mov %i0, %o0 mov %i0, %o0
mov %i1, %o1 mov %i1, %o1
...@@ -2540,33 +2540,55 @@ sun4v_scv_recv: ...@@ -2540,33 +2540,55 @@ sun4v_scv_recv:
stx %o1, [%i3] stx %o1, [%i3]
ret ret
restore restore
.size sun4v_scv_recv, .-sun4v_scv_recv .size sun4v_svc_recv, .-sun4v_svc_recv
.globl sun4v_scv_getstatus .globl sun4v_svc_getstatus
.type sun4v_scv_getstatus,#function .type sun4v_svc_getstatus,#function
sun4v_scv_getstatus: sun4v_svc_getstatus:
mov HV_FAST_SVC_GETSTATUS, %o5 mov HV_FAST_SVC_GETSTATUS, %o5
mov %o1, %o4 mov %o1, %o4
ta HV_FAST_TRAP ta HV_FAST_TRAP
stx %o1, [%o4] stx %o1, [%o4]
retl retl
nop nop
.size sun4v_scv_getstatus, .-sun4v_scv_getstatus .size sun4v_svc_getstatus, .-sun4v_svc_getstatus
.globl sun4v_scv_setstatus .globl sun4v_svc_setstatus
.type sun4v_scv_setstatus,#function .type sun4v_svc_setstatus,#function
sun4v_scv_setstatus: sun4v_svc_setstatus:
mov HV_FAST_SVC_SETSTATUS, %o5 mov HV_FAST_SVC_SETSTATUS, %o5
ta HV_FAST_TRAP ta HV_FAST_TRAP
retl retl
nop nop
.size sun4v_scv_setstatus, .-sun4v_scv_setstatus .size sun4v_svc_setstatus, .-sun4v_svc_setstatus
.globl sun4v_scv_clrstatus .globl sun4v_svc_clrstatus
.type sun4v_scv_clrstatus,#function .type sun4v_svc_clrstatus,#function
sun4v_scv_clrstatus: sun4v_svc_clrstatus:
mov HV_FAST_SVC_CLRSTATUS, %o5 mov HV_FAST_SVC_CLRSTATUS, %o5
ta HV_FAST_TRAP ta HV_FAST_TRAP
retl retl
nop 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) ...@@ -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) static void __init get_one_mondo_bits(const u64 *p, unsigned int *mask, unsigned char def)
{ {
u64 val; u64 val;
...@@ -574,9 +621,15 @@ static void __init mdesc_fill_in_cpu_data(void) ...@@ -574,9 +621,15 @@ static void __init mdesc_fill_in_cpu_data(void)
#endif #endif
c->core_id = 0; c->core_id = 0;
c->proc_id = -1;
} }
#ifdef CONFIG_SMP
sparc64_multi_core = 1;
#endif
set_core_ids(); set_core_ids();
set_proc_ids();
smp_fill_in_sib_core_maps(); smp_fill_in_sib_core_maps();
} }
......
...@@ -1781,6 +1781,10 @@ static void __init of_fill_in_cpu_data(void) ...@@ -1781,6 +1781,10 @@ static void __init of_fill_in_cpu_data(void)
} }
cpu_data(cpuid).core_id = portid + 1; cpu_data(cpuid).core_id = portid + 1;
cpu_data(cpuid).proc_id = portid;
#ifdef CONFIG_SMP
sparc64_multi_core = 1;
#endif
} else { } else {
cpu_data(cpuid).dcache_size = cpu_data(cpuid).dcache_size =
of_getintprop_default(dp, "dcache-size", 16 * 1024); of_getintprop_default(dp, "dcache-size", 16 * 1024);
...@@ -1799,6 +1803,7 @@ static void __init of_fill_in_cpu_data(void) ...@@ -1799,6 +1803,7 @@ static void __init of_fill_in_cpu_data(void)
of_getintprop_default(dp, "ecache-line-size", 64); of_getintprop_default(dp, "ecache-line-size", 64);
cpu_data(cpuid).core_id = 0; cpu_data(cpuid).core_id = 0;
cpu_data(cpuid).proc_id = -1;
} }
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
......
...@@ -513,22 +513,3 @@ void sun_do_break(void) ...@@ -513,22 +513,3 @@ void sun_do_break(void)
int serial_console = -1; int serial_console = -1;
int stop_a_enabled = 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 @@ ...@@ -44,6 +44,8 @@
extern void calibrate_delay(void); extern void calibrate_delay(void);
int sparc64_multi_core __read_mostly;
/* Please don't make this stuff initdata!!! --DaveM */ /* Please don't make this stuff initdata!!! --DaveM */
unsigned char boot_cpu_id; unsigned char boot_cpu_id;
...@@ -51,6 +53,8 @@ cpumask_t cpu_online_map __read_mostly = CPU_MASK_NONE; ...@@ -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 phys_cpu_present_map __read_mostly = CPU_MASK_NONE;
cpumask_t cpu_sibling_map[NR_CPUS] __read_mostly = cpumask_t cpu_sibling_map[NR_CPUS] __read_mostly =
{ [0 ... NR_CPUS-1] = CPU_MASK_NONE }; { [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 smp_commenced_mask;
static cpumask_t cpu_callout_map; static cpumask_t cpu_callout_map;
...@@ -1217,13 +1221,28 @@ void __devinit smp_fill_in_sib_core_maps(void) ...@@ -1217,13 +1221,28 @@ void __devinit smp_fill_in_sib_core_maps(void)
unsigned int j; unsigned int j;
if (cpu_data(i).core_id == 0) { if (cpu_data(i).core_id == 0) {
cpu_set(i, cpu_sibling_map[i]); cpu_set(i, cpu_core_map[i]);
continue; continue;
} }
for_each_possible_cpu(j) { for_each_possible_cpu(j) {
if (cpu_data(i).core_id == if (cpu_data(i).core_id ==
cpu_data(j).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]); cpu_set(j, cpu_sibling_map[i]);
} }
} }
......
/* 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 ...@@ -8,7 +8,6 @@ menuconfig ATA
depends on BLOCK depends on BLOCK
depends on !(M32R || M68K) || BROKEN depends on !(M32R || M68K) || BROKEN
depends on !SUN4 || BROKEN depends on !SUN4 || BROKEN
depends on !(SPARC64 && !PCI)
select SCSI select SCSI
---help--- ---help---
If you want to use a ATA hard disk, ATA tape drive, ATA CD-ROM or If you want to use a ATA hard disk, ATA tape drive, ATA CD-ROM or
......
...@@ -47,7 +47,7 @@ targets := promcon_tbl.c ...@@ -47,7 +47,7 @@ targets := promcon_tbl.c
quiet_cmd_conmakehash = CNMKHSH $@ quiet_cmd_conmakehash = CNMKHSH $@
cmd_conmakehash = scripts/conmakehash $< | \ cmd_conmakehash = scripts/conmakehash $< | \
sed -e '/\#include <[^>]*>/p' -e 's/types/init/' \ 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 $(obj)/promcon_tbl.c: $(src)/prom.uni
$(call cmd,conmakehash) $(call cmd,conmakehash)
...@@ -656,7 +656,7 @@ static int ffb_setcolreg(unsigned regno, ...@@ -656,7 +656,7 @@ static int ffb_setcolreg(unsigned regno,
{ {
u32 value; u32 value;
if (regno >= 256) if (regno >= 16)
return 1; return 1;
red >>= 8; red >>= 8;
...@@ -903,7 +903,7 @@ ffb_init_fix(struct fb_info *info) ...@@ -903,7 +903,7 @@ ffb_init_fix(struct fb_info *info)
struct all_info { struct all_info {
struct fb_info info; struct fb_info info;
struct ffb_par par; struct ffb_par par;
u32 pseudo_palette[256]; u32 pseudo_palette[16];
}; };
static int ffb_init_one(struct of_device *op) static int ffb_init_one(struct of_device *op)
......
...@@ -28,7 +28,7 @@ struct s3d_info { ...@@ -28,7 +28,7 @@ struct s3d_info {
unsigned int depth; unsigned int depth;
unsigned int fb_size; unsigned int fb_size;
u32 pseudo_palette[256]; u32 pseudo_palette[16];
}; };
static int __devinit s3d_get_props(struct s3d_info *sp) static int __devinit s3d_get_props(struct s3d_info *sp)
...@@ -52,15 +52,14 @@ static int s3d_setcolreg(unsigned regno, ...@@ -52,15 +52,14 @@ static int s3d_setcolreg(unsigned regno,
{ {
u32 value; u32 value;
if (regno >= 256) if (regno < 16) {
return 1;
red >>= 8; red >>= 8;
green >>= 8; green >>= 8;
blue >>= 8; blue >>= 8;
value = (blue << 24) | (green << 16) | (red << 8); value = (blue << 24) | (green << 16) | (red << 8);
((u32 *)info->pseudo_palette)[regno] = value; ((u32 *)info->pseudo_palette)[regno] = value;
}
return 0; return 0;
} }
......
...@@ -50,7 +50,7 @@ struct e3d_info { ...@@ -50,7 +50,7 @@ struct e3d_info {
u32 fb8_0_off; u32 fb8_0_off;
u32 fb8_1_off; u32 fb8_1_off;
u32 pseudo_palette[256]; u32 pseudo_palette[16];
}; };
static int __devinit e3d_get_props(struct e3d_info *ep) static int __devinit e3d_get_props(struct e3d_info *ep)
...@@ -126,6 +126,8 @@ static int e3d_setcolreg(unsigned regno, ...@@ -126,6 +126,8 @@ static int e3d_setcolreg(unsigned regno,
blue_8 = blue >> 8; blue_8 = blue >> 8;
value = (blue_8 << 24) | (green_8 << 16) | (red_8 << 8); value = (blue_8 << 24) | (green_8 << 16) | (red_8 << 8);
if (info->fix.visual == FB_VISUAL_TRUECOLOR && regno < 16)
((u32 *)info->pseudo_palette)[regno] = value; ((u32 *)info->pseudo_palette)[regno] = value;
......
...@@ -31,7 +31,7 @@ typedef struct { ...@@ -31,7 +31,7 @@ typedef struct {
unsigned int ecache_size; unsigned int ecache_size;
unsigned int ecache_line_size; unsigned int ecache_line_size;
int core_id; int core_id;
unsigned int __pad3; int proc_id;
} cpuinfo_sparc; } cpuinfo_sparc;
DECLARE_PER_CPU(cpuinfo_sparc, __cpu_data); DECLARE_PER_CPU(cpuinfo_sparc, __cpu_data);
......
...@@ -162,6 +162,22 @@ dma_mapping_error(dma_addr_t dma_addr) ...@@ -162,6 +162,22 @@ dma_mapping_error(dma_addr_t dma_addr)
#else #else
struct device; 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, static inline void *dma_alloc_coherent(struct device *dev, size_t size,
dma_addr_t *dma_handle, gfp_t flag) dma_addr_t *dma_handle, gfp_t flag)
...@@ -176,6 +192,52 @@ static inline void dma_free_coherent(struct device *dev, size_t size, ...@@ -176,6 +192,52 @@ static inline void dma_free_coherent(struct device *dev, size_t size,
BUG(); 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 static inline void
dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle, size_t size, dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle, size_t size,
enum dma_data_direction direction) 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 ...@@ -190,6 +252,27 @@ dma_sync_single_for_device(struct device *dev, dma_addr_t dma_handle, size_t siz
BUG(); 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 */ #endif /* PCI */
......
...@@ -2798,6 +2798,11 @@ struct hv_mmu_statistics { ...@@ -2798,6 +2798,11 @@ struct hv_mmu_statistics {
*/ */
#define HV_FAST_MMUSTAT_INFO 0x103 #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 crypto services */
/* ncs_request() sub-function numbers */ /* ncs_request() sub-function numbers */
......
...@@ -33,6 +33,8 @@ extern cpumask_t phys_cpu_present_map; ...@@ -33,6 +33,8 @@ extern cpumask_t phys_cpu_present_map;
#define cpu_possible_map phys_cpu_present_map #define cpu_possible_map phys_cpu_present_map
extern cpumask_t cpu_sibling_map[NR_CPUS]; 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. * General functions that each host system must provide.
......
#ifndef _ASM_SPARC64_TOPOLOGY_H #ifndef _ASM_SPARC64_TOPOLOGY_H
#define _ASM_SPARC64_TOPOLOGY_H #define _ASM_SPARC64_TOPOLOGY_H
#include <asm/spitfire.h> #ifdef CONFIG_SMP
#define smt_capable() (tlb_type == hypervisor) #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> #include <asm-generic/topology.h>
#define topology_core_id(cpu) (cpu_data(cpu).core_id) #define cpu_coregroup_map(cpu) (cpu_core_map[cpu])
#define topology_thread_siblings(cpu) (cpu_sibling_map[cpu])
#endif /* _ASM_SPARC64_TOPOLOGY_H */ #endif /* _ASM_SPARC64_TOPOLOGY_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment