xref: /openbmc/linux/sound/pci/asihpi/hpimsginit.c (revision 51e6f47d)
1719f82d3SEliot Blennerhassett /******************************************************************************
2719f82d3SEliot Blennerhassett 
3719f82d3SEliot Blennerhassett     AudioScience HPI driver
451e6f47dSEliot Blennerhassett     Copyright (C) 1997-2014  AudioScience Inc. <support@audioscience.com>
5719f82d3SEliot Blennerhassett 
6719f82d3SEliot Blennerhassett     This program is free software; you can redistribute it and/or modify
7719f82d3SEliot Blennerhassett     it under the terms of version 2 of the GNU General Public License as
8719f82d3SEliot Blennerhassett     published by the Free Software Foundation;
9719f82d3SEliot Blennerhassett 
10719f82d3SEliot Blennerhassett     This program is distributed in the hope that it will be useful,
11719f82d3SEliot Blennerhassett     but WITHOUT ANY WARRANTY; without even the implied warranty of
12719f82d3SEliot Blennerhassett     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13719f82d3SEliot Blennerhassett     GNU General Public License for more details.
14719f82d3SEliot Blennerhassett 
15719f82d3SEliot Blennerhassett     You should have received a copy of the GNU General Public License
16719f82d3SEliot Blennerhassett     along with this program; if not, write to the Free Software
17719f82d3SEliot Blennerhassett     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18719f82d3SEliot Blennerhassett 
19719f82d3SEliot Blennerhassett  Hardware Programming Interface (HPI) Utility functions.
20719f82d3SEliot Blennerhassett 
21719f82d3SEliot Blennerhassett  (C) Copyright AudioScience Inc. 2007
22719f82d3SEliot Blennerhassett *******************************************************************************/
23719f82d3SEliot Blennerhassett 
24719f82d3SEliot Blennerhassett #include "hpi_internal.h"
25719f82d3SEliot Blennerhassett #include "hpimsginit.h"
26719f82d3SEliot Blennerhassett 
27719f82d3SEliot Blennerhassett /* The actual message size for each object type */
28719f82d3SEliot Blennerhassett static u16 msg_size[HPI_OBJ_MAXINDEX + 1] = HPI_MESSAGE_SIZE_BY_OBJECT;
29719f82d3SEliot Blennerhassett /* The actual response size for each object type */
30719f82d3SEliot Blennerhassett static u16 res_size[HPI_OBJ_MAXINDEX + 1] = HPI_RESPONSE_SIZE_BY_OBJECT;
31719f82d3SEliot Blennerhassett /* Flag to enable alternate message type for SSX2 bypass. */
32719f82d3SEliot Blennerhassett static u16 gwSSX2_bypass;
33719f82d3SEliot Blennerhassett 
34719f82d3SEliot Blennerhassett /** \internal
35719f82d3SEliot Blennerhassett   * initialize the HPI message structure
36719f82d3SEliot Blennerhassett   */
37719f82d3SEliot Blennerhassett static void hpi_init_message(struct hpi_message *phm, u16 object,
38719f82d3SEliot Blennerhassett 	u16 function)
39719f82d3SEliot Blennerhassett {
4051e6f47dSEliot Blennerhassett 	u16 size;
4151e6f47dSEliot Blennerhassett 
42719f82d3SEliot Blennerhassett 	if ((object > 0) && (object <= HPI_OBJ_MAXINDEX))
4351e6f47dSEliot Blennerhassett 		size = msg_size[object];
44719f82d3SEliot Blennerhassett 	else
4551e6f47dSEliot Blennerhassett 		size = sizeof(*phm);
4651e6f47dSEliot Blennerhassett 
4751e6f47dSEliot Blennerhassett 	memset(phm, 0, size);
4851e6f47dSEliot Blennerhassett 	phm->size = size;
49719f82d3SEliot Blennerhassett 
50719f82d3SEliot Blennerhassett 	if (gwSSX2_bypass)
51719f82d3SEliot Blennerhassett 		phm->type = HPI_TYPE_SSX2BYPASS_MESSAGE;
52719f82d3SEliot Blennerhassett 	else
5382b5774fSEliot Blennerhassett 		phm->type = HPI_TYPE_REQUEST;
54719f82d3SEliot Blennerhassett 	phm->object = object;
55719f82d3SEliot Blennerhassett 	phm->function = function;
56719f82d3SEliot Blennerhassett 	phm->version = 0;
573285ea10SEliot Blennerhassett 	phm->adapter_index = HPI_ADAPTER_INDEX_INVALID;
580a1602c0SEliot Blennerhassett 	/* Expect actual adapter index to be set by caller */
59719f82d3SEliot Blennerhassett }
60719f82d3SEliot Blennerhassett 
61719f82d3SEliot Blennerhassett /** \internal
62719f82d3SEliot Blennerhassett   * initialize the HPI response structure
63719f82d3SEliot Blennerhassett   */
64719f82d3SEliot Blennerhassett void hpi_init_response(struct hpi_response *phr, u16 object, u16 function,
65719f82d3SEliot Blennerhassett 	u16 error)
66719f82d3SEliot Blennerhassett {
6751e6f47dSEliot Blennerhassett 	u16 size;
6851e6f47dSEliot Blennerhassett 
69719f82d3SEliot Blennerhassett 	if ((object > 0) && (object <= HPI_OBJ_MAXINDEX))
7051e6f47dSEliot Blennerhassett 		size = res_size[object];
71719f82d3SEliot Blennerhassett 	else
7251e6f47dSEliot Blennerhassett 		size = sizeof(*phr);
7351e6f47dSEliot Blennerhassett 
7451e6f47dSEliot Blennerhassett 	memset(phr, 0, sizeof(*phr));
7551e6f47dSEliot Blennerhassett 	phr->size = size;
7651e6f47dSEliot Blennerhassett 	phr->type = HPI_TYPE_RESPONSE;
77719f82d3SEliot Blennerhassett 	phr->object = object;
78719f82d3SEliot Blennerhassett 	phr->function = function;
79719f82d3SEliot Blennerhassett 	phr->error = error;
80719f82d3SEliot Blennerhassett 	phr->specific_error = 0;
81719f82d3SEliot Blennerhassett 	phr->version = 0;
82719f82d3SEliot Blennerhassett }
83719f82d3SEliot Blennerhassett 
84719f82d3SEliot Blennerhassett void hpi_init_message_response(struct hpi_message *phm,
85719f82d3SEliot Blennerhassett 	struct hpi_response *phr, u16 object, u16 function)
86719f82d3SEliot Blennerhassett {
87719f82d3SEliot Blennerhassett 	hpi_init_message(phm, object, function);
88719f82d3SEliot Blennerhassett 	/* default error return if the response is
89719f82d3SEliot Blennerhassett 	   not filled in by the callee */
90719f82d3SEliot Blennerhassett 	hpi_init_response(phr, object, function,
91719f82d3SEliot Blennerhassett 		HPI_ERROR_PROCESSING_MESSAGE);
92719f82d3SEliot Blennerhassett }
93719f82d3SEliot Blennerhassett 
94719f82d3SEliot Blennerhassett static void hpi_init_messageV1(struct hpi_message_header *phm, u16 size,
95719f82d3SEliot Blennerhassett 	u16 object, u16 function)
96719f82d3SEliot Blennerhassett {
9751e6f47dSEliot Blennerhassett 	memset(phm, 0, size);
98719f82d3SEliot Blennerhassett 	if ((object > 0) && (object <= HPI_OBJ_MAXINDEX)) {
99719f82d3SEliot Blennerhassett 		phm->size = size;
10082b5774fSEliot Blennerhassett 		phm->type = HPI_TYPE_REQUEST;
101719f82d3SEliot Blennerhassett 		phm->object = object;
102719f82d3SEliot Blennerhassett 		phm->function = function;
103719f82d3SEliot Blennerhassett 		phm->version = 1;
104719f82d3SEliot Blennerhassett 		/* Expect adapter index to be set by caller */
105719f82d3SEliot Blennerhassett 	}
106719f82d3SEliot Blennerhassett }
107719f82d3SEliot Blennerhassett 
108719f82d3SEliot Blennerhassett void hpi_init_responseV1(struct hpi_response_header *phr, u16 size,
109719f82d3SEliot Blennerhassett 	u16 object, u16 function)
110719f82d3SEliot Blennerhassett {
11151e6f47dSEliot Blennerhassett 	(void)object;
11251e6f47dSEliot Blennerhassett 	(void)function;
11351e6f47dSEliot Blennerhassett 	memset(phr, 0, size);
114719f82d3SEliot Blennerhassett 	phr->size = size;
115719f82d3SEliot Blennerhassett 	phr->version = 1;
116719f82d3SEliot Blennerhassett 	phr->type = HPI_TYPE_RESPONSE;
117719f82d3SEliot Blennerhassett 	phr->error = HPI_ERROR_PROCESSING_MESSAGE;
118719f82d3SEliot Blennerhassett }
119719f82d3SEliot Blennerhassett 
120719f82d3SEliot Blennerhassett void hpi_init_message_responseV1(struct hpi_message_header *phm, u16 msg_size,
121719f82d3SEliot Blennerhassett 	struct hpi_response_header *phr, u16 res_size, u16 object,
122719f82d3SEliot Blennerhassett 	u16 function)
123719f82d3SEliot Blennerhassett {
124719f82d3SEliot Blennerhassett 	hpi_init_messageV1(phm, msg_size, object, function);
125719f82d3SEliot Blennerhassett 	hpi_init_responseV1(phr, res_size, object, function);
126719f82d3SEliot Blennerhassett }
127