xref: /openbmc/linux/sound/pci/asihpi/hpimsginit.c (revision 3285ea10)
1719f82d3SEliot Blennerhassett /******************************************************************************
2719f82d3SEliot Blennerhassett 
3719f82d3SEliot Blennerhassett     AudioScience HPI driver
4719f82d3SEliot Blennerhassett     Copyright (C) 1997-2010  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 {
40719f82d3SEliot Blennerhassett 	memset(phm, 0, sizeof(*phm));
41719f82d3SEliot Blennerhassett 	if ((object > 0) && (object <= HPI_OBJ_MAXINDEX))
42719f82d3SEliot Blennerhassett 		phm->size = msg_size[object];
43719f82d3SEliot Blennerhassett 	else
44719f82d3SEliot Blennerhassett 		phm->size = sizeof(*phm);
45719f82d3SEliot Blennerhassett 
46719f82d3SEliot Blennerhassett 	if (gwSSX2_bypass)
47719f82d3SEliot Blennerhassett 		phm->type = HPI_TYPE_SSX2BYPASS_MESSAGE;
48719f82d3SEliot Blennerhassett 	else
49719f82d3SEliot Blennerhassett 		phm->type = HPI_TYPE_MESSAGE;
50719f82d3SEliot Blennerhassett 	phm->object = object;
51719f82d3SEliot Blennerhassett 	phm->function = function;
52719f82d3SEliot Blennerhassett 	phm->version = 0;
533285ea10SEliot Blennerhassett 	phm->adapter_index = HPI_ADAPTER_INDEX_INVALID;
540a1602c0SEliot Blennerhassett 	/* Expect actual adapter index to be set by caller */
55719f82d3SEliot Blennerhassett }
56719f82d3SEliot Blennerhassett 
57719f82d3SEliot Blennerhassett /** \internal
58719f82d3SEliot Blennerhassett   * initialize the HPI response structure
59719f82d3SEliot Blennerhassett   */
60719f82d3SEliot Blennerhassett void hpi_init_response(struct hpi_response *phr, u16 object, u16 function,
61719f82d3SEliot Blennerhassett 	u16 error)
62719f82d3SEliot Blennerhassett {
63719f82d3SEliot Blennerhassett 	memset(phr, 0, sizeof(*phr));
64719f82d3SEliot Blennerhassett 	phr->type = HPI_TYPE_RESPONSE;
65719f82d3SEliot Blennerhassett 	if ((object > 0) && (object <= HPI_OBJ_MAXINDEX))
66719f82d3SEliot Blennerhassett 		phr->size = res_size[object];
67719f82d3SEliot Blennerhassett 	else
68719f82d3SEliot Blennerhassett 		phr->size = sizeof(*phr);
69719f82d3SEliot Blennerhassett 	phr->object = object;
70719f82d3SEliot Blennerhassett 	phr->function = function;
71719f82d3SEliot Blennerhassett 	phr->error = error;
72719f82d3SEliot Blennerhassett 	phr->specific_error = 0;
73719f82d3SEliot Blennerhassett 	phr->version = 0;
74719f82d3SEliot Blennerhassett }
75719f82d3SEliot Blennerhassett 
76719f82d3SEliot Blennerhassett void hpi_init_message_response(struct hpi_message *phm,
77719f82d3SEliot Blennerhassett 	struct hpi_response *phr, u16 object, u16 function)
78719f82d3SEliot Blennerhassett {
79719f82d3SEliot Blennerhassett 	hpi_init_message(phm, object, function);
80719f82d3SEliot Blennerhassett 	/* default error return if the response is
81719f82d3SEliot Blennerhassett 	   not filled in by the callee */
82719f82d3SEliot Blennerhassett 	hpi_init_response(phr, object, function,
83719f82d3SEliot Blennerhassett 		HPI_ERROR_PROCESSING_MESSAGE);
84719f82d3SEliot Blennerhassett }
85719f82d3SEliot Blennerhassett 
86719f82d3SEliot Blennerhassett static void hpi_init_messageV1(struct hpi_message_header *phm, u16 size,
87719f82d3SEliot Blennerhassett 	u16 object, u16 function)
88719f82d3SEliot Blennerhassett {
89719f82d3SEliot Blennerhassett 	memset(phm, 0, sizeof(*phm));
90719f82d3SEliot Blennerhassett 	if ((object > 0) && (object <= HPI_OBJ_MAXINDEX)) {
91719f82d3SEliot Blennerhassett 		phm->size = size;
92719f82d3SEliot Blennerhassett 		phm->type = HPI_TYPE_MESSAGE;
93719f82d3SEliot Blennerhassett 		phm->object = object;
94719f82d3SEliot Blennerhassett 		phm->function = function;
95719f82d3SEliot Blennerhassett 		phm->version = 1;
96719f82d3SEliot Blennerhassett 		/* Expect adapter index to be set by caller */
97719f82d3SEliot Blennerhassett 	}
98719f82d3SEliot Blennerhassett }
99719f82d3SEliot Blennerhassett 
100719f82d3SEliot Blennerhassett void hpi_init_responseV1(struct hpi_response_header *phr, u16 size,
101719f82d3SEliot Blennerhassett 	u16 object, u16 function)
102719f82d3SEliot Blennerhassett {
103719f82d3SEliot Blennerhassett 	memset(phr, 0, sizeof(*phr));
104719f82d3SEliot Blennerhassett 	phr->size = size;
105719f82d3SEliot Blennerhassett 	phr->version = 1;
106719f82d3SEliot Blennerhassett 	phr->type = HPI_TYPE_RESPONSE;
107719f82d3SEliot Blennerhassett 	phr->error = HPI_ERROR_PROCESSING_MESSAGE;
108719f82d3SEliot Blennerhassett }
109719f82d3SEliot Blennerhassett 
110719f82d3SEliot Blennerhassett void hpi_init_message_responseV1(struct hpi_message_header *phm, u16 msg_size,
111719f82d3SEliot Blennerhassett 	struct hpi_response_header *phr, u16 res_size, u16 object,
112719f82d3SEliot Blennerhassett 	u16 function)
113719f82d3SEliot Blennerhassett {
114719f82d3SEliot Blennerhassett 	hpi_init_messageV1(phm, msg_size, object, function);
115719f82d3SEliot Blennerhassett 	hpi_init_responseV1(phr, res_size, object, function);
116719f82d3SEliot Blennerhassett }
117