summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormmel <mmel@FreeBSD.org>2017-04-16 08:04:01 +0000
committermmel <mmel@FreeBSD.org>2017-04-16 08:04:01 +0000
commite056abe3cf377e30f256a3998a34287b71b51280 (patch)
tree3459fcd79f7a449ebf91a30f31a7232d8efdfc3e
parent9c083b051ad6568d0860663b59506c5c30ded0e4 (diff)
downloadFreeBSD-src-e056abe3cf377e30f256a3998a34287b71b51280.zip
FreeBSD-src-e056abe3cf377e30f256a3998a34287b71b51280.tar.gz
MFC r309532,r310674:
r309532: Add IDs for HDA codecs found on Nvidia Tegra SoCs. r310674: Limit number of stripes supported by HDA codec to maximum number announced by HDA controller. Incorrectly implermented HDA codec may report support for more stripes that HDA controller already have. Due to this, always limit number of enabled stripes by global controller maximum.
-rw-r--r--sys/dev/sound/pci/hda/hdaa.c3
-rw-r--r--sys/dev/sound/pci/hda/hdac.c3
-rw-r--r--sys/dev/sound/pci/hda/hdac.h6
-rw-r--r--sys/dev/sound/pci/hda/hdacc.c4
4 files changed, 15 insertions, 1 deletions
diff --git a/sys/dev/sound/pci/hda/hdaa.c b/sys/dev/sound/pci/hda/hdaa.c
index c24f428..9bc9b3e 100644
--- a/sys/dev/sound/pci/hda/hdaa.c
+++ b/sys/dev/sound/pci/hda/hdaa.c
@@ -2130,7 +2130,8 @@ hdaa_channel_start(struct hdaa_chan *ch)
uint32_t fmt;
fmt = hdaa_stream_format(ch);
- ch->stripectl = fls(ch->stripecap & hdaa_allowed_stripes(fmt)) - 1;
+ ch->stripectl = fls(ch->stripecap & hdaa_allowed_stripes(fmt) &
+ hda_get_stripes_mask(devinfo->dev)) - 1;
ch->sid = HDAC_STREAM_ALLOC(device_get_parent(devinfo->dev), devinfo->dev,
ch->dir == PCMDIR_PLAY ? 1 : 0, fmt, ch->stripectl, &ch->dmapos);
if (ch->sid <= 0)
diff --git a/sys/dev/sound/pci/hda/hdac.c b/sys/dev/sound/pci/hda/hdac.c
index 95e8ec2..b4ad32e 100644
--- a/sys/dev/sound/pci/hda/hdac.c
+++ b/sys/dev/sound/pci/hda/hdac.c
@@ -1767,6 +1767,9 @@ hdac_read_ivar(device_t dev, device_t child, int which, uintptr_t *result)
case HDA_IVAR_DMA_NOCACHE:
*result = (sc->flags & HDAC_F_DMA_NOCACHE) != 0;
break;
+ case HDA_IVAR_STRIPES_MASK:
+ *result = (1 << (1 << sc->num_sdo)) - 1;
+ break;
default:
return (ENOENT);
}
diff --git a/sys/dev/sound/pci/hda/hdac.h b/sys/dev/sound/pci/hda/hdac.h
index 2737f89..0849bac 100644
--- a/sys/dev/sound/pci/hda/hdac.h
+++ b/sys/dev/sound/pci/hda/hdac.h
@@ -619,6 +619,10 @@
#define HDA_CODEC_NVIDIAGT440 HDA_CODEC_CONSTRUCT(NVIDIA, 0x0014)
#define HDA_CODEC_NVIDIAGTX550 HDA_CODEC_CONSTRUCT(NVIDIA, 0x0015)
#define HDA_CODEC_NVIDIAGTX570 HDA_CODEC_CONSTRUCT(NVIDIA, 0x0018)
+#define HDA_CODEC_NVIDIATEGRA30 HDA_CODEC_CONSTRUCT(NVIDIA, 0x0020)
+#define HDA_CODEC_NVIDIATEGRA114 HDA_CODEC_CONSTRUCT(NVIDIA, 0x0022)
+#define HDA_CODEC_NVIDIATEGRA124 HDA_CODEC_CONSTRUCT(NVIDIA, 0x0028)
+#define HDA_CODEC_NVIDIATEGRA210 HDA_CODEC_CONSTRUCT(NVIDIA, 0x0029)
#define HDA_CODEC_NVIDIAMCP67 HDA_CODEC_CONSTRUCT(NVIDIA, 0x0067)
#define HDA_CODEC_NVIDIAMCP73 HDA_CODEC_CONSTRUCT(NVIDIA, 0x8001)
#define HDA_CODEC_NVIDIAXXXX HDA_CODEC_CONSTRUCT(NVIDIA, 0xffff)
@@ -703,6 +707,7 @@ enum hdac_device_ivars {
HDA_IVAR_SUBSYSTEM_ID,
HDA_IVAR_NODE_TYPE,
HDA_IVAR_DMA_NOCACHE,
+ HDA_IVAR_STRIPES_MASK,
};
#define HDA_ACCESSOR(var, ivar, type) \
@@ -719,6 +724,7 @@ HDA_ACCESSOR(subdevice_id, SUBDEVICE_ID, uint16_t);
HDA_ACCESSOR(subsystem_id, SUBSYSTEM_ID, uint32_t);
HDA_ACCESSOR(node_type, NODE_TYPE, uint8_t);
HDA_ACCESSOR(dma_nocache, DMA_NOCACHE, uint8_t);
+HDA_ACCESSOR(stripes_mask, STRIPES_MASK, uint8_t);
#define PCIS_MULTIMEDIA_HDA 0x03
diff --git a/sys/dev/sound/pci/hda/hdacc.c b/sys/dev/sound/pci/hda/hdacc.c
index d186a82..9161b4c 100644
--- a/sys/dev/sound/pci/hda/hdacc.c
+++ b/sys/dev/sound/pci/hda/hdacc.c
@@ -314,6 +314,10 @@ static const struct {
{ HDA_CODEC_NVIDIAGT440, 0, "NVIDIA GT440" },
{ HDA_CODEC_NVIDIAGTX550, 0, "NVIDIA GTX550" },
{ HDA_CODEC_NVIDIAGTX570, 0, "NVIDIA GTX570" },
+ { HDA_CODEC_NVIDIATEGRA30, 0, "NVIDIA Tegra30" },
+ { HDA_CODEC_NVIDIATEGRA114, 0, "NVIDIA Tegra114" },
+ { HDA_CODEC_NVIDIATEGRA124, 0, "NVIDIA Tegra124" },
+ { HDA_CODEC_NVIDIATEGRA210, 0, "NVIDIA Tegra210" },
{ HDA_CODEC_INTELIP, 0, "Intel Ibex Peak" },
{ HDA_CODEC_INTELBL, 0, "Intel Bearlake" },
{ HDA_CODEC_INTELCA, 0, "Intel Cantiga" },
OpenPOWER on IntegriCloud