xref: /openbmc/qemu/include/hw/s390x/s390-pci-clp.h (revision 9c092804)
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