xref: /qemu/hw/s390x/sclpcpi.c (revision 435c758da161448447dc47e678a97b8df434d94c)
1*435c758dSShalini Chellathurai Saroja  /*
2*435c758dSShalini Chellathurai Saroja   * SPDX-License-Identifier: GPL-2.0-or-later
3*435c758dSShalini Chellathurai Saroja   *
4*435c758dSShalini Chellathurai Saroja   * SCLP event type 11 - Control-Program Identification (CPI):
5*435c758dSShalini Chellathurai Saroja   *    CPI is used to send program identifiers from the guest to the
6*435c758dSShalini Chellathurai Saroja   *    Service-Call Logical Processor (SCLP). It is not sent by the SCLP.
7*435c758dSShalini Chellathurai Saroja   *
8*435c758dSShalini Chellathurai Saroja   *    Control-program identifiers provide data about the guest operating
9*435c758dSShalini Chellathurai Saroja   *    system.  The control-program identifiers are: system type, system name,
10*435c758dSShalini Chellathurai Saroja   *    system level and sysplex name.
11*435c758dSShalini Chellathurai Saroja   *
12*435c758dSShalini Chellathurai Saroja   *    In Linux, all the control-program identifiers are user configurable. The
13*435c758dSShalini Chellathurai Saroja   *    system type, system name, and sysplex name use EBCDIC characters from
14*435c758dSShalini Chellathurai Saroja   *    this set: capital A-Z, 0-9, $, @, #, and blank.  In Linux, the system
15*435c758dSShalini Chellathurai Saroja   *    type, system name and sysplex name are arbitrary free-form texts.
16*435c758dSShalini Chellathurai Saroja   *
17*435c758dSShalini Chellathurai Saroja   *    In Linux, the 8-byte hexadecimal system-level has the format
18*435c758dSShalini Chellathurai Saroja   *    0x<a><b><cc><dd><eeee><ff><gg><hh>, where:
19*435c758dSShalini Chellathurai Saroja   *    <a>: is a 4-bit digit, its most significant bit indicates hypervisor use
20*435c758dSShalini Chellathurai Saroja   *    <b>: is one digit that represents Linux distributions as follows
21*435c758dSShalini Chellathurai Saroja   *    0: generic Linux
22*435c758dSShalini Chellathurai Saroja   *    1: Red Hat Enterprise Linux
23*435c758dSShalini Chellathurai Saroja   *    2: SUSE Linux Enterprise Server
24*435c758dSShalini Chellathurai Saroja   *    3: Canonical Ubuntu
25*435c758dSShalini Chellathurai Saroja   *    4: Fedora
26*435c758dSShalini Chellathurai Saroja   *    5: openSUSE Leap
27*435c758dSShalini Chellathurai Saroja   *    6: Debian GNU/Linux
28*435c758dSShalini Chellathurai Saroja   *    7: Red Hat Enterprise Linux CoreOS
29*435c758dSShalini Chellathurai Saroja   *    <cc>: are two digits for a distribution-specific encoding of the major
30*435c758dSShalini Chellathurai Saroja   *    version of the distribution
31*435c758dSShalini Chellathurai Saroja   *    <dd>: are two digits for a distribution-specific encoding of the minor
32*435c758dSShalini Chellathurai Saroja   *    version of the distribution
33*435c758dSShalini Chellathurai Saroja   *    <eeee>: are four digits for the patch level of the distribution
34*435c758dSShalini Chellathurai Saroja   *    <ff>: are two digits for the major version of the kernel
35*435c758dSShalini Chellathurai Saroja   *    <gg>: are two digits for the minor version of the kernel
36*435c758dSShalini Chellathurai Saroja   *    <hh>: are two digits for the stable version of the kernel
37*435c758dSShalini Chellathurai Saroja   *    (e.g. 74872343805430528, when converted to hex is 0x010a000000060b00). On
38*435c758dSShalini Chellathurai Saroja   *    machines prior to z16, some of the values are not available to display.
39*435c758dSShalini Chellathurai Saroja   *
40*435c758dSShalini Chellathurai Saroja   *    Sysplex refers to a cluster of logical partitions that communicates and
41*435c758dSShalini Chellathurai Saroja   *    co-operates with each other.
42*435c758dSShalini Chellathurai Saroja   *
43*435c758dSShalini Chellathurai Saroja   *    The CPI feature is supported since 10.1.
44*435c758dSShalini Chellathurai Saroja   *
45*435c758dSShalini Chellathurai Saroja   * Copyright IBM, Corp. 2024
46*435c758dSShalini Chellathurai Saroja   *
47*435c758dSShalini Chellathurai Saroja   * Authors:
48*435c758dSShalini Chellathurai Saroja   *  Shalini Chellathurai Saroja <shalini@linux.ibm.com>
49*435c758dSShalini Chellathurai Saroja   *
50*435c758dSShalini Chellathurai Saroja   */
51*435c758dSShalini Chellathurai Saroja 
52*435c758dSShalini Chellathurai Saroja #include "qemu/osdep.h"
53*435c758dSShalini Chellathurai Saroja #include "hw/s390x/event-facility.h"
54*435c758dSShalini Chellathurai Saroja 
55*435c758dSShalini Chellathurai Saroja typedef struct Data {
56*435c758dSShalini Chellathurai Saroja     uint8_t id_format;
57*435c758dSShalini Chellathurai Saroja     uint8_t reserved0;
58*435c758dSShalini Chellathurai Saroja     uint8_t system_type[8];
59*435c758dSShalini Chellathurai Saroja     uint64_t reserved1;
60*435c758dSShalini Chellathurai Saroja     uint8_t system_name[8];
61*435c758dSShalini Chellathurai Saroja     uint64_t reserved2;
62*435c758dSShalini Chellathurai Saroja     uint64_t system_level;
63*435c758dSShalini Chellathurai Saroja     uint64_t reserved3;
64*435c758dSShalini Chellathurai Saroja     uint8_t sysplex_name[8];
65*435c758dSShalini Chellathurai Saroja     uint8_t reserved4[16];
66*435c758dSShalini Chellathurai Saroja } QEMU_PACKED Data;
67*435c758dSShalini Chellathurai Saroja 
68*435c758dSShalini Chellathurai Saroja typedef struct ControlProgramIdMsg {
69*435c758dSShalini Chellathurai Saroja     EventBufferHeader ebh;
70*435c758dSShalini Chellathurai Saroja     Data data;
71*435c758dSShalini Chellathurai Saroja } QEMU_PACKED ControlProgramIdMsg;
72*435c758dSShalini Chellathurai Saroja 
73*435c758dSShalini Chellathurai Saroja static bool can_handle_event(uint8_t type)
74*435c758dSShalini Chellathurai Saroja {
75*435c758dSShalini Chellathurai Saroja     return type == SCLP_EVENT_CTRL_PGM_ID;
76*435c758dSShalini Chellathurai Saroja }
77*435c758dSShalini Chellathurai Saroja 
78*435c758dSShalini Chellathurai Saroja static sccb_mask_t send_mask(void)
79*435c758dSShalini Chellathurai Saroja {
80*435c758dSShalini Chellathurai Saroja     return 0;
81*435c758dSShalini Chellathurai Saroja }
82*435c758dSShalini Chellathurai Saroja 
83*435c758dSShalini Chellathurai Saroja /* Enable SCLP to accept buffers of event type CPI from the control-program. */
84*435c758dSShalini Chellathurai Saroja static sccb_mask_t receive_mask(void)
85*435c758dSShalini Chellathurai Saroja {
86*435c758dSShalini Chellathurai Saroja     return SCLP_EVENT_MASK_CTRL_PGM_ID;
87*435c758dSShalini Chellathurai Saroja }
88*435c758dSShalini Chellathurai Saroja 
89*435c758dSShalini Chellathurai Saroja static int write_event_data(SCLPEvent *event, EventBufferHeader *evt_buf_hdr)
90*435c758dSShalini Chellathurai Saroja {
91*435c758dSShalini Chellathurai Saroja     ControlProgramIdMsg *cpim = container_of(evt_buf_hdr, ControlProgramIdMsg,
92*435c758dSShalini Chellathurai Saroja                                              ebh);
93*435c758dSShalini Chellathurai Saroja 
94*435c758dSShalini Chellathurai Saroja     cpim->ebh.flags = SCLP_EVENT_BUFFER_ACCEPTED;
95*435c758dSShalini Chellathurai Saroja     return SCLP_RC_NORMAL_COMPLETION;
96*435c758dSShalini Chellathurai Saroja }
97*435c758dSShalini Chellathurai Saroja 
98*435c758dSShalini Chellathurai Saroja static void cpi_class_init(ObjectClass *klass, const void *data)
99*435c758dSShalini Chellathurai Saroja {
100*435c758dSShalini Chellathurai Saroja     DeviceClass *dc = DEVICE_CLASS(klass);
101*435c758dSShalini Chellathurai Saroja     SCLPEventClass *k = SCLP_EVENT_CLASS(klass);
102*435c758dSShalini Chellathurai Saroja 
103*435c758dSShalini Chellathurai Saroja     dc->user_creatable = false;
104*435c758dSShalini Chellathurai Saroja 
105*435c758dSShalini Chellathurai Saroja     k->can_handle_event = can_handle_event;
106*435c758dSShalini Chellathurai Saroja     k->get_send_mask = send_mask;
107*435c758dSShalini Chellathurai Saroja     k->get_receive_mask = receive_mask;
108*435c758dSShalini Chellathurai Saroja     k->write_event_data = write_event_data;
109*435c758dSShalini Chellathurai Saroja }
110*435c758dSShalini Chellathurai Saroja 
111*435c758dSShalini Chellathurai Saroja static const TypeInfo sclp_cpi_info = {
112*435c758dSShalini Chellathurai Saroja     .name          = TYPE_SCLP_EVENT_CPI,
113*435c758dSShalini Chellathurai Saroja     .parent        = TYPE_SCLP_EVENT,
114*435c758dSShalini Chellathurai Saroja     .instance_size = sizeof(SCLPEventCPI),
115*435c758dSShalini Chellathurai Saroja     .class_init    = cpi_class_init,
116*435c758dSShalini Chellathurai Saroja };
117*435c758dSShalini Chellathurai Saroja 
118*435c758dSShalini Chellathurai Saroja static void sclp_cpi_register_types(void)
119*435c758dSShalini Chellathurai Saroja {
120*435c758dSShalini Chellathurai Saroja     type_register_static(&sclp_cpi_info);
121*435c758dSShalini Chellathurai Saroja }
122*435c758dSShalini Chellathurai Saroja 
123*435c758dSShalini Chellathurai Saroja type_init(sclp_cpi_register_types)
124