socsvn commit: r305108 - soc2016/iateaca/bhyve-hda-head/usr.sbin/bhyve

iateaca at FreeBSD.org iateaca at FreeBSD.org
Sat Jun 11 17:13:40 UTC 2016


Author: iateaca
Date: Sat Jun 11 17:13:38 2016
New Revision: 305108
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=305108

Log:
  
  add one pin widget (Analog Line-out) to the hda codec configuration
  implement 3 configuration verbs: GET_CONFIGURATION_DEFAULT, GET_CONN_LIST_ENTRY, GET_PIN_WIDGET_CTRL
  
  M    bhyve/hda_codec.c

Modified:
  soc2016/iateaca/bhyve-hda-head/usr.sbin/bhyve/hda_codec.c

Modified: soc2016/iateaca/bhyve-hda-head/usr.sbin/bhyve/hda_codec.c
==============================================================================
--- soc2016/iateaca/bhyve-hda-head/usr.sbin/bhyve/hda_codec.c	Sat Jun 11 14:46:49 2016	(r305107)
+++ soc2016/iateaca/bhyve-hda-head/usr.sbin/bhyve/hda_codec.c	Sat Jun 11 17:13:38 2016	(r305108)
@@ -10,24 +10,35 @@
 #define HDA_CODEC_ROOT_NID			0x00
 #define HDA_CODEC_FG_NID			0x01
 #define HDA_CODEC_AUDIO_OUTPUT_NID		0x02
+#define HDA_CODEC_PIN_OUTPUT_NID		0x03
 
 #define HDA_CODEC_PARAMS_COUNT			0x14
+#define HDA_CODEC_CONN_LIST_COUNT		0x01
 #define HDA_CODEC_RESPONSE_EX_UNSOL		0x10
 #define HDA_CODEC_RESPONSE_EX_SOL		0x00
 
 #define HDA_CODEC_SUPP_STREAM_FORMATS_PCM	(1 << HDA_PARAM_SUPP_STREAM_FORMATS_PCM_SHIFT)
 
 #define HDA_CODEC_AUDIO_WCAP_OUTPUT		(0x00 << HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_SHIFT)
+#define HDA_CODEC_AUDIO_WCAP_PIN		(0x04 << HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_SHIFT)
+#define HDA_CODEC_AUDIO_WCAP_CONN_LIST		(1 << HDA_PARAM_AUDIO_WIDGET_CAP_CONN_LIST_SHIFT)
 #define HDA_CODEC_AUDIO_WCAP_FORMAT_OVR		(1 << HDA_PARAM_AUDIO_WIDGET_CAP_FORMAT_OVR_SHIFT)
 #define HDA_CODEC_AUDIO_WCAP_AMP_OVR		(1 << HDA_PARAM_AUDIO_WIDGET_CAP_AMP_OVR_SHIFT)
 #define HDA_CODEC_AUDIO_WCAP_OUT_AMP		(1 << HDA_PARAM_AUDIO_WIDGET_CAP_OUT_AMP_SHIFT)
 #define HDA_CODEC_AUDIO_WCAP_STEREO		(1 << HDA_PARAM_AUDIO_WIDGET_CAP_STEREO_SHIFT)
 
+#define HDA_CODEC_PIN_CAP_OUTPUT		(1 << HDA_PARAM_PIN_CAP_OUTPUT_CAP_SHIFT)
+#define HDA_CODEC_PIN_CAP_PRESENCE_DETECT	(1 << HDA_PARAM_PIN_CAP_PRESENCE_DETECT_CAP_SHIFT)
+
 #define HDA_CODEC_OUTPUT_AMP_CAP_MUTE_CAP	(1 << HDA_PARAM_OUTPUT_AMP_CAP_MUTE_CAP_SHIFT)
 #define HDA_CODEC_OUTPUT_AMP_CAP_STEPSIZE	(0x03 << HDA_PARAM_OUTPUT_AMP_CAP_STEPSIZE_SHIFT)
 #define HDA_CODEC_OUTPUT_AMP_CAP_NUMSTEPS	(0x1f << HDA_PARAM_OUTPUT_AMP_CAP_NUMSTEPS_SHIFT)
 #define HDA_CODEC_OUTPUT_AMP_CAP_OFFSET		(0x00 << HDA_PARAM_OUTPUT_AMP_CAP_OFFSET_SHIFT)
 
+#define HDA_CODEC_PIN_SENSE_PRESENCE_PLUGGED	(1 << 31)
+#define HDA_CODEC_PIN_WIDGET_CTRL_OUT_ENABLE	(1 << HDA_CMD_GET_PIN_WIDGET_CTRL_OUT_ENABLE_SHIFT)
+
+#define HDA_CONFIG_DEFAULTCONF_COLOR_BLACK	(0x01 << HDA_CONFIG_DEFAULTCONF_COLOR_SHIFT)
 
 #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
 
@@ -40,6 +51,9 @@
 	uint32_t subsystem_id;
 	uint32_t no_nodes;
 	const uint32_t (*get_parameters)[HDA_CODEC_PARAMS_COUNT];
+	const uint8_t (*conn_list)[HDA_CODEC_CONN_LIST_COUNT];
+	const uint32_t *conf_default;
+	const uint8_t *pin_ctrl_default;
 };
 
 /*
@@ -63,7 +77,7 @@
 		[HDA_PARAM_SUB_NODE_COUNT] = 0x00010001,				/* 1 Subnode, StartNid = 1 */
 	},
 	[HDA_CODEC_FG_NID] = {
-		[HDA_PARAM_SUB_NODE_COUNT] = 0x00020001,				/* 1 Subnode, StartNid = 2 */
+		[HDA_PARAM_SUB_NODE_COUNT] = 0x00020002,				/* 2 Subnodes, StartNid = 2 */
 		[HDA_PARAM_FCT_GRP_TYPE] = HDA_PARAM_FCT_GRP_TYPE_NODE_TYPE_AUDIO,
 		[HDA_PARAM_SUPP_PCM_SIZE_RATE] = (0x1f << 16) | 0x7ff,			/* B8 - B32, 8.0 - 192.0kHz */
 		[HDA_PARAM_SUPP_STREAM_FORMATS] = HDA_CODEC_SUPP_STREAM_FORMATS_PCM,
@@ -86,6 +100,33 @@
 						HDA_CODEC_OUTPUT_AMP_CAP_NUMSTEPS |
 						HDA_CODEC_OUTPUT_AMP_CAP_OFFSET,
 	},
+	[HDA_CODEC_PIN_OUTPUT_NID] = {
+		[HDA_PARAM_AUDIO_WIDGET_CAP] =	HDA_CODEC_AUDIO_WCAP_PIN |
+						HDA_CODEC_AUDIO_WCAP_CONN_LIST |
+						HDA_CODEC_AUDIO_WCAP_STEREO,
+		[HDA_PARAM_PIN_CAP] =		HDA_CODEC_PIN_CAP_OUTPUT |
+						HDA_CODEC_PIN_CAP_PRESENCE_DETECT,
+		[HDA_PARAM_INPUT_AMP_CAP] = 0x00,					/* None */
+		[HDA_PARAM_CONN_LIST_LENGTH] = 0x01,
+		[HDA_PARAM_OUTPUT_AMP_CAP] = 0x00,					/* None */
+	},
+};
+
+#define HDA_CODEC_NODES_COUNT			(ARRAY_SIZE(hda_codec_parameters))
+
+static const uint8_t hda_codec_conn_list[HDA_CODEC_NODES_COUNT][HDA_CODEC_CONN_LIST_COUNT] = {
+	[HDA_CODEC_PIN_OUTPUT_NID] = {0x02},
+};
+
+static const uint32_t hda_codec_conf_default[HDA_CODEC_NODES_COUNT] = {
+	[HDA_CODEC_PIN_OUTPUT_NID] =		HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_JACK |
+						HDA_CONFIG_DEFAULTCONF_DEVICE_LINE_OUT |
+						HDA_CONFIG_DEFAULTCONF_COLOR_BLACK |
+						(0x01 << HDA_CONFIG_DEFAULTCONF_ASSOCIATION_SHIFT),
+};
+
+static const uint8_t hda_codec_pin_ctrl_default[HDA_CODEC_NODES_COUNT] = {
+	[HDA_CODEC_PIN_OUTPUT_NID] = HDA_CODEC_PIN_WIDGET_CTRL_OUT_ENABLE,
 };
 
 /*
@@ -104,8 +145,11 @@
 		return -1;
 
 	sc->subsystem_id = HDA_CODEC_SUBSYSTEM_ID;
-	sc->no_nodes = ARRAY_SIZE(hda_codec_parameters);
+	sc->no_nodes = HDA_CODEC_NODES_COUNT;
 	sc->get_parameters = hda_codec_parameters;
+	sc->conn_list = hda_codec_conn_list;
+	sc->conf_default = hda_codec_conf_default;
+	sc->pin_ctrl_default = hda_codec_pin_ctrl_default;
 	DPRINTF("HDA Codec nodes: %d\n", sc->no_nodes);
 
 	hci->priv = sc;
@@ -174,6 +218,21 @@
 		else
 			DPRINTF("GET_PARAMETER(nid: %d) not described\n", nid);
 		break;
+	case HDA_CMD_VERB_GET_CONN_LIST_ENTRY:
+		assert(nid < sc->no_nodes);
+		res = sc->conn_list[nid][0];
+		break;
+	case HDA_CMD_VERB_GET_PIN_WIDGET_CTRL:
+		assert(nid < sc->no_nodes);
+		res = sc->pin_ctrl_default[nid];
+		break;
+	case HDA_CMD_VERB_GET_PIN_SENSE:
+		res = HDA_CODEC_PIN_SENSE_PRESENCE_PLUGGED;
+		break;
+	case HDA_CMD_VERB_GET_CONFIGURATION_DEFAULT:
+		assert(nid < sc->no_nodes);
+		res = sc->conf_default[nid];
+		break;
 	case HDA_CMD_VERB_GET_SUBSYSTEM_ID:
 		res = sc->subsystem_id;
 		break;
@@ -182,6 +241,7 @@
 		break;
 	default:
 		/* TODO - call a specific handler per node */
+		DPRINTF("Unknown VERB: 0x%x\n", verb);
 		break;
 	}
 


More information about the svn-soc-all mailing list