File Index
Files and directories
Sign in
FILE

hpimsginit.c

File preview with syntax highlighting.

linux-6.19.14/sound/pci/asihpi/hpimsginit.c C
  1// SPDX-License-Identifier: GPL-2.0-only
  2/******************************************************************************
  3
  4    AudioScience HPI driver
  5    Copyright (C) 1997-2014  AudioScience Inc. <support@audioscience.com>
  6
  7
  8 Hardware Programming Interface (HPI) Utility functions.
  9
 10 (C) Copyright AudioScience Inc. 2007
 11*******************************************************************************/
 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/** \internal
 25  * initialize the HPI message structure
 26  */
 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	else
 45		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/** \internal
 54  * initialize the HPI response structure
 55  */
 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 is
 83	   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}
~/ Read-only file preview.