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