xref: /qemu/pc-bios/s390-ccw/iplb.h (revision b39b7718dc23e9890ea7e770f543e6f2d17cb31b)
1d046c51dSAlexander Yarygin /*
2d046c51dSAlexander Yarygin  * QEMU S390 IPL Block
3d046c51dSAlexander Yarygin  *
4d046c51dSAlexander Yarygin  * Copyright 2015 IBM Corp.
5d046c51dSAlexander Yarygin  * Author(s): Alexander Yarygin <yarygin@linux.vnet.ibm.com>
6d046c51dSAlexander Yarygin  *
7d046c51dSAlexander Yarygin  * This work is licensed under the terms of the GNU GPL, version 2 or (at
8d046c51dSAlexander Yarygin  * your option) any later version. See the COPYING file in the top-level
9d046c51dSAlexander Yarygin  * directory.
10d046c51dSAlexander Yarygin  */
11d046c51dSAlexander Yarygin 
12d046c51dSAlexander Yarygin #ifndef IPLB_H
13d046c51dSAlexander Yarygin #define IPLB_H
14d046c51dSAlexander Yarygin 
15d046c51dSAlexander Yarygin struct IplBlockCcw {
16d046c51dSAlexander Yarygin     uint8_t  reserved0[85];
17d046c51dSAlexander Yarygin     uint8_t  ssid;
18d046c51dSAlexander Yarygin     uint16_t devno;
19d046c51dSAlexander Yarygin     uint8_t  vm_flags;
20d046c51dSAlexander Yarygin     uint8_t  reserved3[3];
21d046c51dSAlexander Yarygin     uint32_t vm_parm_len;
22d046c51dSAlexander Yarygin     uint8_t  nss_name[8];
23d046c51dSAlexander Yarygin     uint8_t  vm_parm[64];
24d046c51dSAlexander Yarygin     uint8_t  reserved4[8];
25d046c51dSAlexander Yarygin } __attribute__ ((packed));
26d046c51dSAlexander Yarygin typedef struct IplBlockCcw IplBlockCcw;
27d046c51dSAlexander Yarygin 
28d046c51dSAlexander Yarygin struct IplBlockFcp {
29d046c51dSAlexander Yarygin     uint8_t  reserved1[305 - 1];
30d046c51dSAlexander Yarygin     uint8_t  opt;
31d046c51dSAlexander Yarygin     uint8_t  reserved2[3];
32d046c51dSAlexander Yarygin     uint16_t reserved3;
33d046c51dSAlexander Yarygin     uint16_t devno;
34d046c51dSAlexander Yarygin     uint8_t  reserved4[4];
35d046c51dSAlexander Yarygin     uint64_t wwpn;
36d046c51dSAlexander Yarygin     uint64_t lun;
37d046c51dSAlexander Yarygin     uint32_t bootprog;
38d046c51dSAlexander Yarygin     uint8_t  reserved5[12];
39d046c51dSAlexander Yarygin     uint64_t br_lba;
40d046c51dSAlexander Yarygin     uint32_t scp_data_len;
41d046c51dSAlexander Yarygin     uint8_t  reserved6[260];
42d046c51dSAlexander Yarygin     uint8_t  scp_data[];
43d046c51dSAlexander Yarygin } __attribute__ ((packed));
44d046c51dSAlexander Yarygin typedef struct IplBlockFcp IplBlockFcp;
45d046c51dSAlexander Yarygin 
46*b39b7718SEugene (jno) Dvurechenski struct IplBlockQemuScsi {
47*b39b7718SEugene (jno) Dvurechenski     uint32_t lun;
48*b39b7718SEugene (jno) Dvurechenski     uint16_t target;
49*b39b7718SEugene (jno) Dvurechenski     uint16_t channel;
50*b39b7718SEugene (jno) Dvurechenski     uint8_t  reserved0[77];
51*b39b7718SEugene (jno) Dvurechenski     uint8_t  ssid;
52*b39b7718SEugene (jno) Dvurechenski     uint16_t devno;
53*b39b7718SEugene (jno) Dvurechenski } __attribute__ ((packed));
54*b39b7718SEugene (jno) Dvurechenski typedef struct IplBlockQemuScsi IplBlockQemuScsi;
55*b39b7718SEugene (jno) Dvurechenski 
56d046c51dSAlexander Yarygin struct IplParameterBlock {
57d046c51dSAlexander Yarygin     uint32_t len;
58d046c51dSAlexander Yarygin     uint8_t  reserved0[3];
59d046c51dSAlexander Yarygin     uint8_t  version;
60d046c51dSAlexander Yarygin     uint32_t blk0_len;
61d046c51dSAlexander Yarygin     uint8_t  pbt;
62d046c51dSAlexander Yarygin     uint8_t  flags;
63d046c51dSAlexander Yarygin     uint16_t reserved01;
64d046c51dSAlexander Yarygin     uint8_t  loadparm[8];
65d046c51dSAlexander Yarygin     union {
66d046c51dSAlexander Yarygin         IplBlockCcw ccw;
67d046c51dSAlexander Yarygin         IplBlockFcp fcp;
68*b39b7718SEugene (jno) Dvurechenski         IplBlockQemuScsi scsi;
69d046c51dSAlexander Yarygin     };
70d046c51dSAlexander Yarygin } __attribute__ ((packed));
71d046c51dSAlexander Yarygin typedef struct IplParameterBlock IplParameterBlock;
72d046c51dSAlexander Yarygin 
73d046c51dSAlexander Yarygin extern IplParameterBlock iplb __attribute__((__aligned__(PAGE_SIZE)));
74d046c51dSAlexander Yarygin 
75d046c51dSAlexander Yarygin #define S390_IPL_TYPE_FCP 0x00
76d046c51dSAlexander Yarygin #define S390_IPL_TYPE_CCW 0x02
77*b39b7718SEugene (jno) Dvurechenski #define S390_IPL_TYPE_QEMU_SCSI 0xff
78d046c51dSAlexander Yarygin 
79d046c51dSAlexander Yarygin static inline bool store_iplb(IplParameterBlock *iplb)
80d046c51dSAlexander Yarygin {
81d046c51dSAlexander Yarygin     register unsigned long addr asm("0") = (unsigned long) iplb;
82d046c51dSAlexander Yarygin     register unsigned long rc asm("1") = 0;
83d046c51dSAlexander Yarygin 
84d046c51dSAlexander Yarygin     asm volatile ("diag %0,%2,0x308\n"
85d046c51dSAlexander Yarygin                   : "+d" (addr), "+d" (rc)
86d046c51dSAlexander Yarygin                   : "d" (6)
87d046c51dSAlexander Yarygin                   : "memory", "cc");
88d046c51dSAlexander Yarygin     return rc == 0x01;
89d046c51dSAlexander Yarygin }
90d046c51dSAlexander Yarygin 
91d046c51dSAlexander Yarygin #endif /* IPLB_H */
92