]>
Commit | Line | Data |
---|---|---|
2fc2d1e9 | 1 | /* |
2fc2d1e9 HC |
2 | * Copyright IBM Corp. 2007 |
3 | * Author(s): Heiko Carstens <heiko.carstens@de.ibm.com> | |
4 | */ | |
5 | ||
b3ff088b MS |
6 | #define KMSG_COMPONENT "sclp_config" |
7 | #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt | |
8 | ||
2fc2d1e9 HC |
9 | #include <linux/init.h> |
10 | #include <linux/errno.h> | |
11 | #include <linux/cpu.h> | |
8a25a2fd | 12 | #include <linux/device.h> |
2fc2d1e9 | 13 | #include <linux/workqueue.h> |
1e489518 | 14 | #include <asm/smp.h> |
2fc2d1e9 | 15 | |
b3ff088b | 16 | #include "sclp.h" |
2fc2d1e9 HC |
17 | |
18 | struct conf_mgm_data { | |
19 | u8 reserved; | |
20 | u8 ev_qualifier; | |
21 | } __attribute__((packed)); | |
22 | ||
1e489518 | 23 | #define EV_QUAL_CPU_CHANGE 1 |
2fc2d1e9 HC |
24 | #define EV_QUAL_CAP_CHANGE 3 |
25 | ||
26 | static struct work_struct sclp_cpu_capability_work; | |
1e489518 | 27 | static struct work_struct sclp_cpu_change_work; |
2fc2d1e9 HC |
28 | |
29 | static void sclp_cpu_capability_notify(struct work_struct *work) | |
30 | { | |
31 | int cpu; | |
8a25a2fd | 32 | struct device *dev; |
2fc2d1e9 | 33 | |
8e102301 | 34 | s390_adjust_jiffies(); |
b3ff088b | 35 | pr_warning("cpu capability changed.\n"); |
86ef5c9a | 36 | get_online_cpus(); |
2fc2d1e9 | 37 | for_each_online_cpu(cpu) { |
8a25a2fd KS |
38 | dev = get_cpu_device(cpu); |
39 | kobject_uevent(&dev->kobj, KOBJ_CHANGE); | |
2fc2d1e9 | 40 | } |
86ef5c9a | 41 | put_online_cpus(); |
2fc2d1e9 HC |
42 | } |
43 | ||
b9732ca1 HC |
44 | static void __ref sclp_cpu_change_notify(struct work_struct *work) |
45 | { | |
fc7e1e4b | 46 | smp_rescan_cpus(); |
1e489518 HC |
47 | } |
48 | ||
2fc2d1e9 HC |
49 | static void sclp_conf_receiver_fn(struct evbuf_header *evbuf) |
50 | { | |
51 | struct conf_mgm_data *cdata; | |
52 | ||
53 | cdata = (struct conf_mgm_data *)(evbuf + 1); | |
1e489518 HC |
54 | switch (cdata->ev_qualifier) { |
55 | case EV_QUAL_CPU_CHANGE: | |
56 | schedule_work(&sclp_cpu_change_work); | |
57 | break; | |
58 | case EV_QUAL_CAP_CHANGE: | |
2fc2d1e9 | 59 | schedule_work(&sclp_cpu_capability_work); |
1e489518 HC |
60 | break; |
61 | } | |
2fc2d1e9 HC |
62 | } |
63 | ||
64 | static struct sclp_register sclp_conf_register = | |
65 | { | |
66 | .receive_mask = EVTYP_CONFMGMDATA_MASK, | |
67 | .receiver_fn = sclp_conf_receiver_fn, | |
68 | }; | |
69 | ||
70 | static int __init sclp_conf_init(void) | |
71 | { | |
2fc2d1e9 | 72 | INIT_WORK(&sclp_cpu_capability_work, sclp_cpu_capability_notify); |
1e489518 | 73 | INIT_WORK(&sclp_cpu_change_work, sclp_cpu_change_notify); |
1b60f68f | 74 | return sclp_register(&sclp_conf_register); |
2fc2d1e9 HC |
75 | } |
76 | ||
77 | __initcall(sclp_conf_init); |