121 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/******************************************************************************3 4 AudioScience HPI driver5 Copyright (C) 1997-2014 AudioScience Inc. <support@audioscience.com>6 7 8 Hardware Programming Interface (HPI) Utility functions.9 10 (C) Copyright AudioScience Inc. 200711*******************************************************************************/12 13#include "hpi_internal.h"14#include "hpimsginit.h"15#include <linux/nospec.h>16 17/* The actual message size for each object type */18static u16 msg_size[HPI_OBJ_MAXINDEX + 1] = HPI_MESSAGE_SIZE_BY_OBJECT;19/* The actual response size for each object type */20static u16 res_size[HPI_OBJ_MAXINDEX + 1] = HPI_RESPONSE_SIZE_BY_OBJECT;21/* Flag to enable alternate message type for SSX2 bypass. */22static u16 gwSSX2_bypass;23 24/** \internal25 * initialize the HPI message structure26 */27static void hpi_init_message(struct hpi_message *phm, u16 object,28 u16 function)29{30 u16 size;31 32 if ((object > 0) && (object <= HPI_OBJ_MAXINDEX)) {33 object = array_index_nospec(object, HPI_OBJ_MAXINDEX + 1);34 size = msg_size[object];35 } else {36 size = sizeof(*phm);37 }38 39 memset(phm, 0, size);40 phm->size = size;41 42 if (gwSSX2_bypass)43 phm->type = HPI_TYPE_SSX2BYPASS_MESSAGE;44 else45 phm->type = HPI_TYPE_REQUEST;46 phm->object = object;47 phm->function = function;48 phm->version = 0;49 phm->adapter_index = HPI_ADAPTER_INDEX_INVALID;50 /* Expect actual adapter index to be set by caller */51}52 53/** \internal54 * initialize the HPI response structure55 */56void hpi_init_response(struct hpi_response *phr, u16 object, u16 function,57 u16 error)58{59 u16 size;60 61 if ((object > 0) && (object <= HPI_OBJ_MAXINDEX)) {62 object = array_index_nospec(object, HPI_OBJ_MAXINDEX + 1);63 size = res_size[object];64 } else {65 size = sizeof(*phr);66 }67 68 memset(phr, 0, sizeof(*phr));69 phr->size = size;70 phr->type = HPI_TYPE_RESPONSE;71 phr->object = object;72 phr->function = function;73 phr->error = error;74 phr->specific_error = 0;75 phr->version = 0;76}77 78void hpi_init_message_response(struct hpi_message *phm,79 struct hpi_response *phr, u16 object, u16 function)80{81 hpi_init_message(phm, object, function);82 /* default error return if the response is83 not filled in by the callee */84 hpi_init_response(phr, object, function,85 HPI_ERROR_PROCESSING_MESSAGE);86}87 88static void hpi_init_messageV1(struct hpi_message_header *phm, u16 size,89 u16 object, u16 function)90{91 memset(phm, 0, size);92 if ((object > 0) && (object <= HPI_OBJ_MAXINDEX)) {93 phm->size = size;94 phm->type = HPI_TYPE_REQUEST;95 phm->object = object;96 phm->function = function;97 phm->version = 1;98 /* Expect adapter index to be set by caller */99 }100}101 102void hpi_init_responseV1(struct hpi_response_header *phr, u16 size,103 u16 object, u16 function)104{105 (void)object;106 (void)function;107 memset(phr, 0, size);108 phr->size = size;109 phr->version = 1;110 phr->type = HPI_TYPE_RESPONSE;111 phr->error = HPI_ERROR_PROCESSING_MESSAGE;112}113 114void hpi_init_message_responseV1(struct hpi_message_header *phm, u16 msg_size,115 struct hpi_response_header *phr, u16 res_size, u16 object,116 u16 function)117{118 hpi_init_messageV1(phm, msg_size, object, function);119 hpi_init_responseV1(phr, res_size, object, function);120}121