162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci#ifndef __CRB_H 362306a36Sopenharmony_ci#define __CRB_H 462306a36Sopenharmony_ci#include <linux/types.h> 562306a36Sopenharmony_ci#include "nx.h" 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci/* CCW 842 CI/FC masks 862306a36Sopenharmony_ci * NX P8 workbook, section 4.3.1, figure 4-6 962306a36Sopenharmony_ci * "CI/FC Boundary by NX CT type" 1062306a36Sopenharmony_ci */ 1162306a36Sopenharmony_ci#define CCW_CI_842 (0x00003ff8) 1262306a36Sopenharmony_ci#define CCW_FC_842 (0x00000007) 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci/* Chapter 6.5.8 Coprocessor-Completion Block (CCB) */ 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci#define CCB_VALUE (0x3fffffffffffffff) 1762306a36Sopenharmony_ci#define CCB_ADDRESS (0xfffffffffffffff8) 1862306a36Sopenharmony_ci#define CCB_CM (0x0000000000000007) 1962306a36Sopenharmony_ci#define CCB_CM0 (0x0000000000000004) 2062306a36Sopenharmony_ci#define CCB_CM12 (0x0000000000000003) 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci#define CCB_CM0_ALL_COMPLETIONS (0x0) 2362306a36Sopenharmony_ci#define CCB_CM0_LAST_IN_CHAIN (0x4) 2462306a36Sopenharmony_ci#define CCB_CM12_STORE (0x0) 2562306a36Sopenharmony_ci#define CCB_CM12_INTERRUPT (0x1) 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci#define CCB_SIZE (0x10) 2862306a36Sopenharmony_ci#define CCB_ALIGN CCB_SIZE 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_cistruct coprocessor_completion_block { 3162306a36Sopenharmony_ci __be64 value; 3262306a36Sopenharmony_ci __be64 address; 3362306a36Sopenharmony_ci} __aligned(CCB_ALIGN); 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci/* Chapter 6.5.7 Coprocessor-Status Block (CSB) */ 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci#define CSB_V (0x80) 3962306a36Sopenharmony_ci#define CSB_F (0x04) 4062306a36Sopenharmony_ci#define CSB_CH (0x03) 4162306a36Sopenharmony_ci#define CSB_CE_INCOMPLETE (0x80) 4262306a36Sopenharmony_ci#define CSB_CE_TERMINATION (0x40) 4362306a36Sopenharmony_ci#define CSB_CE_TPBC (0x20) 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci#define CSB_CC_SUCCESS (0) 4662306a36Sopenharmony_ci#define CSB_CC_INVALID_ALIGN (1) 4762306a36Sopenharmony_ci#define CSB_CC_OPERAND_OVERLAP (2) 4862306a36Sopenharmony_ci#define CSB_CC_DATA_LENGTH (3) 4962306a36Sopenharmony_ci#define CSB_CC_TRANSLATION (5) 5062306a36Sopenharmony_ci#define CSB_CC_PROTECTION (6) 5162306a36Sopenharmony_ci#define CSB_CC_RD_EXTERNAL (7) 5262306a36Sopenharmony_ci#define CSB_CC_INVALID_OPERAND (8) 5362306a36Sopenharmony_ci#define CSB_CC_PRIVILEGE (9) 5462306a36Sopenharmony_ci#define CSB_CC_INTERNAL (10) 5562306a36Sopenharmony_ci#define CSB_CC_WR_EXTERNAL (12) 5662306a36Sopenharmony_ci#define CSB_CC_NOSPC (13) 5762306a36Sopenharmony_ci#define CSB_CC_EXCESSIVE_DDE (14) 5862306a36Sopenharmony_ci#define CSB_CC_WR_TRANSLATION (15) 5962306a36Sopenharmony_ci#define CSB_CC_WR_PROTECTION (16) 6062306a36Sopenharmony_ci#define CSB_CC_UNKNOWN_CODE (17) 6162306a36Sopenharmony_ci#define CSB_CC_ABORT (18) 6262306a36Sopenharmony_ci#define CSB_CC_TRANSPORT (20) 6362306a36Sopenharmony_ci#define CSB_CC_SEGMENTED_DDL (31) 6462306a36Sopenharmony_ci#define CSB_CC_PROGRESS_POINT (32) 6562306a36Sopenharmony_ci#define CSB_CC_DDE_OVERFLOW (33) 6662306a36Sopenharmony_ci#define CSB_CC_SESSION (34) 6762306a36Sopenharmony_ci#define CSB_CC_PROVISION (36) 6862306a36Sopenharmony_ci#define CSB_CC_CHAIN (37) 6962306a36Sopenharmony_ci#define CSB_CC_SEQUENCE (38) 7062306a36Sopenharmony_ci#define CSB_CC_HW (39) 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci#define CSB_SIZE (0x10) 7362306a36Sopenharmony_ci#define CSB_ALIGN CSB_SIZE 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_cistruct coprocessor_status_block { 7662306a36Sopenharmony_ci __u8 flags; 7762306a36Sopenharmony_ci __u8 cs; 7862306a36Sopenharmony_ci __u8 cc; 7962306a36Sopenharmony_ci __u8 ce; 8062306a36Sopenharmony_ci __be32 count; 8162306a36Sopenharmony_ci __be64 address; 8262306a36Sopenharmony_ci} __aligned(CSB_ALIGN); 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci/* Chapter 6.5.10 Data-Descriptor List (DDL) 8662306a36Sopenharmony_ci * each list contains one or more Data-Descriptor Entries (DDE) 8762306a36Sopenharmony_ci */ 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_ci#define DDE_P (0x8000) 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ci#define DDE_SIZE (0x10) 9262306a36Sopenharmony_ci#define DDE_ALIGN DDE_SIZE 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_cistruct data_descriptor_entry { 9562306a36Sopenharmony_ci __be16 flags; 9662306a36Sopenharmony_ci __u8 count; 9762306a36Sopenharmony_ci __u8 index; 9862306a36Sopenharmony_ci __be32 length; 9962306a36Sopenharmony_ci __be64 address; 10062306a36Sopenharmony_ci} __aligned(DDE_ALIGN); 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_ci/* Chapter 6.5.2 Coprocessor-Request Block (CRB) */ 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_ci#define CRB_SIZE (0x80) 10662306a36Sopenharmony_ci#define CRB_ALIGN (0x100) /* Errata: requires 256 alignment */ 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_ci/* Coprocessor Status Block field 11062306a36Sopenharmony_ci * ADDRESS address of CSB 11162306a36Sopenharmony_ci * C CCB is valid 11262306a36Sopenharmony_ci * AT 0 = addrs are virtual, 1 = addrs are phys 11362306a36Sopenharmony_ci * M enable perf monitor 11462306a36Sopenharmony_ci */ 11562306a36Sopenharmony_ci#define CRB_CSB_ADDRESS (0xfffffffffffffff0) 11662306a36Sopenharmony_ci#define CRB_CSB_C (0x0000000000000008) 11762306a36Sopenharmony_ci#define CRB_CSB_AT (0x0000000000000002) 11862306a36Sopenharmony_ci#define CRB_CSB_M (0x0000000000000001) 11962306a36Sopenharmony_ci 12062306a36Sopenharmony_cistruct coprocessor_request_block { 12162306a36Sopenharmony_ci __be32 ccw; 12262306a36Sopenharmony_ci __be32 flags; 12362306a36Sopenharmony_ci __be64 csb_addr; 12462306a36Sopenharmony_ci 12562306a36Sopenharmony_ci struct data_descriptor_entry source; 12662306a36Sopenharmony_ci struct data_descriptor_entry target; 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_ci struct coprocessor_completion_block ccb; 12962306a36Sopenharmony_ci 13062306a36Sopenharmony_ci __u8 reserved[48]; 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_ci struct coprocessor_status_block csb; 13362306a36Sopenharmony_ci} __aligned(CRB_ALIGN); 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_ci#define crb_csb_addr(c) __be64_to_cpu(c->csb_addr) 13662306a36Sopenharmony_ci#define crb_nx_fault_addr(c) __be64_to_cpu(c->stamp.nx.fault_storage_addr) 13762306a36Sopenharmony_ci#define crb_nx_flags(c) c->stamp.nx.flags 13862306a36Sopenharmony_ci#define crb_nx_fault_status(c) c->stamp.nx.fault_status 13962306a36Sopenharmony_ci#define crb_nx_pswid(c) c->stamp.nx.pswid 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_ci 14262306a36Sopenharmony_ci/* RFC02167 Initiate Coprocessor Instructions document 14362306a36Sopenharmony_ci * Chapter 8.2.1.1.1 RS 14462306a36Sopenharmony_ci * Chapter 8.2.3 Coprocessor Directive 14562306a36Sopenharmony_ci * Chapter 8.2.4 Execution 14662306a36Sopenharmony_ci * 14762306a36Sopenharmony_ci * The CCW must be converted to BE before passing to icswx() 14862306a36Sopenharmony_ci */ 14962306a36Sopenharmony_ci 15062306a36Sopenharmony_ci#define CCW_PS (0xff000000) 15162306a36Sopenharmony_ci#define CCW_CT (0x00ff0000) 15262306a36Sopenharmony_ci#define CCW_CD (0x0000ffff) 15362306a36Sopenharmony_ci#define CCW_CL (0x0000c000) 15462306a36Sopenharmony_ci 15562306a36Sopenharmony_ci#endif 156