35#ifdef HAVE_KERNEL_OPTION_HEADERS
44#include <sys/endian.h>
45#include <sys/taskqueue.h>
52#define HDA_DRV_TEST_REV "20120126_0002"
56#define hdac_lock(sc) snd_mtxlock((sc)->lock)
57#define hdac_unlock(sc) snd_mtxunlock((sc)->lock)
58#define hdac_lockassert(sc) snd_mtxassert((sc)->lock)
60#define HDAC_QUIRK_64BIT (1 << 0)
61#define HDAC_QUIRK_DMAPOS (1 << 1)
62#define HDAC_QUIRK_MSI (1 << 2)
227static void hdac_dma_cb(
void *, bus_dma_segment_t *,
int,
int);
257 const char *res = NULL;
258 int i = 0, j,
k,
len, inv;
260 if (resource_string_value(device_get_name(sc->
dev),
261 device_get_unit(sc->
dev),
"config", &res) != 0)
263 if (!(res != NULL && strlen(res) > 0))
266 device_printf(sc->
dev,
"Config options:");
269 while (res[i] !=
'\0' &&
270 (res[i] ==
',' || isspace(res[i]) != 0))
272 if (res[i] ==
'\0') {
279 while (res[j] !=
'\0' &&
280 !(res[j] ==
',' || isspace(res[j]) != 0))
283 if (
len > 2 && strncmp(res + i,
"no", 2) == 0)
288 if (strncmp(res + i + inv,
294 printf(
" %s%s", (inv != 0) ?
"no" :
"",
299 *off &= ~hdac_quirks_tab[
k].value;
300 }
else if (inv != 0) {
302 *on &= ~hdac_quirks_tab[
k].value;
347 taskqueue_enqueue(taskqueue_thread, &sc->
unsolq_task);
351 for (i = 0; i < sc->
num_ss; i++) {
352 if ((intsts & (1 << i)) == 0)
357 HDAC_STREAM_INTR(
dev,
429 for (i = 0; i < sc->
num_iss; i++)
431 for (i = 0; i < sc->
num_oss; i++)
433 for (i = 0; i < sc->
num_bss; i++)
462 device_printf(sc->
dev,
"Unable to put hdac in reset\n");
481 device_printf(sc->
dev,
"Device stuck in reset\n");
508 uint8_t corbsize, rirbsize;
533 device_printf(sc->
dev,
"%s: Invalid corb size (%x)\n",
549 device_printf(sc->
dev,
"%s: Invalid rirb size (%x)\n",
555 device_printf(sc->
dev,
"Caps: OSS %d, ISS %d, BSS %d, "
556 "NSDO %d%s, CORB %d, RIRB %d\n",
573hdac_dma_cb(
void *callback_arg, bus_dma_segment_t *segs,
int nseg,
int error)
578 dma = (
struct hdac_dma *)callback_arg;
596 bzero(dma,
sizeof(*dma));
601 result = bus_dma_tag_create(
602 bus_get_dma_tag(sc->
dev),
606 BUS_SPACE_MAXADDR_32BIT,
618 device_printf(sc->
dev,
"%s: bus_dma_tag_create failed (%d)\n",
620 goto hdac_dma_alloc_fail;
627 BUS_DMA_NOWAIT | BUS_DMA_ZERO |
632 device_printf(sc->
dev,
"%s: bus_dmamem_alloc failed (%d)\n",
634 goto hdac_dma_alloc_fail;
644 if (result != 0 || dma->
dma_paddr == 0) {
647 device_printf(sc->
dev,
"%s: bus_dmamem_load failed (%d)\n",
649 goto hdac_dma_alloc_fail;
653 device_printf(sc->
dev,
"%s: size=%ju -> roundsz=%ju\n",
654 __func__, (uintmax_t)
size, (uintmax_t)roundsz);
677 BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
686 bus_dma_tag_destroy(dma->
dma_tag);
705 mem->
mem_res = bus_alloc_resource_any(sc->
dev, SYS_RES_MEMORY,
708 device_printf(sc->
dev,
709 "%s: Unable to allocate memory resource\n", __func__);
730 bus_release_resource(sc->
dev, SYS_RES_MEMORY, mem->
mem_rid,
750 (result = pci_msi_count(sc->
dev)) == 1 &&
751 pci_alloc_msi(sc->
dev, &result) == 0)
754 irq->irq_res = bus_alloc_resource_any(sc->
dev, SYS_RES_IRQ,
755 &
irq->irq_rid, RF_SHAREABLE | RF_ACTIVE);
756 if (
irq->irq_res == NULL) {
757 device_printf(sc->
dev,
"%s: Unable to allocate irq\n",
759 goto hdac_irq_alloc_fail;
761 result = bus_setup_intr(sc->
dev,
irq->irq_res, INTR_MPSAFE | INTR_TYPE_AV,
764 device_printf(sc->
dev,
765 "%s: Unable to setup interrupt handler (%d)\n",
767 goto hdac_irq_alloc_fail;
789 if (
irq->irq_res != NULL &&
irq->irq_handle != NULL)
790 bus_teardown_intr(sc->
dev,
irq->irq_res,
irq->irq_handle);
791 if (
irq->irq_res != NULL)
792 bus_release_resource(sc->
dev, SYS_RES_IRQ,
irq->irq_rid,
794 if (
irq->irq_rid == 0x1)
795 pci_release_msi(sc->
dev);
796 irq->irq_handle = NULL;
825 panic(
"%s: Invalid CORB size (%x)\n", __func__, sc->
corb_size);
876 panic(
"%s: Invalid RIRB size (%x)\n", __func__, sc->
rirb_size);
907 BUS_DMASYNC_PREREAD);
945 uint32_t
resp, resp_ex;
952 BUS_DMASYNC_POSTREAD);
955 while (sc->
rirb_rp != rirbwp) {
958 rirb = &rirb_base[sc->
rirb_rp];
968 device_printf(sc->
dev,
"Unexpected unsolicited "
969 "response from address %d: %08x\n", cad,
resp);
978 BUS_DMASYNC_PREREAD);
998 device_is_attached(
child))
1020 verb &= ~HDA_CMD_CAD_MASK;
1042 device_printf(sc->
dev,
"Command 0x%08x timeout on address %d\n",
1048 taskqueue_enqueue(taskqueue_thread, &sc->
unsolq_task);
1070 model = (uint32_t)pci_get_device(
dev) << 16;
1071 model |= (uint32_t)pci_get_vendor(
dev) & 0x0000ffff;
1072 class = pci_get_class(dev);
1080 result = BUS_PROBE_DEFAULT;
1086 snprintf(
desc,
sizeof(
desc),
"%s (0x%04x)",
1088 result = BUS_PROBE_GENERIC;
1095 result = BUS_PROBE_GENERIC;
1097 if (result != ENXIO) {
1098 strlcat(
desc,
" HDA Controller",
sizeof(
desc));
1099 device_set_desc_copy(
dev,
desc);
1135 sc = device_get_softc(
dev);
1137 device_printf(
dev,
"PCI card vendor: 0x%04x, device: 0x%04x\n",
1138 pci_get_subvendor(
dev), pci_get_subdevice(
dev));
1139 device_printf(
dev,
"HDA Driver Revision: %s\n",
1143 model = (uint32_t)pci_get_device(
dev) << 16;
1144 model |= (uint32_t)pci_get_vendor(
dev) & 0x0000ffff;
1145 class = pci_get_class(dev);
1174 if (resource_int_value(device_get_name(
dev),
1175 device_get_unit(
dev),
"msi", &i) == 0) {
1185 device_printf(sc->
dev,
1186 "Config options: on=0x%08x off=0x%08x\n",
1190 if (resource_int_value(device_get_name(
dev),
1191 device_get_unit(
dev),
"polling", &i) == 0 && i != 0)
1196 pci_enable_busmaster(
dev);
1201 v = pci_read_config(
dev, 0x44, 1);
1202 pci_write_config(
dev, 0x44, v & 0xf8, 1);
1204 device_printf(
dev,
"TCSEL: 0x%02d -> 0x%02d\n", v,
1205 pci_read_config(
dev, 0x44, 1));
1209#if defined(__i386__) || defined(__amd64__)
1212 if (resource_int_value(device_get_name(
dev),
1213 device_get_unit(
dev),
"snoop", &i) == 0 && i != 0) {
1215 sc->
flags &= ~HDAC_F_DMA_NOCACHE;
1230 sc->
flags &= ~HDAC_F_DMA_NOCACHE;
1245 "WARNING: Failed to enable PCIe "
1248#if defined(__i386__) || defined(__amd64__)
1254#if defined(__i386__) || defined(__amd64__)
1259 device_printf(
dev,
"DMA Coherency: %s / vendor=0x%04x\n",
1261 "Uncacheable" :
"PCIe snoop",
vendor);
1267 goto hdac_attach_fail;
1270 goto hdac_attach_fail;
1275 goto hdac_attach_fail;
1281 goto hdac_attach_fail;
1285 goto hdac_attach_fail;
1287 M_HDAC, M_ZERO | M_WAITOK);
1288 for (i = 0; i < sc->
num_ss; i++) {
1292 goto hdac_attach_fail;
1297 device_printf(
dev,
"Failed to "
1298 "allocate DMA pos buffer "
1311 result = bus_dma_tag_create(
1312 bus_get_dma_tag(sc->
dev),
1316 BUS_SPACE_MAXADDR_32BIT,
1328 device_printf(
dev,
"%s: bus_dma_tag_create failed (%d)\n",
1330 goto hdac_attach_fail;
1335 device_printf(
dev,
"Reset controller...\n");
1346 if (cold == 0 || config_intrhook_establish(&sc->
intrhook) != 0) {
1356 for (i = 0; i < sc->
num_ss; i++)
1373 int devcount, i, err,
val;
1375 dev = oidp->oid_arg1;
1376 sc = device_get_softc(
dev);
1380 err = sysctl_handle_int(oidp, &
val, 0,
req);
1381 if (err != 0 ||
req->newptr == NULL ||
val == 0)
1388 }
else if (
val == 101) {
1395 if ((err = device_get_children(
dev, &devlist, &devcount)) != 0) {
1401 for (i = 0; i < devcount; i++)
1402 HDAC_PINDUMP(devlist[i]);
1407 free(devlist, M_TEMP);
1414 static const int mbits[8] = { 8, 16, 32, 32, 32, 32, 32, 32 };
1417 if (
fmt & (1 << 14))
1421 rate *= ((
fmt >> 11) & 0x07) + 1;
1422 rate /= ((
fmt >> 8) & 0x07) + 1;
1423 bits = mbits[(
fmt >> 4) & 0x03];
1424 bits *= (
fmt & 0x0f) + 1;
1425 return (
rate * bits);
1431 static const int bbits[8] = { 8, 16, 20, 24, 32, 32, 32, 32 };
1435 rate *= ((
fmt >> 11) & 0x07) + 1;
1436 bits = bbits[(
fmt >> 4) & 0x03];
1437 bits *= (
fmt & 0x0f) + 1;
1439 bits = ((bits + 7) & ~0x07) + 10;
1440 return (
rate * bits);
1446 int i, pollticks, min = 1000000;
1453 for (i = 0; i < sc->
num_ss; i++) {
1457 pollticks = ((uint64_t)hz * s->
blksz) /
1464 if (min > pollticks)
1482 dev = oidp->oid_arg1;
1483 sc = device_get_softc(
dev);
1489 err = sysctl_handle_int(oidp, &
val, 0,
req);
1491 if (err != 0 ||
req->newptr == NULL)
1493 if (val < 0 || val > 1)
1509 ctl &= ~HDAC_INTCTL_GIE;
1525 uint32_t vendorid, revisionid;
1534 if (sc->
intrhook.ich_func != NULL) {
1535 config_intrhook_disestablish(&sc->
intrhook);
1540 device_printf(sc->
dev,
"Starting CORB Engine...\n");
1544 device_printf(sc->
dev,
"Starting RIRB Engine...\n");
1566 device_printf(sc->
dev,
1567 "Enabling controller interrupt...\n");
1578 device_printf(sc->
dev,
"Scanning HDA codecs ...\n");
1584 device_printf(sc->
dev,
1585 "Found CODEC at address %d\n", i);
1595 device_printf(sc->
dev,
1596 "CODEC at address %d not responding!\n", i);
1607 child = device_add_child(sc->
dev,
"hdacc", -1);
1608 if (
child == NULL) {
1609 device_printf(sc->
dev,
1610 "Failed to add CODEC device\n");
1613 device_set_ivars(
child, (
void *)(intptr_t)i);
1617 bus_generic_attach(sc->
dev);
1619 SYSCTL_ADD_PROC(device_get_sysctl_ctx(sc->
dev),
1620 SYSCTL_CHILDREN(device_get_sysctl_tree(sc->
dev)), OID_AUTO,
1621 "pindump", CTLTYPE_INT | CTLFLAG_RW, sc->
dev,
1623 SYSCTL_ADD_PROC(device_get_sysctl_ctx(sc->
dev),
1624 SYSCTL_CHILDREN(device_get_sysctl_tree(sc->
dev)), OID_AUTO,
1625 "polling", CTLTYPE_INT | CTLFLAG_RW, sc->
dev,
1640 device_printf(
dev,
"Suspend...\n");
1642 bus_generic_suspend(
dev);
1646 device_printf(
dev,
"Reset controller...\n");
1652 taskqueue_drain(taskqueue_thread, &sc->
unsolq_task);
1654 device_printf(
dev,
"Suspend done\n");
1671 device_printf(
dev,
"Resume...\n");
1677 device_printf(
dev,
"Reset controller...\n");
1686 device_printf(
dev,
"Starting CORB Engine...\n");
1690 device_printf(
dev,
"Starting RIRB Engine...\n");
1707 device_printf(
dev,
"Enabling controller interrupt...\n");
1718 device_printf(
dev,
"Resume done\n");
1733 int cad, i, devcount,
error;
1735 if ((
error = device_get_children(
dev, &devlist, &devcount)) != 0)
1737 for (i = 0; i < devcount; i++) {
1738 cad = (intptr_t)device_get_ivars(devlist[i]);
1739 if ((
error = device_delete_child(
dev, devlist[i])) != 0) {
1740 free(devlist, M_TEMP);
1745 free(devlist, M_TEMP);
1750 taskqueue_drain(taskqueue_thread, &sc->
unsolq_task);
1753 for (i = 0; i < sc->
num_ss; i++)
1781 retval = bus_print_child_header(
dev,
child);
1782 retval += printf(
" at cad %d", (
int)(intptr_t)device_get_ivars(
child));
1783 retval += bus_print_child_footer(
dev,
child);
1792 sbuf_printf(sb,
"cad=%d", (
int)(intptr_t)device_get_ivars(
child));
1800 nid_t cad = (uintptr_t)device_get_ivars(
child);
1803 "vendor=0x%04x device=0x%04x revision=0x%02x stepping=0x%02x",
1813 nid_t cad = (uintptr_t)device_get_ivars(
child);
1832 *result = pci_get_subvendor(
dev);
1835 *result = pci_get_subdevice(
dev);
1841 *result = (1 << (1 << sc->
num_sdo)) - 1;
1862 (intptr_t)device_get_ivars(
child),
verb));
1873 for (i = 0; i < sc->
num_iss; i++) {
1880 for (i = 0; i < sc->
num_oss; i++) {
1889 for (i = 0; i < sc->
num_bss; i++) {
1905 nid_t cad = (uintptr_t)device_get_ivars(
child);
1906 int stream, ss, bw, maxbw, prevbw;
1920 maxbw = 48000 * 960 * (1 << sc->
num_sdo);
1923 maxbw = 48000 * 464;
1926 device_printf(
dev,
"%dKbps of %dKbps bandwidth used%s\n",
1927 (bw + prevbw) / 1000, maxbw / 1000,
1928 bw + prevbw > maxbw ?
" -- OVERFLOW!" :
"");
1930 if (bw + prevbw > maxbw)
1964 nid_t cad = (uintptr_t)device_get_ivars(
child);
1969 (
"Free for not allocated stream (%d/%d)\n",
dir,
stream));
1990 (
"Start for not allocated stream (%d/%d)\n",
dir,
stream));
1994 for (i = 0; i <
blkcnt; i++, bdle++) {
1996 bdle->
addrh = htole32((uint32_t)(
addr >> 32));
1998 bdle->
ioc = htole32(1);
2016 ctl &= ~HDAC_SDCTL2_DIR;
2017 ctl &= ~HDAC_SDCTL2_STRM_MASK;
2019 ctl &= ~HDAC_SDCTL2_STRIPE_MASK;
2051 (
"Stop for not allocated stream (%d/%d)\n",
dir,
stream));
2081 (
"Reset for not allocated stream (%d/%d)\n",
dir,
stream));
2094 device_printf(
dev,
"Reset setting timeout\n");
2095 ctl &= ~HDAC_SDCTL_SRST;
2105 device_printf(
dev,
"Reset timeout!\n");
2116 (
"Reset for not allocated stream (%d/%d)\n",
dir,
stream));
#define HDA_PARAM_VENDOR_ID
#define HDA_CMD_CAD_SHIFT
#define HDA_PARAM_REVISION_ID_REVISION_ID(param)
#define HDA_PARAM_REVISION_ID
#define HDA_PARAM_VENDOR_ID_DEVICE_ID(param)
#define HDA_CMD_GET_PARAMETER(cad, nid, payload)
#define HDA_PARAM_REVISION_ID_STEPPING_ID(param)
#define HDA_PARAM_VENDOR_ID_VENDOR_ID(param)
static int hdac_probe(device_t)
static int hdac_get_capabilities(struct hdac_softc *)
static void hdac_poll_reinit(struct hdac_softc *sc)
static int hdac_dma_alloc(struct hdac_softc *, struct hdac_dma *, bus_size_t)
static int hdac_attach(device_t)
static const struct @18 hdac_pcie_snoop[]
static void hdac_corb_start(struct hdac_softc *)
static void hdac_mem_free(struct hdac_softc *)
static int hdac_child_location(device_t dev, device_t child, struct sbuf *sb)
DRIVER_MODULE(snd_hda, pci, hdac_driver, hdac_devclass, NULL, NULL)
static void hdac_one_intr(struct hdac_softc *sc, uint32_t intsts)
static int hdac_rirb_flush(struct hdac_softc *sc)
static void hdac_intr_handler(void *)
static int hdac_read_ivar(device_t dev, device_t child, int which, uintptr_t *result)
static int hdac_stream_start(device_t dev, device_t child, int dir, int stream, bus_addr_t buf, int blksz, int blkcnt)
static int hdac_unsol_alloc(device_t dev, device_t child, int tag)
static int hdac_child_pnpinfo_method(device_t dev, device_t child, struct sbuf *sb)
static uint32_t hdac_stream_getptr(device_t dev, device_t child, int dir, int stream)
static void hdac_unsolq_task(void *context, int pending)
static void hdac_poll_callback(void *arg)
static void hdac_irq_free(struct hdac_softc *)
static void hdac_stream_free(device_t dev, device_t child, int dir, int stream)
static int hdac_detach(device_t)
static int hdac_resume(device_t)
static int hdac_unsolq_flush(struct hdac_softc *sc)
static int hdac_mem_alloc(struct hdac_softc *)
static uint32_t hdac_send_command(struct hdac_softc *, nid_t, uint32_t)
static int hdac_suspend(device_t)
static int hdac_find_stream(struct hdac_softc *sc, int dir, int stream)
static void hdac_stream_reset(device_t dev, device_t child, int dir, int stream)
SND_DECLARE_FILE("$FreeBSD$")
static void hdac_corb_init(struct hdac_softc *)
static void hdac_config_fetch(struct hdac_softc *sc, uint32_t *on, uint32_t *off)
static int hdac_reset(struct hdac_softc *, bool)
static int hdac_stream_alloc(device_t dev, device_t child, int dir, int format, int stripe, uint32_t **dmapos)
static int hdac_mdata_rate(uint16_t fmt)
static driver_t hdac_driver
static int sysctl_hdac_pindump(SYSCTL_HANDLER_ARGS)
MALLOC_DEFINE(M_HDAC, "hdac", "HDA Controller")
static void hdac_stream_stop(device_t dev, device_t child, int dir, int stream)
static int hdac_print_child(device_t dev, device_t child)
static struct mtx * hdac_get_mtx(device_t dev, device_t child)
static void hdac_dma_cb(void *, bus_dma_segment_t *, int, int)
static device_method_t hdac_methods[]
static const struct @17 hdac_devices[]
static uint32_t hdac_codec_command(device_t dev, device_t child, uint32_t verb)
static void hdac_dma_free(struct hdac_softc *, struct hdac_dma *)
static const struct @16 hdac_quirks_tab[]
#define HDAC_QUIRK_DMAPOS
static int hdac_irq_alloc(struct hdac_softc *)
static bus_dma_tag_t hdac_get_dma_tag(device_t dev, device_t child)
static void hdac_unsol_free(device_t dev, device_t child, int tag)
static void hdac_rirb_init(struct hdac_softc *)
static int sysctl_hdac_polling(SYSCTL_HANDLER_ARGS)
static devclass_t hdac_devclass
static void hdac_rirb_start(struct hdac_softc *)
static int hdac_bdata_rate(uint16_t fmt, int output)
#define hdac_lockassert(sc)
static void hdac_attach2(void *)
#define HDA_NVIDIA_MCP78_2
#define HDA_INTEL_82801JD
#define PCIS_MULTIMEDIA_HDA
#define HDA_NVIDIA_MCP61_2
#define HDA_NVIDIA_MCP73_2
#define HDA_NVIDIA_GF110_1
#define HDA_NVIDIA_MCP79_2
#define HDA_BOOTHVERBOSE(stmt)
#define HDA_NVIDIA_MCP67_1
#define HDA_NVIDIA_MCP65_1
#define HDA_NVIDIA_MCP65_2
#define HDA_NVIDIA_GF110_2
#define HDA_INTEL_63XXESB
#define HDA_DMA_ALIGNMENT
#define HDA_NVIDIA_MCP78_1
#define HDA_INTEL_PATSBURG
#define HDA_NVIDIA_MCP89_4
#define HDA_NVIDIA_MCP73_1
#define HDA_DEV_MATCH(fl, v)
#define HDA_NVIDIA_MCP79_4
#define HDA_NVIDIA_MCP89_3
#define HDA_NVIDIA_MCP89_1
#define HDA_NVIDIA_MCP79_3
#define HDA_NVIDIA_MCP89_2
#define HDA_INTEL_82801JI
#define HDA_NVIDIA_MCP78_4
#define HDA_NVIDIA_MCP78_3
#define HDA_NVIDIA_MCP67_2
#define HDA_NVIDIA_MCP61_1
#define HDA_NVIDIA_MCP79_1
#define HDA_BOOTVERBOSE(stmt)
#define HDAC_WRITE_1(mem, offset, value)
#define HDAC_READ_4(mem, offset)
#define HDAC_ISDCTL(sc, n)
#define HDAC_OSDCTL(sc, n)
#define HDAC_READ_1(mem, offset)
#define HDAC_F_DMA_NOCACHE
#define HDAC_WRITE_2(mem, offset, value)
#define HDAC_BSDCTL(sc, n)
#define HDAC_RIRB_RESPONSE_EX_UNSOLICITED
#define HDAC_UNSOLQ_READY
#define HDAC_RIRB_RESPONSE_EX_SDATA_IN(response_ex)
#define HDAC_READ_2(mem, offset)
#define HDAC_WRITE_4(mem, offset, value)
#define HDAC_DPLBASE_DPLBASE_DMAPBE
#define HDAC_RIRBCTL_RIRBDMAEN
#define HDAC_SDCTL2_STRIPE_SHIFT
#define HDAC_CORBSIZE_CORBSZCAP_16
#define HDAC_GCAP_BSS(gcap)
#define HDAC_RIRBSIZE_RIRBSZCAP_256
#define HDAC_RIRBSIZE_RIRBSIZE_256
#define HDAC_RIRBSIZE_RIRBSZCAP_2
#define HDAC_CORBSIZE_CORBSIZE(corbsize)
#define HDAC_CORBCTL_CORBRUN
#define HDAC_CORBSIZE_CORBSIZE_256
#define HDAC_STATESTS_SDIWAKE(statests, n)
#define HDAC_RIRBSTS_RINTFL
#define HDAC_CORBCTL_CMEIE
#define HDAC_RIRBSIZE_RIRBSZCAP_16
#define HDAC_RIRBSIZE_RIRBSIZE(rirbsize)
#define HDAC_RIRBSIZE_RIRBSIZE_2
#define HDAC_GCAP_ISS(gcap)
#define HDAC_STATESTS_SDIWAKE_MASK
#define HDAC_RIRBCTL_RINTCTL
#define HDAC_CORBSIZE_CORBSZCAP_256
#define HDAC_SDCTL2_STRM_SHIFT
#define HDAC_RIRBCTL_RIRBOIC
#define HDAC_CORBSIZE_CORBSIZE_2
#define HDAC_INTSTS_SIS_MASK
#define HDAC_RIRBSIZE_RIRBSIZE_16
#define HDAC_GCAP_NSDO(gcap)
#define HDAC_CORBSIZE_CORBSZCAP_2
#define HDAC_RIRBWP_RIRBWPRST
#define HDAC_CORBRP_CORBRPRST
#define HDAC_DPLBASE_DPLBASE_MASK
#define HDAC_CORBSIZE_CORBSIZE_16
#define HDAC_GCAP_OSS(gcap)
void * snd_mtxcreate(const char *desc, const char *type)
void snd_mtxfree(void *m)
bus_space_handle_t mem_handle
struct resource * mem_res
struct hdac_stream * streams
struct callout poll_callout
struct intr_config_hook intrhook
struct hdac_softc::@19 codecs[HDAC_CODEC_MAX]
uint32_t unsolq[HDAC_UNSOLQ_MAX]