aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/s390/char
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2012-07-24 15:01:20 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2012-07-24 15:01:20 -0400
commit5fecc9d8f59e765c2a48379dd7c6f5cf88c7d75a (patch)
treed1fc25d9650d3ac24591bba6f5e2e7a1afc54796 /drivers/s390/char
parent3c4cfadef6a1665d9cd02a543782d03d3e6740c6 (diff)
parent1a577b72475d161b6677c05abe57301362023bb2 (diff)
Merge tag 'kvm-3.6-1' of git://git.kernel.org/pub/scm/virt/kvm/kvm
Pull KVM updates from Avi Kivity: "Highlights include - full big real mode emulation on pre-Westmere Intel hosts (can be disabled with emulate_invalid_guest_state=0) - relatively small ppc and s390 updates - PCID/INVPCID support in guests - EOI avoidance; 3.6 guests should perform better on 3.6 hosts on interrupt intensive workloads) - Lockless write faults during live migration - EPT accessed/dirty bits support for new Intel processors" Fix up conflicts in: - Documentation/virtual/kvm/api.txt: Stupid subchapter numbering, added next to each other. - arch/powerpc/kvm/booke_interrupts.S: PPC asm changes clashing with the KVM fixes - arch/s390/include/asm/sigp.h, arch/s390/kvm/sigp.c: Duplicated commits through the kvm tree and the s390 tree, with subsequent edits in the KVM tree. * tag 'kvm-3.6-1' of git://git.kernel.org/pub/scm/virt/kvm/kvm: (93 commits) KVM: fix race with level interrupts x86, hyper: fix build with !CONFIG_KVM_GUEST Revert "apic: fix kvm build on UP without IOAPIC" KVM guest: switch to apic_set_eoi_write, apic_write apic: add apic_set_eoi_write for PV use KVM: VMX: Implement PCID/INVPCID for guests with EPT KVM: Add x86_hyper_kvm to complete detect_hypervisor_platform check KVM: PPC: Critical interrupt emulation support KVM: PPC: e500mc: Fix tlbilx emulation for 64-bit guests KVM: PPC64: booke: Set interrupt computation mode for 64-bit host KVM: PPC: bookehv: Add ESR flag to Data Storage Interrupt KVM: PPC: bookehv64: Add support for std/ld emulation. booke: Added crit/mc exception handler for e500v2 booke/bookehv: Add host crit-watchdog exception support KVM: MMU: document mmu-lock and fast page fault KVM: MMU: fix kvm_mmu_pagetable_walk tracepoint KVM: MMU: trace fast page fault KVM: MMU: fast path of handling guest page fault KVM: MMU: introduce SPTE_MMU_WRITEABLE bit KVM: MMU: fold tlb flush judgement into mmu_spte_update ...
Diffstat (limited to 'drivers/s390/char')
-rw-r--r--drivers/s390/char/sclp.c10
-rw-r--r--drivers/s390/char/sclp.h10
-rw-r--r--drivers/s390/char/sclp_cmd.c38
3 files changed, 48 insertions, 10 deletions
diff --git a/drivers/s390/char/sclp.c b/drivers/s390/char/sclp.c
index 30f29a0020a1..3fcc000efc53 100644
--- a/drivers/s390/char/sclp.c
+++ b/drivers/s390/char/sclp.c
@@ -654,16 +654,6 @@ sclp_remove_processed(struct sccb_header *sccb)
654 654
655EXPORT_SYMBOL(sclp_remove_processed); 655EXPORT_SYMBOL(sclp_remove_processed);
656 656
657struct init_sccb {
658 struct sccb_header header;
659 u16 _reserved;
660 u16 mask_length;
661 sccb_mask_t receive_mask;
662 sccb_mask_t send_mask;
663 sccb_mask_t sclp_receive_mask;
664 sccb_mask_t sclp_send_mask;
665} __attribute__((packed));
666
667/* Prepare init mask request. Called while sclp_lock is locked. */ 657/* Prepare init mask request. Called while sclp_lock is locked. */
668static inline void 658static inline void
669__sclp_make_init_req(u32 receive_mask, u32 send_mask) 659__sclp_make_init_req(u32 receive_mask, u32 send_mask)
diff --git a/drivers/s390/char/sclp.h b/drivers/s390/char/sclp.h
index 49a1bb52bc87..d7e97ae9ef6d 100644
--- a/drivers/s390/char/sclp.h
+++ b/drivers/s390/char/sclp.h
@@ -88,6 +88,16 @@ struct sccb_header {
88 u16 response_code; 88 u16 response_code;
89} __attribute__((packed)); 89} __attribute__((packed));
90 90
91struct init_sccb {
92 struct sccb_header header;
93 u16 _reserved;
94 u16 mask_length;
95 sccb_mask_t receive_mask;
96 sccb_mask_t send_mask;
97 sccb_mask_t sclp_receive_mask;
98 sccb_mask_t sclp_send_mask;
99} __attribute__((packed));
100
91extern u64 sclp_facilities; 101extern u64 sclp_facilities;
92#define SCLP_HAS_CHP_INFO (sclp_facilities & 0x8000000000000000ULL) 102#define SCLP_HAS_CHP_INFO (sclp_facilities & 0x8000000000000000ULL)
93#define SCLP_HAS_CHP_RECONFIG (sclp_facilities & 0x2000000000000000ULL) 103#define SCLP_HAS_CHP_RECONFIG (sclp_facilities & 0x2000000000000000ULL)
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)