1*4882a593Smuzhiyun /* SPDX-License-Identifier: MIT */ 2*4882a593Smuzhiyun /* Copyright (C) 2006-2017 Oracle Corporation */ 3*4882a593Smuzhiyun 4*4882a593Smuzhiyun #ifndef __HGSMI_DEFS_H__ 5*4882a593Smuzhiyun #define __HGSMI_DEFS_H__ 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun /* Buffer sequence type mask. */ 8*4882a593Smuzhiyun #define HGSMI_BUFFER_HEADER_F_SEQ_MASK 0x03 9*4882a593Smuzhiyun /* Single buffer, not a part of a sequence. */ 10*4882a593Smuzhiyun #define HGSMI_BUFFER_HEADER_F_SEQ_SINGLE 0x00 11*4882a593Smuzhiyun /* The first buffer in a sequence. */ 12*4882a593Smuzhiyun #define HGSMI_BUFFER_HEADER_F_SEQ_START 0x01 13*4882a593Smuzhiyun /* A middle buffer in a sequence. */ 14*4882a593Smuzhiyun #define HGSMI_BUFFER_HEADER_F_SEQ_CONTINUE 0x02 15*4882a593Smuzhiyun /* The last buffer in a sequence. */ 16*4882a593Smuzhiyun #define HGSMI_BUFFER_HEADER_F_SEQ_END 0x03 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun /* 16 bytes buffer header. */ 19*4882a593Smuzhiyun struct hgsmi_buffer_header { 20*4882a593Smuzhiyun u32 data_size; /* Size of data that follows the header. */ 21*4882a593Smuzhiyun u8 flags; /* HGSMI_BUFFER_HEADER_F_* */ 22*4882a593Smuzhiyun u8 channel; /* The channel the data must be routed to. */ 23*4882a593Smuzhiyun u16 channel_info; /* Opaque to the HGSMI, used by the channel. */ 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun union { 26*4882a593Smuzhiyun /* Opaque placeholder to make the union 8 bytes. */ 27*4882a593Smuzhiyun u8 header_data[8]; 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun /* HGSMI_BUFFER_HEADER_F_SEQ_SINGLE */ 30*4882a593Smuzhiyun struct { 31*4882a593Smuzhiyun u32 reserved1; /* A reserved field, initialize to 0. */ 32*4882a593Smuzhiyun u32 reserved2; /* A reserved field, initialize to 0. */ 33*4882a593Smuzhiyun } buffer; 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun /* HGSMI_BUFFER_HEADER_F_SEQ_START */ 36*4882a593Smuzhiyun struct { 37*4882a593Smuzhiyun /* Must be the same for all buffers in the sequence. */ 38*4882a593Smuzhiyun u32 sequence_number; 39*4882a593Smuzhiyun /* The total size of the sequence. */ 40*4882a593Smuzhiyun u32 sequence_size; 41*4882a593Smuzhiyun } sequence_start; 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun /* 44*4882a593Smuzhiyun * HGSMI_BUFFER_HEADER_F_SEQ_CONTINUE and 45*4882a593Smuzhiyun * HGSMI_BUFFER_HEADER_F_SEQ_END 46*4882a593Smuzhiyun */ 47*4882a593Smuzhiyun struct { 48*4882a593Smuzhiyun /* Must be the same for all buffers in the sequence. */ 49*4882a593Smuzhiyun u32 sequence_number; 50*4882a593Smuzhiyun /* Data offset in the entire sequence. */ 51*4882a593Smuzhiyun u32 sequence_offset; 52*4882a593Smuzhiyun } sequence_continue; 53*4882a593Smuzhiyun } u; 54*4882a593Smuzhiyun } __packed; 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun /* 8 bytes buffer tail. */ 57*4882a593Smuzhiyun struct hgsmi_buffer_tail { 58*4882a593Smuzhiyun /* Reserved, must be initialized to 0. */ 59*4882a593Smuzhiyun u32 reserved; 60*4882a593Smuzhiyun /* 61*4882a593Smuzhiyun * One-at-a-Time Hash: https://www.burtleburtle.net/bob/hash/doobs.html 62*4882a593Smuzhiyun * Over the header, offset and for first 4 bytes of the tail. 63*4882a593Smuzhiyun */ 64*4882a593Smuzhiyun u32 checksum; 65*4882a593Smuzhiyun } __packed; 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun /* 68*4882a593Smuzhiyun * The size of the array of channels. Array indexes are u8. 69*4882a593Smuzhiyun * Note: the value must not be changed. 70*4882a593Smuzhiyun */ 71*4882a593Smuzhiyun #define HGSMI_NUMBER_OF_CHANNELS 0x100 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun #endif 74