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