aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/s390/char/sclp_cmd.c
diff options
context:
space:
mode:
authorHeinz Graalfs <graalfs@linux.vnet.ibm.com>2012-06-11 10:06:59 -0400
committerMarcelo Tosatti <mtosatti@redhat.com>2012-06-13 19:53:45 -0400
commitcd1834591fe9564720ac4b0193bf1c790fe89f0d (patch)
treed705284edf49d5054f6558db3c1f827179984bc4 /drivers/s390/char/sclp_cmd.c
parent61bde82caee95426bf1ad53fefc8dc691b8ba37c (diff)
KVM: s390: Perform early event mask processing during boot
For processing under KVM it is required to detect the actual SCLP console type in order to set it as preferred console. Signed-off-by: Heinz Graalfs <graalfs@linux.vnet.ibm.com> Acked-by: Heiko Carstens <heiko.carstens@de.ibm.com> Acked-by: Peter Oberparleiter <peter.oberparleiter@de.ibm.com> Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Diffstat (limited to 'drivers/s390/char/sclp_cmd.c')
-rw-r--r--drivers/s390/char/sclp_cmd.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/drivers/s390/char/sclp_cmd.c b/drivers/s390/char/sclp_cmd.c
index 766cb7b19b40..71ea923c322d 100644
--- a/drivers/s390/char/sclp_cmd.c
+++ b/drivers/s390/char/sclp_cmd.c
@@ -48,6 +48,7 @@ struct read_info_sccb {
48 u8 _reserved5[4096 - 112]; /* 112-4095 */ 48 u8 _reserved5[4096 - 112]; /* 112-4095 */
49} __attribute__((packed, aligned(PAGE_SIZE))); 49} __attribute__((packed, aligned(PAGE_SIZE)));
50 50
51static struct init_sccb __initdata early_event_mask_sccb __aligned(PAGE_SIZE);
51static struct read_info_sccb __initdata early_read_info_sccb; 52static struct read_info_sccb __initdata early_read_info_sccb;
52static int __initdata early_read_info_sccb_valid; 53static int __initdata early_read_info_sccb_valid;
53 54
@@ -104,6 +105,19 @@ static void __init sclp_read_info_early(void)
104 } 105 }
105} 106}
106 107
108static void __init sclp_event_mask_early(void)
109{
110 struct init_sccb *sccb = &early_event_mask_sccb;
111 int rc;
112
113 do {
114 memset(sccb, 0, sizeof(*sccb));
115 sccb->header.length = sizeof(*sccb);
116 sccb->mask_length = sizeof(sccb_mask_t);
117 rc = sclp_cmd_sync_early(SCLP_CMDW_WRITE_EVENT_MASK, sccb);
118 } while (rc == -EBUSY);
119}
120
107void __init sclp_facilities_detect(void) 121void __init sclp_facilities_detect(void)
108{ 122{
109 struct read_info_sccb *sccb; 123 struct read_info_sccb *sccb;
@@ -119,6 +133,30 @@ void __init sclp_facilities_detect(void)
119 rnmax = sccb->rnmax ? sccb->rnmax : sccb->rnmax2; 133 rnmax = sccb->rnmax ? sccb->rnmax : sccb->rnmax2;
120 rzm = sccb->rnsize ? sccb->rnsize : sccb->rnsize2; 134 rzm = sccb->rnsize ? sccb->rnsize : sccb->rnsize2;
121 rzm <<= 20; 135 rzm <<= 20;
136
137 sclp_event_mask_early();
138}
139
140bool __init sclp_has_linemode(void)
141{
142 struct init_sccb *sccb = &early_event_mask_sccb;
143
144 if (sccb->header.response_code != 0x20)
145 return 0;
146 if (sccb->sclp_send_mask & (EVTYP_MSG_MASK | EVTYP_PMSGCMD_MASK))
147 return 1;
148 return 0;
149}
150
151bool __init sclp_has_vt220(void)
152{
153 struct init_sccb *sccb = &early_event_mask_sccb;
154
155 if (sccb->header.response_code != 0x20)
156 return 0;
157 if (sccb->sclp_send_mask & EVTYP_VT220MSG_MASK)
158 return 1;
159 return 0;
122} 160}
123 161
124unsigned long long sclp_get_rnmax(void) 162unsigned long long sclp_get_rnmax(void)