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