1c04274f4SPierre Morel /* 2c04274f4SPierre Morel * s390 CLP instruction definitions 3c04274f4SPierre Morel * 4c04274f4SPierre Morel * Copyright 2019 IBM Corp. 5c04274f4SPierre Morel * Author(s): Pierre Morel <pmorel@de.ibm.com> 6c04274f4SPierre Morel * 7c04274f4SPierre Morel * This work is licensed under the terms of the GNU GPL, version 2 or (at 8c04274f4SPierre Morel * your option) any later version. See the COPYING file in the top-level 9c04274f4SPierre Morel * directory. 10c04274f4SPierre Morel */ 11c04274f4SPierre Morel 12*9c092804SMarkus Armbruster #ifndef HW_S390_PCI_CLP_H 13*9c092804SMarkus Armbruster #define HW_S390_PCI_CLP_H 14c04274f4SPierre Morel 15c04274f4SPierre Morel /* CLP common request & response block size */ 16c04274f4SPierre Morel #define CLP_BLK_SIZE 4096 17c04274f4SPierre Morel #define PCI_BAR_COUNT 6 18c04274f4SPierre Morel #define PCI_MAX_FUNCTIONS 4096 19c04274f4SPierre Morel 20c04274f4SPierre Morel typedef struct ClpReqHdr { 21c04274f4SPierre Morel uint16_t len; 22c04274f4SPierre Morel uint16_t cmd; 23c04274f4SPierre Morel } QEMU_PACKED ClpReqHdr; 24c04274f4SPierre Morel 25c04274f4SPierre Morel typedef struct ClpRspHdr { 26c04274f4SPierre Morel uint16_t len; 27c04274f4SPierre Morel uint16_t rsp; 28c04274f4SPierre Morel } QEMU_PACKED ClpRspHdr; 29c04274f4SPierre Morel 30c04274f4SPierre Morel /* CLP Response Codes */ 31c04274f4SPierre Morel #define CLP_RC_OK 0x0010 /* Command request successfully */ 32c04274f4SPierre Morel #define CLP_RC_CMD 0x0020 /* Command code not recognized */ 33c04274f4SPierre Morel #define CLP_RC_PERM 0x0030 /* Command not authorized */ 34c04274f4SPierre Morel #define CLP_RC_FMT 0x0040 /* Invalid command request format */ 35c04274f4SPierre Morel #define CLP_RC_LEN 0x0050 /* Invalid command request length */ 36c04274f4SPierre Morel #define CLP_RC_8K 0x0060 /* Command requires 8K LPCB */ 37c04274f4SPierre Morel #define CLP_RC_RESNOT0 0x0070 /* Reserved field not zero */ 38c04274f4SPierre Morel #define CLP_RC_NODATA 0x0080 /* No data available */ 39c04274f4SPierre Morel #define CLP_RC_FC_UNKNOWN 0x0100 /* Function code not recognized */ 40c04274f4SPierre Morel 41c04274f4SPierre Morel /* 42c04274f4SPierre Morel * Call Logical Processor - Command Codes 43c04274f4SPierre Morel */ 44c04274f4SPierre Morel #define CLP_LIST_PCI 0x0002 45c04274f4SPierre Morel #define CLP_QUERY_PCI_FN 0x0003 46c04274f4SPierre Morel #define CLP_QUERY_PCI_FNGRP 0x0004 47c04274f4SPierre Morel #define CLP_SET_PCI_FN 0x0005 48c04274f4SPierre Morel 49c04274f4SPierre Morel /* PCI function handle list entry */ 50c04274f4SPierre Morel typedef struct ClpFhListEntry { 51c04274f4SPierre Morel uint16_t device_id; 52c04274f4SPierre Morel uint16_t vendor_id; 53c04274f4SPierre Morel #define CLP_FHLIST_MASK_CONFIG 0x80000000 54c04274f4SPierre Morel uint32_t config; 55c04274f4SPierre Morel uint32_t fid; 56c04274f4SPierre Morel uint32_t fh; 57c04274f4SPierre Morel } QEMU_PACKED ClpFhListEntry; 58c04274f4SPierre Morel 59c04274f4SPierre Morel #define CLP_RC_SETPCIFN_FH 0x0101 /* Invalid PCI fn handle */ 60c04274f4SPierre Morel #define CLP_RC_SETPCIFN_FHOP 0x0102 /* Fn handle not valid for op */ 61c04274f4SPierre Morel #define CLP_RC_SETPCIFN_DMAAS 0x0103 /* Invalid DMA addr space */ 62c04274f4SPierre Morel #define CLP_RC_SETPCIFN_RES 0x0104 /* Insufficient resources */ 63c04274f4SPierre Morel #define CLP_RC_SETPCIFN_ALRDY 0x0105 /* Fn already in requested state */ 64c04274f4SPierre Morel #define CLP_RC_SETPCIFN_ERR 0x0106 /* Fn in permanent error state */ 65c04274f4SPierre Morel #define CLP_RC_SETPCIFN_RECPND 0x0107 /* Error recovery pending */ 66c04274f4SPierre Morel #define CLP_RC_SETPCIFN_BUSY 0x0108 /* Fn busy */ 67c04274f4SPierre Morel #define CLP_RC_LISTPCI_BADRT 0x010a /* Resume token not recognized */ 68c04274f4SPierre Morel #define CLP_RC_QUERYPCIFG_PFGID 0x010b /* Unrecognized PFGID */ 69c04274f4SPierre Morel 70c04274f4SPierre Morel /* request or response block header length */ 71c04274f4SPierre Morel #define LIST_PCI_HDR_LEN 32 72c04274f4SPierre Morel 73c04274f4SPierre Morel /* Number of function handles fitting in response block */ 74c04274f4SPierre Morel #define CLP_FH_LIST_NR_ENTRIES \ 75c04274f4SPierre Morel ((CLP_BLK_SIZE - 2 * LIST_PCI_HDR_LEN) \ 76c04274f4SPierre Morel / sizeof(ClpFhListEntry)) 77c04274f4SPierre Morel 78c04274f4SPierre Morel #define CLP_SET_ENABLE_PCI_FN 0 /* Yes, 0 enables it */ 79c04274f4SPierre Morel #define CLP_SET_DISABLE_PCI_FN 1 /* Yes, 1 disables it */ 80c04274f4SPierre Morel 81c04274f4SPierre Morel #define CLP_UTIL_STR_LEN 64 821e7552ffSMatthew Rosato #define CLP_PFIP_NR_SEGMENTS 4 83c04274f4SPierre Morel 84c04274f4SPierre Morel #define CLP_MASK_FMT 0xf0000000 85c04274f4SPierre Morel 86c04274f4SPierre Morel /* List PCI functions request */ 87c04274f4SPierre Morel typedef struct ClpReqListPci { 88c04274f4SPierre Morel ClpReqHdr hdr; 89c04274f4SPierre Morel uint32_t fmt; 90c04274f4SPierre Morel uint64_t reserved1; 91c04274f4SPierre Morel uint64_t resume_token; 92c04274f4SPierre Morel uint64_t reserved2; 93c04274f4SPierre Morel } QEMU_PACKED ClpReqListPci; 94c04274f4SPierre Morel 95c04274f4SPierre Morel /* List PCI functions response */ 96c04274f4SPierre Morel typedef struct ClpRspListPci { 97c04274f4SPierre Morel ClpRspHdr hdr; 98c04274f4SPierre Morel uint32_t fmt; 99c04274f4SPierre Morel uint64_t reserved1; 100c04274f4SPierre Morel uint64_t resume_token; 101c04274f4SPierre Morel uint32_t mdd; 102c04274f4SPierre Morel uint16_t max_fn; 103c04274f4SPierre Morel uint8_t flags; 104c04274f4SPierre Morel uint8_t entry_size; 105c04274f4SPierre Morel ClpFhListEntry fh_list[CLP_FH_LIST_NR_ENTRIES]; 106c04274f4SPierre Morel } QEMU_PACKED ClpRspListPci; 107c04274f4SPierre Morel 108c04274f4SPierre Morel /* Query PCI function request */ 109c04274f4SPierre Morel typedef struct ClpReqQueryPci { 110c04274f4SPierre Morel ClpReqHdr hdr; 111c04274f4SPierre Morel uint32_t fmt; 112c04274f4SPierre Morel uint64_t reserved1; 113c04274f4SPierre Morel uint32_t fh; /* function handle */ 114c04274f4SPierre Morel uint32_t reserved2; 115c04274f4SPierre Morel uint64_t reserved3; 116c04274f4SPierre Morel } QEMU_PACKED ClpReqQueryPci; 117c04274f4SPierre Morel 118c04274f4SPierre Morel /* Query PCI function response */ 119c04274f4SPierre Morel typedef struct ClpRspQueryPci { 120c04274f4SPierre Morel ClpRspHdr hdr; 121c04274f4SPierre Morel uint32_t fmt; 122c04274f4SPierre Morel uint64_t reserved1; 123c04274f4SPierre Morel uint16_t vfn; /* virtual fn number */ 1241e7552ffSMatthew Rosato #define CLP_RSP_QPCI_MASK_UTIL 0x01 1251e7552ffSMatthew Rosato uint8_t flags; 1261e7552ffSMatthew Rosato uint8_t pfgid; 127c04274f4SPierre Morel uint32_t fid; /* pci function id */ 128c04274f4SPierre Morel uint8_t bar_size[PCI_BAR_COUNT]; 129c04274f4SPierre Morel uint16_t pchid; 130c04274f4SPierre Morel uint32_t bar[PCI_BAR_COUNT]; 1311e7552ffSMatthew Rosato uint8_t pfip[CLP_PFIP_NR_SEGMENTS]; 1321e7552ffSMatthew Rosato uint16_t reserved2; 1331e7552ffSMatthew Rosato uint8_t fmbl; 1341e7552ffSMatthew Rosato uint8_t pft; 135c04274f4SPierre Morel uint64_t sdma; /* start dma as */ 136c04274f4SPierre Morel uint64_t edma; /* end dma as */ 137c04274f4SPierre Morel uint32_t reserved3[11]; 138c04274f4SPierre Morel uint32_t uid; 139c04274f4SPierre Morel uint8_t util_str[CLP_UTIL_STR_LEN]; /* utility string */ 140c04274f4SPierre Morel } QEMU_PACKED ClpRspQueryPci; 141c04274f4SPierre Morel 142c04274f4SPierre Morel /* Query PCI function group request */ 143c04274f4SPierre Morel typedef struct ClpReqQueryPciGrp { 144c04274f4SPierre Morel ClpReqHdr hdr; 145c04274f4SPierre Morel uint32_t fmt; 146c04274f4SPierre Morel uint64_t reserved1; 147a4e2fff1SCornelia Huck uint8_t reserved2[3]; 148a4e2fff1SCornelia Huck uint8_t g; 149a4e2fff1SCornelia Huck uint32_t reserved3; 150a4e2fff1SCornelia Huck uint64_t reserved4; 151c04274f4SPierre Morel } QEMU_PACKED ClpReqQueryPciGrp; 152c04274f4SPierre Morel 153c04274f4SPierre Morel /* Query PCI function group response */ 154c04274f4SPierre Morel typedef struct ClpRspQueryPciGrp { 155c04274f4SPierre Morel ClpRspHdr hdr; 156c04274f4SPierre Morel uint32_t fmt; 157c04274f4SPierre Morel uint64_t reserved1; 158c04274f4SPierre Morel #define CLP_RSP_QPCIG_MASK_NOI 0xfff 159c04274f4SPierre Morel uint16_t i; 160c04274f4SPierre Morel uint8_t version; 161c04274f4SPierre Morel #define CLP_RSP_QPCIG_MASK_FRAME 0x2 162c04274f4SPierre Morel #define CLP_RSP_QPCIG_MASK_REFRESH 0x1 163c04274f4SPierre Morel uint8_t fr; 164c04274f4SPierre Morel uint16_t maxstbl; 165c04274f4SPierre Morel uint16_t mui; 166ac6aa30aSMatthew Rosato uint8_t dtsm; 167ac6aa30aSMatthew Rosato uint8_t reserved3[7]; 168c04274f4SPierre Morel uint64_t dasm; /* dma address space mask */ 169c04274f4SPierre Morel uint64_t msia; /* MSI address */ 170c04274f4SPierre Morel uint64_t reserved4; 171c04274f4SPierre Morel uint64_t reserved5; 172c04274f4SPierre Morel } QEMU_PACKED ClpRspQueryPciGrp; 173c04274f4SPierre Morel 174c04274f4SPierre Morel /* Set PCI function request */ 175c04274f4SPierre Morel typedef struct ClpReqSetPci { 176c04274f4SPierre Morel ClpReqHdr hdr; 177c04274f4SPierre Morel uint32_t fmt; 178c04274f4SPierre Morel uint64_t reserved1; 179c04274f4SPierre Morel uint32_t fh; /* function handle */ 180c04274f4SPierre Morel uint16_t reserved2; 181c04274f4SPierre Morel uint8_t oc; /* operation controls */ 182c04274f4SPierre Morel uint8_t ndas; /* number of dma spaces */ 183c04274f4SPierre Morel uint64_t reserved3; 184c04274f4SPierre Morel } QEMU_PACKED ClpReqSetPci; 185c04274f4SPierre Morel 186c04274f4SPierre Morel /* Set PCI function response */ 187c04274f4SPierre Morel typedef struct ClpRspSetPci { 188c04274f4SPierre Morel ClpRspHdr hdr; 189c04274f4SPierre Morel uint32_t fmt; 190c04274f4SPierre Morel uint64_t reserved1; 191c04274f4SPierre Morel uint32_t fh; /* function handle */ 192c04274f4SPierre Morel uint32_t reserved3; 193c04274f4SPierre Morel uint64_t reserved4; 194c04274f4SPierre Morel } QEMU_PACKED ClpRspSetPci; 195c04274f4SPierre Morel 196c04274f4SPierre Morel typedef struct ClpReqRspListPci { 197c04274f4SPierre Morel ClpReqListPci request; 198c04274f4SPierre Morel ClpRspListPci response; 199c04274f4SPierre Morel } QEMU_PACKED ClpReqRspListPci; 200c04274f4SPierre Morel 201c04274f4SPierre Morel typedef struct ClpReqRspSetPci { 202c04274f4SPierre Morel ClpReqSetPci request; 203c04274f4SPierre Morel ClpRspSetPci response; 204c04274f4SPierre Morel } QEMU_PACKED ClpReqRspSetPci; 205c04274f4SPierre Morel 206c04274f4SPierre Morel typedef struct ClpReqRspQueryPci { 207c04274f4SPierre Morel ClpReqQueryPci request; 208c04274f4SPierre Morel ClpRspQueryPci response; 209c04274f4SPierre Morel } QEMU_PACKED ClpReqRspQueryPci; 210c04274f4SPierre Morel 211c04274f4SPierre Morel typedef struct ClpReqRspQueryPciGrp { 212c04274f4SPierre Morel ClpReqQueryPciGrp request; 213c04274f4SPierre Morel ClpRspQueryPciGrp response; 214c04274f4SPierre Morel } QEMU_PACKED ClpReqRspQueryPciGrp; 215c04274f4SPierre Morel 216c04274f4SPierre Morel #endif 217