1*d53979b5SRaphael Moreira Zinsly /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*d53979b5SRaphael Moreira Zinsly #ifndef __CRB_H 3*d53979b5SRaphael Moreira Zinsly #define __CRB_H 4*d53979b5SRaphael Moreira Zinsly #include <linux/types.h> 5*d53979b5SRaphael Moreira Zinsly #include "nx.h" 6*d53979b5SRaphael Moreira Zinsly 7*d53979b5SRaphael Moreira Zinsly /* CCW 842 CI/FC masks 8*d53979b5SRaphael Moreira Zinsly * NX P8 workbook, section 4.3.1, figure 4-6 9*d53979b5SRaphael Moreira Zinsly * "CI/FC Boundary by NX CT type" 10*d53979b5SRaphael Moreira Zinsly */ 11*d53979b5SRaphael Moreira Zinsly #define CCW_CI_842 (0x00003ff8) 12*d53979b5SRaphael Moreira Zinsly #define CCW_FC_842 (0x00000007) 13*d53979b5SRaphael Moreira Zinsly 14*d53979b5SRaphael Moreira Zinsly /* Chapter 6.5.8 Coprocessor-Completion Block (CCB) */ 15*d53979b5SRaphael Moreira Zinsly 16*d53979b5SRaphael Moreira Zinsly #define CCB_VALUE (0x3fffffffffffffff) 17*d53979b5SRaphael Moreira Zinsly #define CCB_ADDRESS (0xfffffffffffffff8) 18*d53979b5SRaphael Moreira Zinsly #define CCB_CM (0x0000000000000007) 19*d53979b5SRaphael Moreira Zinsly #define CCB_CM0 (0x0000000000000004) 20*d53979b5SRaphael Moreira Zinsly #define CCB_CM12 (0x0000000000000003) 21*d53979b5SRaphael Moreira Zinsly 22*d53979b5SRaphael Moreira Zinsly #define CCB_CM0_ALL_COMPLETIONS (0x0) 23*d53979b5SRaphael Moreira Zinsly #define CCB_CM0_LAST_IN_CHAIN (0x4) 24*d53979b5SRaphael Moreira Zinsly #define CCB_CM12_STORE (0x0) 25*d53979b5SRaphael Moreira Zinsly #define CCB_CM12_INTERRUPT (0x1) 26*d53979b5SRaphael Moreira Zinsly 27*d53979b5SRaphael Moreira Zinsly #define CCB_SIZE (0x10) 28*d53979b5SRaphael Moreira Zinsly #define CCB_ALIGN CCB_SIZE 29*d53979b5SRaphael Moreira Zinsly 30*d53979b5SRaphael Moreira Zinsly struct coprocessor_completion_block { 31*d53979b5SRaphael Moreira Zinsly __be64 value; 32*d53979b5SRaphael Moreira Zinsly __be64 address; 33*d53979b5SRaphael Moreira Zinsly } __aligned(CCB_ALIGN); 34*d53979b5SRaphael Moreira Zinsly 35*d53979b5SRaphael Moreira Zinsly 36*d53979b5SRaphael Moreira Zinsly /* Chapter 6.5.7 Coprocessor-Status Block (CSB) */ 37*d53979b5SRaphael Moreira Zinsly 38*d53979b5SRaphael Moreira Zinsly #define CSB_V (0x80) 39*d53979b5SRaphael Moreira Zinsly #define CSB_F (0x04) 40*d53979b5SRaphael Moreira Zinsly #define CSB_CH (0x03) 41*d53979b5SRaphael Moreira Zinsly #define CSB_CE_INCOMPLETE (0x80) 42*d53979b5SRaphael Moreira Zinsly #define CSB_CE_TERMINATION (0x40) 43*d53979b5SRaphael Moreira Zinsly #define CSB_CE_TPBC (0x20) 44*d53979b5SRaphael Moreira Zinsly 45*d53979b5SRaphael Moreira Zinsly #define CSB_CC_SUCCESS (0) 46*d53979b5SRaphael Moreira Zinsly #define CSB_CC_INVALID_ALIGN (1) 47*d53979b5SRaphael Moreira Zinsly #define CSB_CC_OPERAND_OVERLAP (2) 48*d53979b5SRaphael Moreira Zinsly #define CSB_CC_DATA_LENGTH (3) 49*d53979b5SRaphael Moreira Zinsly #define CSB_CC_TRANSLATION (5) 50*d53979b5SRaphael Moreira Zinsly #define CSB_CC_PROTECTION (6) 51*d53979b5SRaphael Moreira Zinsly #define CSB_CC_RD_EXTERNAL (7) 52*d53979b5SRaphael Moreira Zinsly #define CSB_CC_INVALID_OPERAND (8) 53*d53979b5SRaphael Moreira Zinsly #define CSB_CC_PRIVILEGE (9) 54*d53979b5SRaphael Moreira Zinsly #define CSB_CC_INTERNAL (10) 55*d53979b5SRaphael Moreira Zinsly #define CSB_CC_WR_EXTERNAL (12) 56*d53979b5SRaphael Moreira Zinsly #define CSB_CC_NOSPC (13) 57*d53979b5SRaphael Moreira Zinsly #define CSB_CC_EXCESSIVE_DDE (14) 58*d53979b5SRaphael Moreira Zinsly #define CSB_CC_WR_TRANSLATION (15) 59*d53979b5SRaphael Moreira Zinsly #define CSB_CC_WR_PROTECTION (16) 60*d53979b5SRaphael Moreira Zinsly #define CSB_CC_UNKNOWN_CODE (17) 61*d53979b5SRaphael Moreira Zinsly #define CSB_CC_ABORT (18) 62*d53979b5SRaphael Moreira Zinsly #define CSB_CC_TRANSPORT (20) 63*d53979b5SRaphael Moreira Zinsly #define CSB_CC_SEGMENTED_DDL (31) 64*d53979b5SRaphael Moreira Zinsly #define CSB_CC_PROGRESS_POINT (32) 65*d53979b5SRaphael Moreira Zinsly #define CSB_CC_DDE_OVERFLOW (33) 66*d53979b5SRaphael Moreira Zinsly #define CSB_CC_SESSION (34) 67*d53979b5SRaphael Moreira Zinsly #define CSB_CC_PROVISION (36) 68*d53979b5SRaphael Moreira Zinsly #define CSB_CC_CHAIN (37) 69*d53979b5SRaphael Moreira Zinsly #define CSB_CC_SEQUENCE (38) 70*d53979b5SRaphael Moreira Zinsly #define CSB_CC_HW (39) 71*d53979b5SRaphael Moreira Zinsly 72*d53979b5SRaphael Moreira Zinsly #define CSB_SIZE (0x10) 73*d53979b5SRaphael Moreira Zinsly #define CSB_ALIGN CSB_SIZE 74*d53979b5SRaphael Moreira Zinsly 75*d53979b5SRaphael Moreira Zinsly struct coprocessor_status_block { 76*d53979b5SRaphael Moreira Zinsly __u8 flags; 77*d53979b5SRaphael Moreira Zinsly __u8 cs; 78*d53979b5SRaphael Moreira Zinsly __u8 cc; 79*d53979b5SRaphael Moreira Zinsly __u8 ce; 80*d53979b5SRaphael Moreira Zinsly __be32 count; 81*d53979b5SRaphael Moreira Zinsly __be64 address; 82*d53979b5SRaphael Moreira Zinsly } __aligned(CSB_ALIGN); 83*d53979b5SRaphael Moreira Zinsly 84*d53979b5SRaphael Moreira Zinsly 85*d53979b5SRaphael Moreira Zinsly /* Chapter 6.5.10 Data-Descriptor List (DDL) 86*d53979b5SRaphael Moreira Zinsly * each list contains one or more Data-Descriptor Entries (DDE) 87*d53979b5SRaphael Moreira Zinsly */ 88*d53979b5SRaphael Moreira Zinsly 89*d53979b5SRaphael Moreira Zinsly #define DDE_P (0x8000) 90*d53979b5SRaphael Moreira Zinsly 91*d53979b5SRaphael Moreira Zinsly #define DDE_SIZE (0x10) 92*d53979b5SRaphael Moreira Zinsly #define DDE_ALIGN DDE_SIZE 93*d53979b5SRaphael Moreira Zinsly 94*d53979b5SRaphael Moreira Zinsly struct data_descriptor_entry { 95*d53979b5SRaphael Moreira Zinsly __be16 flags; 96*d53979b5SRaphael Moreira Zinsly __u8 count; 97*d53979b5SRaphael Moreira Zinsly __u8 index; 98*d53979b5SRaphael Moreira Zinsly __be32 length; 99*d53979b5SRaphael Moreira Zinsly __be64 address; 100*d53979b5SRaphael Moreira Zinsly } __aligned(DDE_ALIGN); 101*d53979b5SRaphael Moreira Zinsly 102*d53979b5SRaphael Moreira Zinsly 103*d53979b5SRaphael Moreira Zinsly /* Chapter 6.5.2 Coprocessor-Request Block (CRB) */ 104*d53979b5SRaphael Moreira Zinsly 105*d53979b5SRaphael Moreira Zinsly #define CRB_SIZE (0x80) 106*d53979b5SRaphael Moreira Zinsly #define CRB_ALIGN (0x100) /* Errata: requires 256 alignment */ 107*d53979b5SRaphael Moreira Zinsly 108*d53979b5SRaphael Moreira Zinsly 109*d53979b5SRaphael Moreira Zinsly /* Coprocessor Status Block field 110*d53979b5SRaphael Moreira Zinsly * ADDRESS address of CSB 111*d53979b5SRaphael Moreira Zinsly * C CCB is valid 112*d53979b5SRaphael Moreira Zinsly * AT 0 = addrs are virtual, 1 = addrs are phys 113*d53979b5SRaphael Moreira Zinsly * M enable perf monitor 114*d53979b5SRaphael Moreira Zinsly */ 115*d53979b5SRaphael Moreira Zinsly #define CRB_CSB_ADDRESS (0xfffffffffffffff0) 116*d53979b5SRaphael Moreira Zinsly #define CRB_CSB_C (0x0000000000000008) 117*d53979b5SRaphael Moreira Zinsly #define CRB_CSB_AT (0x0000000000000002) 118*d53979b5SRaphael Moreira Zinsly #define CRB_CSB_M (0x0000000000000001) 119*d53979b5SRaphael Moreira Zinsly 120*d53979b5SRaphael Moreira Zinsly struct coprocessor_request_block { 121*d53979b5SRaphael Moreira Zinsly __be32 ccw; 122*d53979b5SRaphael Moreira Zinsly __be32 flags; 123*d53979b5SRaphael Moreira Zinsly __be64 csb_addr; 124*d53979b5SRaphael Moreira Zinsly 125*d53979b5SRaphael Moreira Zinsly struct data_descriptor_entry source; 126*d53979b5SRaphael Moreira Zinsly struct data_descriptor_entry target; 127*d53979b5SRaphael Moreira Zinsly 128*d53979b5SRaphael Moreira Zinsly struct coprocessor_completion_block ccb; 129*d53979b5SRaphael Moreira Zinsly 130*d53979b5SRaphael Moreira Zinsly __u8 reserved[48]; 131*d53979b5SRaphael Moreira Zinsly 132*d53979b5SRaphael Moreira Zinsly struct coprocessor_status_block csb; 133*d53979b5SRaphael Moreira Zinsly } __aligned(CRB_ALIGN); 134*d53979b5SRaphael Moreira Zinsly 135*d53979b5SRaphael Moreira Zinsly #define crb_csb_addr(c) __be64_to_cpu(c->csb_addr) 136*d53979b5SRaphael Moreira Zinsly #define crb_nx_fault_addr(c) __be64_to_cpu(c->stamp.nx.fault_storage_addr) 137*d53979b5SRaphael Moreira Zinsly #define crb_nx_flags(c) c->stamp.nx.flags 138*d53979b5SRaphael Moreira Zinsly #define crb_nx_fault_status(c) c->stamp.nx.fault_status 139*d53979b5SRaphael Moreira Zinsly #define crb_nx_pswid(c) c->stamp.nx.pswid 140*d53979b5SRaphael Moreira Zinsly 141*d53979b5SRaphael Moreira Zinsly 142*d53979b5SRaphael Moreira Zinsly /* RFC02167 Initiate Coprocessor Instructions document 143*d53979b5SRaphael Moreira Zinsly * Chapter 8.2.1.1.1 RS 144*d53979b5SRaphael Moreira Zinsly * Chapter 8.2.3 Coprocessor Directive 145*d53979b5SRaphael Moreira Zinsly * Chapter 8.2.4 Execution 146*d53979b5SRaphael Moreira Zinsly * 147*d53979b5SRaphael Moreira Zinsly * The CCW must be converted to BE before passing to icswx() 148*d53979b5SRaphael Moreira Zinsly */ 149*d53979b5SRaphael Moreira Zinsly 150*d53979b5SRaphael Moreira Zinsly #define CCW_PS (0xff000000) 151*d53979b5SRaphael Moreira Zinsly #define CCW_CT (0x00ff0000) 152*d53979b5SRaphael Moreira Zinsly #define CCW_CD (0x0000ffff) 153*d53979b5SRaphael Moreira Zinsly #define CCW_CL (0x0000c000) 154*d53979b5SRaphael Moreira Zinsly 155*d53979b5SRaphael Moreira Zinsly #endif 156