linux/arch/s390/include/asm/diag.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2/*
   3 * s390 diagnose functions
   4 *
   5 * Copyright IBM Corp. 2007
   6 * Author(s): Michael Holzheu <holzheu@de.ibm.com>
   7 */
   8
   9#ifndef _ASM_S390_DIAG_H
  10#define _ASM_S390_DIAG_H
  11
  12#include <linux/if_ether.h>
  13#include <linux/percpu.h>
  14
  15enum diag_stat_enum {
  16        DIAG_STAT_X008,
  17        DIAG_STAT_X00C,
  18        DIAG_STAT_X010,
  19        DIAG_STAT_X014,
  20        DIAG_STAT_X044,
  21        DIAG_STAT_X064,
  22        DIAG_STAT_X09C,
  23        DIAG_STAT_X0DC,
  24        DIAG_STAT_X204,
  25        DIAG_STAT_X210,
  26        DIAG_STAT_X224,
  27        DIAG_STAT_X250,
  28        DIAG_STAT_X258,
  29        DIAG_STAT_X26C,
  30        DIAG_STAT_X288,
  31        DIAG_STAT_X2C4,
  32        DIAG_STAT_X2FC,
  33        DIAG_STAT_X304,
  34        DIAG_STAT_X308,
  35        DIAG_STAT_X500,
  36        NR_DIAG_STAT
  37};
  38
  39void diag_stat_inc(enum diag_stat_enum nr);
  40void diag_stat_inc_norecursion(enum diag_stat_enum nr);
  41
  42/*
  43 * Diagnose 10: Release page range
  44 */
  45static inline void diag10_range(unsigned long start_pfn, unsigned long num_pfn)
  46{
  47        unsigned long start_addr, end_addr;
  48
  49        start_addr = start_pfn << PAGE_SHIFT;
  50        end_addr = (start_pfn + num_pfn - 1) << PAGE_SHIFT;
  51
  52        diag_stat_inc(DIAG_STAT_X010);
  53        asm volatile(
  54                "0:     diag    %0,%1,0x10\n"
  55                "1:     nopr    %%r7\n"
  56                EX_TABLE(0b, 1b)
  57                EX_TABLE(1b, 1b)
  58                : : "a" (start_addr), "a" (end_addr));
  59}
  60
  61/*
  62 * Diagnose 14: Input spool file manipulation
  63 */
  64extern int diag14(unsigned long rx, unsigned long ry1, unsigned long subcode);
  65
  66/*
  67 * Diagnose 210: Get information about a virtual device
  68 */
  69struct diag210 {
  70        u16 vrdcdvno;   /* device number (input) */
  71        u16 vrdclen;    /* data block length (input) */
  72        u8 vrdcvcla;    /* virtual device class (output) */
  73        u8 vrdcvtyp;    /* virtual device type (output) */
  74        u8 vrdcvsta;    /* virtual device status (output) */
  75        u8 vrdcvfla;    /* virtual device flags (output) */
  76        u8 vrdcrccl;    /* real device class (output) */
  77        u8 vrdccrty;    /* real device type (output) */
  78        u8 vrdccrmd;    /* real device model (output) */
  79        u8 vrdccrft;    /* real device feature (output) */
  80} __attribute__((packed, aligned(4)));
  81
  82extern int diag210(struct diag210 *addr);
  83
  84/* bit is set in flags, when physical cpu info is included in diag 204 data */
  85#define DIAG204_LPAR_PHYS_FLG 0x80
  86#define DIAG204_LPAR_NAME_LEN 8         /* lpar name len in diag 204 data */
  87#define DIAG204_CPU_NAME_LEN 16         /* type name len of cpus in diag224 name table */
  88
  89/* diag 204 subcodes */
  90enum diag204_sc {
  91        DIAG204_SUBC_STIB4 = 4,
  92        DIAG204_SUBC_RSI = 5,
  93        DIAG204_SUBC_STIB6 = 6,
  94        DIAG204_SUBC_STIB7 = 7
  95};
  96
  97/* The two available diag 204 data formats */
  98enum diag204_format {
  99        DIAG204_INFO_SIMPLE = 0,
 100        DIAG204_INFO_EXT = 0x00010000
 101};
 102
 103enum diag204_cpu_flags {
 104        DIAG204_CPU_ONLINE = 0x20,
 105        DIAG204_CPU_CAPPED = 0x40,
 106};
 107
 108struct diag204_info_blk_hdr {
 109        __u8  npar;
 110        __u8  flags;
 111        __u16 tslice;
 112        __u16 phys_cpus;
 113        __u16 this_part;
 114        __u64 curtod;
 115} __packed;
 116
 117struct diag204_x_info_blk_hdr {
 118        __u8  npar;
 119        __u8  flags;
 120        __u16 tslice;
 121        __u16 phys_cpus;
 122        __u16 this_part;
 123        __u64 curtod1;
 124        __u64 curtod2;
 125        char reserved[40];
 126} __packed;
 127
 128struct diag204_part_hdr {
 129        __u8 pn;
 130        __u8 cpus;
 131        char reserved[6];
 132        char part_name[DIAG204_LPAR_NAME_LEN];
 133} __packed;
 134
 135struct diag204_x_part_hdr {
 136        __u8  pn;
 137        __u8  cpus;
 138        __u8  rcpus;
 139        __u8  pflag;
 140        __u32 mlu;
 141        char  part_name[DIAG204_LPAR_NAME_LEN];
 142        char  lpc_name[8];
 143        char  os_name[8];
 144        __u64 online_cs;
 145        __u64 online_es;
 146        __u8  upid;
 147        __u8  reserved:3;
 148        __u8  mtid:5;
 149        char  reserved1[2];
 150        __u32 group_mlu;
 151        char  group_name[8];
 152        char  hardware_group_name[8];
 153        char  reserved2[24];
 154} __packed;
 155
 156struct diag204_cpu_info {
 157        __u16 cpu_addr;
 158        char  reserved1[2];
 159        __u8  ctidx;
 160        __u8  cflag;
 161        __u16 weight;
 162        __u64 acc_time;
 163        __u64 lp_time;
 164} __packed;
 165
 166struct diag204_x_cpu_info {
 167        __u16 cpu_addr;
 168        char  reserved1[2];
 169        __u8  ctidx;
 170        __u8  cflag;
 171        __u16 weight;
 172        __u64 acc_time;
 173        __u64 lp_time;
 174        __u16 min_weight;
 175        __u16 cur_weight;
 176        __u16 max_weight;
 177        char  reseved2[2];
 178        __u64 online_time;
 179        __u64 wait_time;
 180        __u32 pma_weight;
 181        __u32 polar_weight;
 182        __u32 cpu_type_cap;
 183        __u32 group_cpu_type_cap;
 184        char  reserved3[32];
 185} __packed;
 186
 187struct diag204_phys_hdr {
 188        char reserved1[1];
 189        __u8 cpus;
 190        char reserved2[6];
 191        char mgm_name[8];
 192} __packed;
 193
 194struct diag204_x_phys_hdr {
 195        char reserved1[1];
 196        __u8 cpus;
 197        char reserved2[6];
 198        char mgm_name[8];
 199        char reserved3[80];
 200} __packed;
 201
 202struct diag204_phys_cpu {
 203        __u16 cpu_addr;
 204        char  reserved1[2];
 205        __u8  ctidx;
 206        char  reserved2[3];
 207        __u64 mgm_time;
 208        char  reserved3[8];
 209} __packed;
 210
 211struct diag204_x_phys_cpu {
 212        __u16 cpu_addr;
 213        char  reserved1[2];
 214        __u8  ctidx;
 215        char  reserved2[1];
 216        __u16 weight;
 217        __u64 mgm_time;
 218        char  reserved3[80];
 219} __packed;
 220
 221struct diag204_x_part_block {
 222        struct diag204_x_part_hdr hdr;
 223        struct diag204_x_cpu_info cpus[];
 224} __packed;
 225
 226struct diag204_x_phys_block {
 227        struct diag204_x_phys_hdr hdr;
 228        struct diag204_x_phys_cpu cpus[];
 229} __packed;
 230
 231enum diag26c_sc {
 232        DIAG26C_MAC_SERVICES = 0x00000030
 233};
 234
 235enum diag26c_version {
 236        DIAG26C_VERSION2 = 0x00000002   /* z/VM 5.4.0 */
 237};
 238
 239#define DIAG26C_GET_MAC 0x0000
 240struct diag26c_mac_req {
 241        u32     resp_buf_len;
 242        u32     resp_version;
 243        u16     op_code;
 244        u16     devno;
 245        u8      res[4];
 246};
 247
 248struct diag26c_mac_resp {
 249        u32     version;
 250        u8      mac[ETH_ALEN];
 251        u8      res[2];
 252} __aligned(8);
 253
 254int diag204(unsigned long subcode, unsigned long size, void *addr);
 255int diag224(void *ptr);
 256int diag26c(void *req, void *resp, enum diag26c_sc subcode);
 257#endif /* _ASM_S390_DIAG_H */
 258