18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 28c2ecf20Sopenharmony_ci#ifndef __CRB_H 38c2ecf20Sopenharmony_ci#define __CRB_H 48c2ecf20Sopenharmony_ci#include <linux/types.h> 58c2ecf20Sopenharmony_ci#include "nx.h" 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_ci/* CCW 842 CI/FC masks 88c2ecf20Sopenharmony_ci * NX P8 workbook, section 4.3.1, figure 4-6 98c2ecf20Sopenharmony_ci * "CI/FC Boundary by NX CT type" 108c2ecf20Sopenharmony_ci */ 118c2ecf20Sopenharmony_ci#define CCW_CI_842 (0x00003ff8) 128c2ecf20Sopenharmony_ci#define CCW_FC_842 (0x00000007) 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_ci/* Chapter 6.5.8 Coprocessor-Completion Block (CCB) */ 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_ci#define CCB_VALUE (0x3fffffffffffffff) 178c2ecf20Sopenharmony_ci#define CCB_ADDRESS (0xfffffffffffffff8) 188c2ecf20Sopenharmony_ci#define CCB_CM (0x0000000000000007) 198c2ecf20Sopenharmony_ci#define CCB_CM0 (0x0000000000000004) 208c2ecf20Sopenharmony_ci#define CCB_CM12 (0x0000000000000003) 218c2ecf20Sopenharmony_ci 228c2ecf20Sopenharmony_ci#define CCB_CM0_ALL_COMPLETIONS (0x0) 238c2ecf20Sopenharmony_ci#define CCB_CM0_LAST_IN_CHAIN (0x4) 248c2ecf20Sopenharmony_ci#define CCB_CM12_STORE (0x0) 258c2ecf20Sopenharmony_ci#define CCB_CM12_INTERRUPT (0x1) 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_ci#define CCB_SIZE (0x10) 288c2ecf20Sopenharmony_ci#define CCB_ALIGN CCB_SIZE 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_cistruct coprocessor_completion_block { 318c2ecf20Sopenharmony_ci __be64 value; 328c2ecf20Sopenharmony_ci __be64 address; 338c2ecf20Sopenharmony_ci} __aligned(CCB_ALIGN); 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_ci 368c2ecf20Sopenharmony_ci/* Chapter 6.5.7 Coprocessor-Status Block (CSB) */ 378c2ecf20Sopenharmony_ci 388c2ecf20Sopenharmony_ci#define CSB_V (0x80) 398c2ecf20Sopenharmony_ci#define CSB_F (0x04) 408c2ecf20Sopenharmony_ci#define CSB_CH (0x03) 418c2ecf20Sopenharmony_ci#define CSB_CE_INCOMPLETE (0x80) 428c2ecf20Sopenharmony_ci#define CSB_CE_TERMINATION (0x40) 438c2ecf20Sopenharmony_ci#define CSB_CE_TPBC (0x20) 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_ci#define CSB_CC_SUCCESS (0) 468c2ecf20Sopenharmony_ci#define CSB_CC_INVALID_ALIGN (1) 478c2ecf20Sopenharmony_ci#define CSB_CC_OPERAND_OVERLAP (2) 488c2ecf20Sopenharmony_ci#define CSB_CC_DATA_LENGTH (3) 498c2ecf20Sopenharmony_ci#define CSB_CC_TRANSLATION (5) 508c2ecf20Sopenharmony_ci#define CSB_CC_PROTECTION (6) 518c2ecf20Sopenharmony_ci#define CSB_CC_RD_EXTERNAL (7) 528c2ecf20Sopenharmony_ci#define CSB_CC_INVALID_OPERAND (8) 538c2ecf20Sopenharmony_ci#define CSB_CC_PRIVILEGE (9) 548c2ecf20Sopenharmony_ci#define CSB_CC_INTERNAL (10) 558c2ecf20Sopenharmony_ci#define CSB_CC_WR_EXTERNAL (12) 568c2ecf20Sopenharmony_ci#define CSB_CC_NOSPC (13) 578c2ecf20Sopenharmony_ci#define CSB_CC_EXCESSIVE_DDE (14) 588c2ecf20Sopenharmony_ci#define CSB_CC_WR_TRANSLATION (15) 598c2ecf20Sopenharmony_ci#define CSB_CC_WR_PROTECTION (16) 608c2ecf20Sopenharmony_ci#define CSB_CC_UNKNOWN_CODE (17) 618c2ecf20Sopenharmony_ci#define CSB_CC_ABORT (18) 628c2ecf20Sopenharmony_ci#define CSB_CC_TRANSPORT (20) 638c2ecf20Sopenharmony_ci#define CSB_CC_SEGMENTED_DDL (31) 648c2ecf20Sopenharmony_ci#define CSB_CC_PROGRESS_POINT (32) 658c2ecf20Sopenharmony_ci#define CSB_CC_DDE_OVERFLOW (33) 668c2ecf20Sopenharmony_ci#define CSB_CC_SESSION (34) 678c2ecf20Sopenharmony_ci#define CSB_CC_PROVISION (36) 688c2ecf20Sopenharmony_ci#define CSB_CC_CHAIN (37) 698c2ecf20Sopenharmony_ci#define CSB_CC_SEQUENCE (38) 708c2ecf20Sopenharmony_ci#define CSB_CC_HW (39) 718c2ecf20Sopenharmony_ci 728c2ecf20Sopenharmony_ci#define CSB_SIZE (0x10) 738c2ecf20Sopenharmony_ci#define CSB_ALIGN CSB_SIZE 748c2ecf20Sopenharmony_ci 758c2ecf20Sopenharmony_cistruct coprocessor_status_block { 768c2ecf20Sopenharmony_ci __u8 flags; 778c2ecf20Sopenharmony_ci __u8 cs; 788c2ecf20Sopenharmony_ci __u8 cc; 798c2ecf20Sopenharmony_ci __u8 ce; 808c2ecf20Sopenharmony_ci __be32 count; 818c2ecf20Sopenharmony_ci __be64 address; 828c2ecf20Sopenharmony_ci} __aligned(CSB_ALIGN); 838c2ecf20Sopenharmony_ci 848c2ecf20Sopenharmony_ci 858c2ecf20Sopenharmony_ci/* Chapter 6.5.10 Data-Descriptor List (DDL) 868c2ecf20Sopenharmony_ci * each list contains one or more Data-Descriptor Entries (DDE) 878c2ecf20Sopenharmony_ci */ 888c2ecf20Sopenharmony_ci 898c2ecf20Sopenharmony_ci#define DDE_P (0x8000) 908c2ecf20Sopenharmony_ci 918c2ecf20Sopenharmony_ci#define DDE_SIZE (0x10) 928c2ecf20Sopenharmony_ci#define DDE_ALIGN DDE_SIZE 938c2ecf20Sopenharmony_ci 948c2ecf20Sopenharmony_cistruct data_descriptor_entry { 958c2ecf20Sopenharmony_ci __be16 flags; 968c2ecf20Sopenharmony_ci __u8 count; 978c2ecf20Sopenharmony_ci __u8 index; 988c2ecf20Sopenharmony_ci __be32 length; 998c2ecf20Sopenharmony_ci __be64 address; 1008c2ecf20Sopenharmony_ci} __aligned(DDE_ALIGN); 1018c2ecf20Sopenharmony_ci 1028c2ecf20Sopenharmony_ci 1038c2ecf20Sopenharmony_ci/* Chapter 6.5.2 Coprocessor-Request Block (CRB) */ 1048c2ecf20Sopenharmony_ci 1058c2ecf20Sopenharmony_ci#define CRB_SIZE (0x80) 1068c2ecf20Sopenharmony_ci#define CRB_ALIGN (0x100) /* Errata: requires 256 alignment */ 1078c2ecf20Sopenharmony_ci 1088c2ecf20Sopenharmony_ci 1098c2ecf20Sopenharmony_ci/* Coprocessor Status Block field 1108c2ecf20Sopenharmony_ci * ADDRESS address of CSB 1118c2ecf20Sopenharmony_ci * C CCB is valid 1128c2ecf20Sopenharmony_ci * AT 0 = addrs are virtual, 1 = addrs are phys 1138c2ecf20Sopenharmony_ci * M enable perf monitor 1148c2ecf20Sopenharmony_ci */ 1158c2ecf20Sopenharmony_ci#define CRB_CSB_ADDRESS (0xfffffffffffffff0) 1168c2ecf20Sopenharmony_ci#define CRB_CSB_C (0x0000000000000008) 1178c2ecf20Sopenharmony_ci#define CRB_CSB_AT (0x0000000000000002) 1188c2ecf20Sopenharmony_ci#define CRB_CSB_M (0x0000000000000001) 1198c2ecf20Sopenharmony_ci 1208c2ecf20Sopenharmony_cistruct coprocessor_request_block { 1218c2ecf20Sopenharmony_ci __be32 ccw; 1228c2ecf20Sopenharmony_ci __be32 flags; 1238c2ecf20Sopenharmony_ci __be64 csb_addr; 1248c2ecf20Sopenharmony_ci 1258c2ecf20Sopenharmony_ci struct data_descriptor_entry source; 1268c2ecf20Sopenharmony_ci struct data_descriptor_entry target; 1278c2ecf20Sopenharmony_ci 1288c2ecf20Sopenharmony_ci struct coprocessor_completion_block ccb; 1298c2ecf20Sopenharmony_ci 1308c2ecf20Sopenharmony_ci __u8 reserved[48]; 1318c2ecf20Sopenharmony_ci 1328c2ecf20Sopenharmony_ci struct coprocessor_status_block csb; 1338c2ecf20Sopenharmony_ci} __aligned(CRB_ALIGN); 1348c2ecf20Sopenharmony_ci 1358c2ecf20Sopenharmony_ci#define crb_csb_addr(c) __be64_to_cpu(c->csb_addr) 1368c2ecf20Sopenharmony_ci#define crb_nx_fault_addr(c) __be64_to_cpu(c->stamp.nx.fault_storage_addr) 1378c2ecf20Sopenharmony_ci#define crb_nx_flags(c) c->stamp.nx.flags 1388c2ecf20Sopenharmony_ci#define crb_nx_fault_status(c) c->stamp.nx.fault_status 1398c2ecf20Sopenharmony_ci#define crb_nx_pswid(c) c->stamp.nx.pswid 1408c2ecf20Sopenharmony_ci 1418c2ecf20Sopenharmony_ci 1428c2ecf20Sopenharmony_ci/* RFC02167 Initiate Coprocessor Instructions document 1438c2ecf20Sopenharmony_ci * Chapter 8.2.1.1.1 RS 1448c2ecf20Sopenharmony_ci * Chapter 8.2.3 Coprocessor Directive 1458c2ecf20Sopenharmony_ci * Chapter 8.2.4 Execution 1468c2ecf20Sopenharmony_ci * 1478c2ecf20Sopenharmony_ci * The CCW must be converted to BE before passing to icswx() 1488c2ecf20Sopenharmony_ci */ 1498c2ecf20Sopenharmony_ci 1508c2ecf20Sopenharmony_ci#define CCW_PS (0xff000000) 1518c2ecf20Sopenharmony_ci#define CCW_CT (0x00ff0000) 1528c2ecf20Sopenharmony_ci#define CCW_CD (0x0000ffff) 1538c2ecf20Sopenharmony_ci#define CCW_CL (0x0000c000) 1548c2ecf20Sopenharmony_ci 1558c2ecf20Sopenharmony_ci#endif 156