svn commit: r310674 - head/sys/dev/sound/pci/hda

Michal Meloun mmel at FreeBSD.org
Wed Dec 28 07:37:28 UTC 2016


Author: mmel
Date: Wed Dec 28 07:37:26 2016
New Revision: 310674
URL: https://svnweb.freebsd.org/changeset/base/310674

Log:
  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.
  
  Reviewed by:	mav
  MFC after:	1 month
  Differential Revision: https://reviews.freebsd.org/D8922

Modified:
  head/sys/dev/sound/pci/hda/hdaa.c
  head/sys/dev/sound/pci/hda/hdac.c
  head/sys/dev/sound/pci/hda/hdac.h

Modified: head/sys/dev/sound/pci/hda/hdaa.c
==============================================================================
--- head/sys/dev/sound/pci/hda/hdaa.c	Wed Dec 28 06:16:55 2016	(r310673)
+++ head/sys/dev/sound/pci/hda/hdaa.c	Wed Dec 28 07:37:26 2016	(r310674)
@@ -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)

Modified: head/sys/dev/sound/pci/hda/hdac.c
==============================================================================
--- head/sys/dev/sound/pci/hda/hdac.c	Wed Dec 28 06:16:55 2016	(r310673)
+++ head/sys/dev/sound/pci/hda/hdac.c	Wed Dec 28 07:37:26 2016	(r310674)
@@ -1767,6 +1767,9 @@ hdac_read_ivar(device_t dev, device_t ch
 	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);
 	}

Modified: head/sys/dev/sound/pci/hda/hdac.h
==============================================================================
--- head/sys/dev/sound/pci/hda/hdac.h	Wed Dec 28 06:16:55 2016	(r310673)
+++ head/sys/dev/sound/pci/hda/hdac.h	Wed Dec 28 07:37:26 2016	(r310674)
@@ -707,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)					\
@@ -723,6 +724,7 @@ HDA_ACCESSOR(subdevice_id,	SUBDEVICE_ID,
 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
 


More information about the svn-src-head mailing list