1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * IBM ASM Service Processor Device Driver 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (C) IBM Corporation, 2004 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * Author: Max Asböck <amax@us.ibm.com> 8*4882a593Smuzhiyun */ 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #pragma pack(1) 11*4882a593Smuzhiyun struct i2o_header { 12*4882a593Smuzhiyun u8 version; 13*4882a593Smuzhiyun u8 message_flags; 14*4882a593Smuzhiyun u16 message_size; 15*4882a593Smuzhiyun u8 target; 16*4882a593Smuzhiyun u8 initiator_and_target; 17*4882a593Smuzhiyun u8 initiator; 18*4882a593Smuzhiyun u8 function; 19*4882a593Smuzhiyun u32 initiator_context; 20*4882a593Smuzhiyun }; 21*4882a593Smuzhiyun #pragma pack() 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun #define I2O_HEADER_TEMPLATE \ 24*4882a593Smuzhiyun { .version = 0x01, \ 25*4882a593Smuzhiyun .message_flags = 0x00, \ 26*4882a593Smuzhiyun .function = 0xFF, \ 27*4882a593Smuzhiyun .initiator = 0x00, \ 28*4882a593Smuzhiyun .initiator_and_target = 0x40, \ 29*4882a593Smuzhiyun .target = 0x00, \ 30*4882a593Smuzhiyun .initiator_context = 0x0 } 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun #define I2O_MESSAGE_SIZE 0x1000 33*4882a593Smuzhiyun #define I2O_COMMAND_SIZE (I2O_MESSAGE_SIZE - sizeof(struct i2o_header)) 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun #pragma pack(1) 36*4882a593Smuzhiyun struct i2o_message { 37*4882a593Smuzhiyun struct i2o_header header; 38*4882a593Smuzhiyun void *data; 39*4882a593Smuzhiyun }; 40*4882a593Smuzhiyun #pragma pack() 41*4882a593Smuzhiyun outgoing_message_size(unsigned int data_size)42*4882a593Smuzhiyunstatic inline unsigned short outgoing_message_size(unsigned int data_size) 43*4882a593Smuzhiyun { 44*4882a593Smuzhiyun unsigned int size; 45*4882a593Smuzhiyun unsigned short i2o_size; 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun if (data_size > I2O_COMMAND_SIZE) 48*4882a593Smuzhiyun data_size = I2O_COMMAND_SIZE; 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun size = sizeof(struct i2o_header) + data_size; 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun i2o_size = size / sizeof(u32); 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun if (size % sizeof(u32)) 55*4882a593Smuzhiyun i2o_size++; 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun return i2o_size; 58*4882a593Smuzhiyun } 59*4882a593Smuzhiyun incoming_data_size(struct i2o_message * i2o_message)60*4882a593Smuzhiyunstatic inline u32 incoming_data_size(struct i2o_message *i2o_message) 61*4882a593Smuzhiyun { 62*4882a593Smuzhiyun return (sizeof(u32) * i2o_message->header.message_size); 63*4882a593Smuzhiyun } 64