All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] ALSA: HDA: Use AZX_DRIVER_ATI for AMD/ATI platforms
@ 2011-05-25  5:59 Andiry Xu
  2011-05-25  6:29 ` Takashi Iwai
  0 siblings, 1 reply; 4+ messages in thread
From: Andiry Xu @ 2011-05-25  5:59 UTC (permalink / raw)
  To: tiwai; +Cc: alsa-devel

This commit makes AMD/ATI platforms use AZX_DRIVER_ATI for SB HD Audio
and AZX_DRIVER_ATIHDMI for HDMI Audio, so some quirks can be applied to
AMD/ATI platforms without checking the pci vendor ID.

This also spearate SB and HDMI audio, since some quirks should only
apply to SB audio.

Signed-off-by: Andiry Xu <andiry.xu@amd.com>
---
 sound/pci/hda/hda_intel.c |   31 +++++++++++--------------------
 1 files changed, 11 insertions(+), 20 deletions(-)

diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
index 43a0367..05f551c 100644
--- a/sound/pci/hda/hda_intel.c
+++ b/sound/pci/hda/hda_intel.c
@@ -1062,7 +1062,9 @@ static void azx_init_pci(struct azx *chip)
 
 	switch (chip->driver_type) {
 	case AZX_DRIVER_ATI:
-		/* For ATI SB450 azalia HD audio, we need to enable snoop */
+		/* For ATI SB450/600/700/800/900 and AMD Hudson azalia
+		 * HD audio, we need to enable snoop.
+		 */
 		update_pci_byte(chip->pci,
 				ATI_SB450_HDAUDIO_MISC_CNTR2_ADDR, 
 				0x07, ATI_SB450_HDAUDIO_ENABLE_SNOOP);
@@ -1092,13 +1094,6 @@ static void azx_init_pci(struct azx *chip)
 				? "Failed" : "OK");
 		}
 		break;
-	default:
-		/* AMD Hudson needs the similar snoop, as it seems... */
-		if (chip->pci->vendor == PCI_VENDOR_ID_AMD)
-			update_pci_byte(chip->pci,
-				ATI_SB450_HDAUDIO_MISC_CNTR2_ADDR,
-				0x07, ATI_SB450_HDAUDIO_ENABLE_SNOOP);
-		break;
         }
 }
 
@@ -1457,8 +1452,7 @@ static int __devinit azx_codec_create(struct azx *chip, const char *model)
 	 * sequence like the pin-detection.  It seems that forcing the synced
 	 * access works around the stall.  Grrr...
 	 */
-	if (chip->pci->vendor == PCI_VENDOR_ID_AMD ||
-	    chip->pci->vendor == PCI_VENDOR_ID_ATI) {
+	if (chip->driver_type == AZX_DRIVER_ATI) {
 		snd_printk(KERN_INFO SFX "Enable sync_write for AMD chipset\n");
 		chip->bus->sync_write = 1;
 		chip->bus->allow_bus_reset = 1;
@@ -2370,13 +2364,8 @@ static int __devinit check_position_fix(struct azx *chip, int fix)
 		/* Use link position directly, avoid any transfer problem. */
 		return POS_FIX_VIACOMBO;
 	case AZX_DRIVER_ATI:
-		/* ATI chipsets don't work well with position-buffer */
+		/* ATI/AMD chipsets don't support position-buffer */
 		return POS_FIX_LPIB;
-	case AZX_DRIVER_GENERIC:
-		/* AMD chipsets also don't work with position-buffer */
-		if (chip->pci->vendor == PCI_VENDOR_ID_AMD)
-			return POS_FIX_LPIB;
-		break;
 	}
 
 	return POS_FIX_AUTO;
@@ -2800,9 +2789,11 @@ static DEFINE_PCI_DEVICE_TABLE(azx_ids) = {
 	  .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
 	  .class_mask = 0xffffff,
 	  .driver_data = AZX_DRIVER_ICH },
-	/* ATI SB 450/600 */
+	/* ATI SB 450/600/700/800/900 */
 	{ PCI_DEVICE(0x1002, 0x437b), .driver_data = AZX_DRIVER_ATI },
 	{ PCI_DEVICE(0x1002, 0x4383), .driver_data = AZX_DRIVER_ATI },
+	/* AMD Hudson */
+	{ PCI_DEVICE(0x1022, 0x780d), .driver_data = AZX_DRIVER_ATI },
 	/* ATI HDMI */
 	{ PCI_DEVICE(0x1002, 0x793b), .driver_data = AZX_DRIVER_ATIHDMI },
 	{ PCI_DEVICE(0x1002, 0x7919), .driver_data = AZX_DRIVER_ATIHDMI },
@@ -2849,15 +2840,15 @@ static DEFINE_PCI_DEVICE_TABLE(azx_ids) = {
 	{ PCI_DEVICE(0x17f3, 0x3010), .driver_data = AZX_DRIVER_GENERIC },
 	/* VMware HDAudio */
 	{ PCI_DEVICE(0x15ad, 0x1977), .driver_data = AZX_DRIVER_GENERIC },
-	/* AMD/ATI Generic, PCI class code and Vendor ID for HD Audio */
+	/* AMD/ATI Generic, PCI class code and Vendor ID for HDMI Audio */
 	{ PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_ANY_ID),
 	  .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
 	  .class_mask = 0xffffff,
-	  .driver_data = AZX_DRIVER_GENERIC },
+	  .driver_data = AZX_DRIVER_ATIHDMI },
 	{ PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_ANY_ID),
 	  .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
 	  .class_mask = 0xffffff,
-	  .driver_data = AZX_DRIVER_GENERIC },
+	  .driver_data = AZX_DRIVER_ATIHDMI },
 	{ 0, }
 };
 MODULE_DEVICE_TABLE(pci, azx_ids);
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH] ALSA: HDA: Use AZX_DRIVER_ATI for AMD/ATI platforms
  2011-05-25  5:59 [PATCH] ALSA: HDA: Use AZX_DRIVER_ATI for AMD/ATI platforms Andiry Xu
@ 2011-05-25  6:29 ` Takashi Iwai
  2011-05-25  7:16   ` Takashi Iwai
  0 siblings, 1 reply; 4+ messages in thread
From: Takashi Iwai @ 2011-05-25  6:29 UTC (permalink / raw)
  To: Andiry Xu; +Cc: alsa-devel

At Wed, 25 May 2011 13:59:19 +0800,
Andiry Xu wrote:
> 
> This commit makes AMD/ATI platforms use AZX_DRIVER_ATI for SB HD Audio
> and AZX_DRIVER_ATIHDMI for HDMI Audio, so some quirks can be applied to
> AMD/ATI platforms without checking the pci vendor ID.
> 
> This also spearate SB and HDMI audio, since some quirks should only
> apply to SB audio.

To make clear, which quirks should be applied to Hudson and HDMI,
and which quirks shouldn't be applied?  Judging from your change,

- Hudson: No TCSEL, CNTR2 snoop
- HDMI: No TCSEL

What about 64bit DMA?  Do they both support?
Also, I guess both should use LPIB instead of position-buffer?

I'm considering put these information as bit flags into driver_data,
so that it won't fake name as if it's an ATI HDMI board.


thanks,

Takashi

> 
> Signed-off-by: Andiry Xu <andiry.xu@amd.com>
> ---
>  sound/pci/hda/hda_intel.c |   31 +++++++++++--------------------
>  1 files changed, 11 insertions(+), 20 deletions(-)
> 
> diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
> index 43a0367..05f551c 100644
> --- a/sound/pci/hda/hda_intel.c
> +++ b/sound/pci/hda/hda_intel.c
> @@ -1062,7 +1062,9 @@ static void azx_init_pci(struct azx *chip)
>  
>  	switch (chip->driver_type) {
>  	case AZX_DRIVER_ATI:
> -		/* For ATI SB450 azalia HD audio, we need to enable snoop */
> +		/* For ATI SB450/600/700/800/900 and AMD Hudson azalia
> +		 * HD audio, we need to enable snoop.
> +		 */
>  		update_pci_byte(chip->pci,
>  				ATI_SB450_HDAUDIO_MISC_CNTR2_ADDR, 
>  				0x07, ATI_SB450_HDAUDIO_ENABLE_SNOOP);
> @@ -1092,13 +1094,6 @@ static void azx_init_pci(struct azx *chip)
>  				? "Failed" : "OK");
>  		}
>  		break;
> -	default:
> -		/* AMD Hudson needs the similar snoop, as it seems... */
> -		if (chip->pci->vendor == PCI_VENDOR_ID_AMD)
> -			update_pci_byte(chip->pci,
> -				ATI_SB450_HDAUDIO_MISC_CNTR2_ADDR,
> -				0x07, ATI_SB450_HDAUDIO_ENABLE_SNOOP);
> -		break;
>          }
>  }
>  
> @@ -1457,8 +1452,7 @@ static int __devinit azx_codec_create(struct azx *chip, const char *model)
>  	 * sequence like the pin-detection.  It seems that forcing the synced
>  	 * access works around the stall.  Grrr...
>  	 */
> -	if (chip->pci->vendor == PCI_VENDOR_ID_AMD ||
> -	    chip->pci->vendor == PCI_VENDOR_ID_ATI) {
> +	if (chip->driver_type == AZX_DRIVER_ATI) {
>  		snd_printk(KERN_INFO SFX "Enable sync_write for AMD chipset\n");
>  		chip->bus->sync_write = 1;
>  		chip->bus->allow_bus_reset = 1;
> @@ -2370,13 +2364,8 @@ static int __devinit check_position_fix(struct azx *chip, int fix)
>  		/* Use link position directly, avoid any transfer problem. */
>  		return POS_FIX_VIACOMBO;
>  	case AZX_DRIVER_ATI:
> -		/* ATI chipsets don't work well with position-buffer */
> +		/* ATI/AMD chipsets don't support position-buffer */
>  		return POS_FIX_LPIB;
> -	case AZX_DRIVER_GENERIC:
> -		/* AMD chipsets also don't work with position-buffer */
> -		if (chip->pci->vendor == PCI_VENDOR_ID_AMD)
> -			return POS_FIX_LPIB;
> -		break;
>  	}
>  
>  	return POS_FIX_AUTO;
> @@ -2800,9 +2789,11 @@ static DEFINE_PCI_DEVICE_TABLE(azx_ids) = {
>  	  .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
>  	  .class_mask = 0xffffff,
>  	  .driver_data = AZX_DRIVER_ICH },
> -	/* ATI SB 450/600 */
> +	/* ATI SB 450/600/700/800/900 */
>  	{ PCI_DEVICE(0x1002, 0x437b), .driver_data = AZX_DRIVER_ATI },
>  	{ PCI_DEVICE(0x1002, 0x4383), .driver_data = AZX_DRIVER_ATI },
> +	/* AMD Hudson */
> +	{ PCI_DEVICE(0x1022, 0x780d), .driver_data = AZX_DRIVER_ATI },
>  	/* ATI HDMI */
>  	{ PCI_DEVICE(0x1002, 0x793b), .driver_data = AZX_DRIVER_ATIHDMI },
>  	{ PCI_DEVICE(0x1002, 0x7919), .driver_data = AZX_DRIVER_ATIHDMI },
> @@ -2849,15 +2840,15 @@ static DEFINE_PCI_DEVICE_TABLE(azx_ids) = {
>  	{ PCI_DEVICE(0x17f3, 0x3010), .driver_data = AZX_DRIVER_GENERIC },
>  	/* VMware HDAudio */
>  	{ PCI_DEVICE(0x15ad, 0x1977), .driver_data = AZX_DRIVER_GENERIC },
> -	/* AMD/ATI Generic, PCI class code and Vendor ID for HD Audio */
> +	/* AMD/ATI Generic, PCI class code and Vendor ID for HDMI Audio */
>  	{ PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_ANY_ID),
>  	  .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
>  	  .class_mask = 0xffffff,
> -	  .driver_data = AZX_DRIVER_GENERIC },
> +	  .driver_data = AZX_DRIVER_ATIHDMI },
>  	{ PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_ANY_ID),
>  	  .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
>  	  .class_mask = 0xffffff,
> -	  .driver_data = AZX_DRIVER_GENERIC },
> +	  .driver_data = AZX_DRIVER_ATIHDMI },
>  	{ 0, }
>  };
>  MODULE_DEVICE_TABLE(pci, azx_ids);
> -- 
> 1.7.1
> 
> 
> 

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] ALSA: HDA: Use AZX_DRIVER_ATI for AMD/ATI platforms
  2011-05-25  6:29 ` Takashi Iwai
@ 2011-05-25  7:16   ` Takashi Iwai
  2011-05-25  7:19     ` Xu, Andiry
  0 siblings, 1 reply; 4+ messages in thread
From: Takashi Iwai @ 2011-05-25  7:16 UTC (permalink / raw)
  To: Andiry Xu; +Cc: alsa-devel

At Wed, 25 May 2011 08:29:49 +0200,
Takashi Iwai wrote:
> 
> At Wed, 25 May 2011 13:59:19 +0800,
> Andiry Xu wrote:
> > 
> > This commit makes AMD/ATI platforms use AZX_DRIVER_ATI for SB HD Audio
> > and AZX_DRIVER_ATIHDMI for HDMI Audio, so some quirks can be applied to
> > AMD/ATI platforms without checking the pci vendor ID.
> > 
> > This also spearate SB and HDMI audio, since some quirks should only
> > apply to SB audio.
> 
> To make clear, which quirks should be applied to Hudson and HDMI,
> and which quirks shouldn't be applied?  Judging from your change,
> 
> - Hudson: No TCSEL, CNTR2 snoop
> - HDMI: No TCSEL
> 
> What about 64bit DMA?  Do they both support?
> Also, I guess both should use LPIB instead of position-buffer?
> 
> I'm considering put these information as bit flags into driver_data,
> so that it won't fake name as if it's an ATI HDMI board.

I meant the patch like below.  Could you check it?


thanks,

Takashi

===
Subject: [PATCH] ALSA: hda - Reorganize controller quriks with bit flags

Introduce bit-flags indicating the necessary controller quirks, and
set them in pci driver_data field.  This simplifies the checks in the
driver code and avoids the pci-id lookup in different places.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
 sound/pci/hda/hda_intel.c |  188 ++++++++++++++++++++++++++-------------------
 1 files changed, 109 insertions(+), 79 deletions(-)

diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
index 43a0367..6c51f07 100644
--- a/sound/pci/hda/hda_intel.c
+++ b/sound/pci/hda/hda_intel.c
@@ -391,6 +391,7 @@ struct azx {
 
 	/* chip type specific */
 	int driver_type;
+	unsigned int driver_caps;
 	int playback_streams;
 	int playback_index_offset;
 	int capture_streams;
@@ -464,6 +465,32 @@ enum {
 	AZX_NUM_DRIVERS, /* keep this as last entry */
 };
 
+#define AZX_DCAPS_NO_TCSEL	(1 << 8)	/* No Intel TCSEL bit */
+#define AZX_DCAPS_NO_MSI	(1 << 9)	/* No MSI support */
+#define AZX_DCAPS_ATI_SNOOP	(1 << 10)	/* ATI snoop enable */
+#define AZX_DCAPS_NVIDIA_SNOOP	(1 << 11)	/* Nvidia snoop enable */
+#define AZX_DCAPS_SCH_SNOOP	(1 << 12)	/* SCH/PCH snoop enable */
+#define AZX_DCAPS_RIRB_DELAY	(1 << 13)	/* Long delay in read loop */
+#define AZX_DCAPS_RIRB_PRE_DELAY (1 << 14)	/* Put a delay before read */
+#define AZX_DCAPS_CTX_WORKAROUND (1 << 15)	/* X-Fi workaround */
+#define AZX_DCAPS_POSFIX_LPIB	(1 << 16)	/* Use LPIB as default */
+#define AZX_DCAPS_POSFIX_VIA	(1 << 17)	/* Use VIACOMBO as default */
+#define AZX_DCAPS_NO_64BIT	(1 << 18)	/* No 64bit address */
+#define AZX_DCAPS_SYNC_WRITE	(1 << 19)	/* sync each cmd write */
+
+/* quirks for ATI SB / AMD Hudson */
+#define AZX_DCAPS_PRESET_ATI_SB \
+	(AZX_DCAPS_ATI_SNOOP | AZX_DCAPS_NO_TCSEL | \
+	 AZX_DCAPS_SYNC_WRITE | AZX_DCAPS_POSFIX_LPIB)
+
+/* quirks for ATI/AMD HDMI */
+#define AZX_DCAPS_PRESET_ATI_HDMI \
+	(AZX_DCAPS_NO_TCSEL | AZX_DCAPS_SYNC_WRITE | AZX_DCAPS_POSFIX_LPIB)
+
+/* quirks for Nvidia */
+#define AZX_DCAPS_PRESET_NVIDIA \
+	(AZX_DCAPS_NVIDIA_SNOOP | AZX_DCAPS_RIRB_DELAY | AZX_DCAPS_NO_MSI)
+
 static char *driver_short_names[] __devinitdata = {
 	[AZX_DRIVER_ICH] = "HDA Intel",
 	[AZX_DRIVER_PCH] = "HDA Intel PCH",
@@ -566,7 +593,7 @@ static void azx_init_cmd_io(struct azx *chip)
 	/* reset the rirb hw write pointer */
 	azx_writew(chip, RIRBWP, ICH6_RIRBWP_RST);
 	/* set N=1, get RIRB response interrupt for new entry */
-	if (chip->driver_type == AZX_DRIVER_CTX)
+	if (chip->driver_caps & AZX_DCAPS_CTX_WORKAROUND)
 		azx_writew(chip, RINTCNT, 0xc0);
 	else
 		azx_writew(chip, RINTCNT, 1);
@@ -1056,19 +1083,19 @@ static void azx_init_pci(struct azx *chip)
 	 * codecs.
 	 * The PCI register TCSEL is defined in the Intel manuals.
 	 */
-	if (chip->driver_type != AZX_DRIVER_ATI &&
-	    chip->driver_type != AZX_DRIVER_ATIHDMI)
+	if (chip->driver_caps & AZX_DCAPS_NO_TCSEL)
 		update_pci_byte(chip->pci, ICH6_PCIREG_TCSEL, 0x07, 0);
 
-	switch (chip->driver_type) {
-	case AZX_DRIVER_ATI:
-		/* For ATI SB450 azalia HD audio, we need to enable snoop */
+	/* For ATI SB450/600/700/800/900 and AMD Hudson azalia HD audio,
+	 * we need to enable snoop.
+	 */
+	if (chip->driver_caps & AZX_DCAPS_ATI_SNOOP)
 		update_pci_byte(chip->pci,
 				ATI_SB450_HDAUDIO_MISC_CNTR2_ADDR, 
 				0x07, ATI_SB450_HDAUDIO_ENABLE_SNOOP);
-		break;
-	case AZX_DRIVER_NVIDIA:
-		/* For NVIDIA HDA, enable snoop */
+
+	/* For NVIDIA HDA, enable snoop */
+	if (chip->driver_caps & AZX_DCAPS_NVIDIA_SNOOP) {
 		update_pci_byte(chip->pci,
 				NVIDIA_HDA_TRANSREG_ADDR,
 				0x0f, NVIDIA_HDA_ENABLE_COHBITS);
@@ -1078,9 +1105,10 @@ static void azx_init_pci(struct azx *chip)
 		update_pci_byte(chip->pci,
 				NVIDIA_HDA_OSTRM_COH,
 				0x01, NVIDIA_HDA_ENABLE_COHBIT);
-		break;
-	case AZX_DRIVER_SCH:
-	case AZX_DRIVER_PCH:
+	}
+
+	/* Enable SCH/PCH snoop if needed */
+	if (chip->driver_caps & AZX_DCAPS_SCH_SNOOP) {
 		pci_read_config_word(chip->pci, INTEL_SCH_HDA_DEVC, &snoop);
 		if (snoop & INTEL_SCH_HDA_DEVC_NOSNOOP) {
 			pci_write_config_word(chip->pci, INTEL_SCH_HDA_DEVC,
@@ -1091,14 +1119,6 @@ static void azx_init_pci(struct azx *chip)
 				(snoop & INTEL_SCH_HDA_DEVC_NOSNOOP)
 				? "Failed" : "OK");
 		}
-		break;
-	default:
-		/* AMD Hudson needs the similar snoop, as it seems... */
-		if (chip->pci->vendor == PCI_VENDOR_ID_AMD)
-			update_pci_byte(chip->pci,
-				ATI_SB450_HDAUDIO_MISC_CNTR2_ADDR,
-				0x07, ATI_SB450_HDAUDIO_ENABLE_SNOOP);
-		break;
         }
 }
 
@@ -1152,7 +1172,7 @@ static irqreturn_t azx_interrupt(int irq, void *dev_id)
 	status = azx_readb(chip, RIRBSTS);
 	if (status & RIRB_INT_MASK) {
 		if (status & RIRB_INT_RESPONSE) {
-			if (chip->driver_type == AZX_DRIVER_CTX)
+			if (chip->driver_caps & AZX_DCAPS_RIRB_PRE_DELAY)
 				udelay(80);
 			azx_update_rirb(chip);
 		}
@@ -1421,7 +1441,7 @@ static int __devinit azx_codec_create(struct azx *chip, const char *model)
 	if (err < 0)
 		return err;
 
-	if (chip->driver_type == AZX_DRIVER_NVIDIA)
+	if (chip->driver_caps & AZX_DCAPS_RIRB_DELAY)
 		chip->bus->needs_damn_long_delay = 1;
 
 	codecs = 0;
@@ -1720,7 +1740,7 @@ static int azx_pcm_prepare(struct snd_pcm_substream *substream)
 
 	stream_tag = azx_dev->stream_tag;
 	/* CA-IBG chips need the playback stream starting from 1 */
-	if (chip->driver_type == AZX_DRIVER_CTX &&
+	if ((chip->driver_caps & AZX_DCAPS_CTX_WORKAROUND) &&
 	    stream_tag > chip->capture_streams)
 		stream_tag -= chip->capture_streams;
 	return snd_hda_codec_prepare(apcm->codec, hinfo, stream_tag,
@@ -2365,20 +2385,10 @@ static int __devinit check_position_fix(struct azx *chip, int fix)
 	}
 
 	/* Check VIA/ATI HD Audio Controller exist */
-	switch (chip->driver_type) {
-	case AZX_DRIVER_VIA:
-		/* Use link position directly, avoid any transfer problem. */
+	if (chip->driver_caps & AZX_DCAPS_POSFIX_VIA) 
 		return POS_FIX_VIACOMBO;
-	case AZX_DRIVER_ATI:
-		/* ATI chipsets don't work well with position-buffer */
+	if (chip->driver_caps & AZX_DCAPS_POSFIX_LPIB) 
 		return POS_FIX_LPIB;
-	case AZX_DRIVER_GENERIC:
-		/* AMD chipsets also don't work with position-buffer */
-		if (chip->pci->vendor == PCI_VENDOR_ID_AMD)
-			return POS_FIX_LPIB;
-		break;
-	}
-
 	return POS_FIX_AUTO;
 }
 
@@ -2460,8 +2470,8 @@ static void __devinit check_msi(struct azx *chip)
 	}
 
 	/* NVidia chipsets seem to cause troubles with MSI */
-	if (chip->driver_type == AZX_DRIVER_NVIDIA) {
-		printk(KERN_INFO "hda_intel: Disable MSI for Nvidia chipset\n");
+	if (chip->driver_caps & AZX_DCAPS_NO_MSI) {
+		printk(KERN_INFO "hda_intel: Disable MSI\n");
 		chip->msi = 0;
 	}
 }
@@ -2471,7 +2481,7 @@ static void __devinit check_msi(struct azx *chip)
  * constructor
  */
 static int __devinit azx_create(struct snd_card *card, struct pci_dev *pci,
-				int dev, int driver_type,
+				int dev, unsigned int driver_caps,
 				struct azx **rchip)
 {
 	struct azx *chip;
@@ -2499,7 +2509,8 @@ static int __devinit azx_create(struct snd_card *card, struct pci_dev *pci,
 	chip->card = card;
 	chip->pci = pci;
 	chip->irq = -1;
-	chip->driver_type = driver_type;
+	chip->driver_caps = driver_caps;
+	chip->driver_type = driver_caps & 0xff;
 	check_msi(chip);
 	chip->dev_index = dev;
 	INIT_WORK(&chip->irq_pending_work, azx_irq_pending_work);
@@ -2563,8 +2574,7 @@ static int __devinit azx_create(struct snd_card *card, struct pci_dev *pci,
 	snd_printdd(SFX "chipset global capabilities = 0x%x\n", gcap);
 
 	/* disable SB600 64bit support for safety */
-	if ((chip->driver_type == AZX_DRIVER_ATI) ||
-	    (chip->driver_type == AZX_DRIVER_ATIHDMI)) {
+	if (chip->pci->vendor == PCI_VENDOR_ID_ATI) {
 		struct pci_dev *p_smbus;
 		p_smbus = pci_get_device(PCI_VENDOR_ID_ATI,
 					 PCI_DEVICE_ID_ATI_SBX00_SMBUS,
@@ -2574,18 +2584,10 @@ static int __devinit azx_create(struct snd_card *card, struct pci_dev *pci,
 				gcap &= ~ICH6_GCAP_64OK;
 			pci_dev_put(p_smbus);
 		}
-	} else {
-		/* FIXME: not sure whether this is really needed, but
-		 * Hudson isn't stable enough for allowing everything...
-		 * let's check later again.
-		 */
-		if (chip->pci->vendor == PCI_VENDOR_ID_AMD)
-			gcap &= ~ICH6_GCAP_64OK;
 	}
 
-	/* disable 64bit DMA address for Teradici */
-	/* it does not work with device 6549:1200 subsys e4a2:040b */
-	if (chip->driver_type == AZX_DRIVER_TERA)
+	/* disable 64bit DMA address on some devices */
+	if (chip->driver_caps & AZX_DCAPS_NO_64BIT)
 		gcap &= ~ICH6_GCAP_64OK;
 
 	/* allow 64bit DMA address if supported by H/W */
@@ -2788,38 +2790,62 @@ static void __devexit azx_remove(struct pci_dev *pci)
 /* PCI IDs */
 static DEFINE_PCI_DEVICE_TABLE(azx_ids) = {
 	/* CPT */
-	{ PCI_DEVICE(0x8086, 0x1c20), .driver_data = AZX_DRIVER_PCH },
+	{ PCI_DEVICE(0x8086, 0x1c20),
+	  .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP },
 	/* PBG */
-	{ PCI_DEVICE(0x8086, 0x1d20), .driver_data = AZX_DRIVER_PCH },
+	{ PCI_DEVICE(0x8086, 0x1d20),
+	  .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP },
 	/* Panther Point */
-	{ PCI_DEVICE(0x8086, 0x1e20), .driver_data = AZX_DRIVER_PCH },
+	{ PCI_DEVICE(0x8086, 0x1e20),
+	  .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP },
 	/* SCH */
-	{ PCI_DEVICE(0x8086, 0x811b), .driver_data = AZX_DRIVER_SCH },
+	{ PCI_DEVICE(0x8086, 0x811b),
+	  .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_SCH_SNOOP },
 	/* Generic Intel */
 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_ANY_ID),
 	  .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
 	  .class_mask = 0xffffff,
 	  .driver_data = AZX_DRIVER_ICH },
-	/* ATI SB 450/600 */
-	{ PCI_DEVICE(0x1002, 0x437b), .driver_data = AZX_DRIVER_ATI },
-	{ PCI_DEVICE(0x1002, 0x4383), .driver_data = AZX_DRIVER_ATI },
+	/* ATI SB 450/600/700/800/900 */
+	{ PCI_DEVICE(0x1002, 0x437b),
+	  .driver_data = AZX_DRIVER_ATI | AZX_DCAPS_PRESET_ATI_SB },
+	{ PCI_DEVICE(0x1002, 0x4383),
+	  .driver_data = AZX_DRIVER_ATI | AZX_DCAPS_PRESET_ATI_SB },
+	/* AMD Hudson */
+	{ PCI_DEVICE(0x1022, 0x780d),
+	  .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_ATI_SB },
 	/* ATI HDMI */
-	{ PCI_DEVICE(0x1002, 0x793b), .driver_data = AZX_DRIVER_ATIHDMI },
-	{ PCI_DEVICE(0x1002, 0x7919), .driver_data = AZX_DRIVER_ATIHDMI },
-	{ PCI_DEVICE(0x1002, 0x960f), .driver_data = AZX_DRIVER_ATIHDMI },
-	{ PCI_DEVICE(0x1002, 0x970f), .driver_data = AZX_DRIVER_ATIHDMI },
-	{ PCI_DEVICE(0x1002, 0xaa00), .driver_data = AZX_DRIVER_ATIHDMI },
-	{ PCI_DEVICE(0x1002, 0xaa08), .driver_data = AZX_DRIVER_ATIHDMI },
-	{ PCI_DEVICE(0x1002, 0xaa10), .driver_data = AZX_DRIVER_ATIHDMI },
-	{ PCI_DEVICE(0x1002, 0xaa18), .driver_data = AZX_DRIVER_ATIHDMI },
-	{ PCI_DEVICE(0x1002, 0xaa20), .driver_data = AZX_DRIVER_ATIHDMI },
-	{ PCI_DEVICE(0x1002, 0xaa28), .driver_data = AZX_DRIVER_ATIHDMI },
-	{ PCI_DEVICE(0x1002, 0xaa30), .driver_data = AZX_DRIVER_ATIHDMI },
-	{ PCI_DEVICE(0x1002, 0xaa38), .driver_data = AZX_DRIVER_ATIHDMI },
-	{ PCI_DEVICE(0x1002, 0xaa40), .driver_data = AZX_DRIVER_ATIHDMI },
-	{ PCI_DEVICE(0x1002, 0xaa48), .driver_data = AZX_DRIVER_ATIHDMI },
+	{ PCI_DEVICE(0x1002, 0x793b),
+	  .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
+	{ PCI_DEVICE(0x1002, 0x7919),
+	  .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
+	{ PCI_DEVICE(0x1002, 0x960f),
+	  .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
+	{ PCI_DEVICE(0x1002, 0x970f),
+	  .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
+	{ PCI_DEVICE(0x1002, 0xaa00),
+	  .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
+	{ PCI_DEVICE(0x1002, 0xaa08),
+	  .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
+	{ PCI_DEVICE(0x1002, 0xaa10),
+	  .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
+	{ PCI_DEVICE(0x1002, 0xaa18),
+	  .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
+	{ PCI_DEVICE(0x1002, 0xaa20),
+	  .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
+	{ PCI_DEVICE(0x1002, 0xaa28),
+	  .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
+	{ PCI_DEVICE(0x1002, 0xaa30),
+	  .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
+	{ PCI_DEVICE(0x1002, 0xaa38),
+	  .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
+	{ PCI_DEVICE(0x1002, 0xaa40),
+	  .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
+	{ PCI_DEVICE(0x1002, 0xaa48),
+	  .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
 	/* VIA VT8251/VT8237A */
-	{ PCI_DEVICE(0x1106, 0x3288), .driver_data = AZX_DRIVER_VIA },
+	{ PCI_DEVICE(0x1106, 0x3288),
+	  .driver_data = AZX_DRIVER_VIA | AZX_DCAPS_POSFIX_VIA },
 	/* SIS966 */
 	{ PCI_DEVICE(0x1039, 0x7502), .driver_data = AZX_DRIVER_SIS },
 	/* ULI M5461 */
@@ -2828,9 +2854,10 @@ static DEFINE_PCI_DEVICE_TABLE(azx_ids) = {
 	{ PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID),
 	  .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
 	  .class_mask = 0xffffff,
-	  .driver_data = AZX_DRIVER_NVIDIA },
+	  .driver_data = AZX_DRIVER_NVIDIA | AZX_DCAPS_PRESET_NVIDIA },
 	/* Teradici */
-	{ PCI_DEVICE(0x6549, 0x1200), .driver_data = AZX_DRIVER_TERA },
+	{ PCI_DEVICE(0x6549, 0x1200),
+	  .driver_data = AZX_DRIVER_TERA | AZX_DCAPS_NO_64BIT },
 	/* Creative X-Fi (CA0110-IBG) */
 #if !defined(CONFIG_SND_CTXFI) && !defined(CONFIG_SND_CTXFI_MODULE)
 	/* the following entry conflicts with snd-ctxfi driver,
@@ -2840,10 +2867,13 @@ static DEFINE_PCI_DEVICE_TABLE(azx_ids) = {
 	{ PCI_DEVICE(PCI_VENDOR_ID_CREATIVE, PCI_ANY_ID),
 	  .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
 	  .class_mask = 0xffffff,
-	  .driver_data = AZX_DRIVER_CTX },
+	  .driver_data = AZX_DRIVER_CTX | AZX_DCAPS_CTX_WORKAROUND |
+	  AZX_DCAPS_RIRB_PRE_DELAY },
 #else
 	/* this entry seems still valid -- i.e. without emu20kx chip */
-	{ PCI_DEVICE(0x1102, 0x0009), .driver_data = AZX_DRIVER_CTX },
+	{ PCI_DEVICE(0x1102, 0x0009),
+	  .driver_data = AZX_DRIVER_CTX | AZX_DCAPS_CTX_WORKAROUND |
+	  AZX_DCAPS_RIRB_PRE_DELAY },
 #endif
 	/* Vortex86MX */
 	{ PCI_DEVICE(0x17f3, 0x3010), .driver_data = AZX_DRIVER_GENERIC },
@@ -2853,11 +2883,11 @@ static DEFINE_PCI_DEVICE_TABLE(azx_ids) = {
 	{ PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_ANY_ID),
 	  .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
 	  .class_mask = 0xffffff,
-	  .driver_data = AZX_DRIVER_GENERIC },
+	  .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_ATI_HDMI },
 	{ PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_ANY_ID),
 	  .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
 	  .class_mask = 0xffffff,
-	  .driver_data = AZX_DRIVER_GENERIC },
+	  .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_ATI_HDMI },
 	{ 0, }
 };
 MODULE_DEVICE_TABLE(pci, azx_ids);
-- 
1.7.4.2

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH] ALSA: HDA: Use AZX_DRIVER_ATI for AMD/ATI platforms
  2011-05-25  7:16   ` Takashi Iwai
@ 2011-05-25  7:19     ` Xu, Andiry
  0 siblings, 0 replies; 4+ messages in thread
From: Xu, Andiry @ 2011-05-25  7:19 UTC (permalink / raw)
  To: Takashi Iwai; +Cc: alsa-devel

> -----Original Message-----
> From: Takashi Iwai [mailto:tiwai@suse.de]
> Sent: Wednesday, May 25, 2011 3:16 PM
> To: Xu, Andiry
> Cc: alsa-devel@alsa-project.org
> Subject: Re: [PATCH] ALSA: HDA: Use AZX_DRIVER_ATI for AMD/ATI
> platforms
> 
> At Wed, 25 May 2011 08:29:49 +0200,
> Takashi Iwai wrote:
> >
> > At Wed, 25 May 2011 13:59:19 +0800,
> > Andiry Xu wrote:
> > >
> > > This commit makes AMD/ATI platforms use AZX_DRIVER_ATI for SB HD
> Audio
> > > and AZX_DRIVER_ATIHDMI for HDMI Audio, so some quirks can be
> applied to
> > > AMD/ATI platforms without checking the pci vendor ID.
> > >
> > > This also spearate SB and HDMI audio, since some quirks should
only
> > > apply to SB audio.
> >
> > To make clear, which quirks should be applied to Hudson and HDMI,
> > and which quirks shouldn't be applied?  Judging from your change,
> >
> > - Hudson: No TCSEL, CNTR2 snoop
> > - HDMI: No TCSEL
> >
> > What about 64bit DMA?  Do they both support?
> > Also, I guess both should use LPIB instead of position-buffer?
> >
> > I'm considering put these information as bit flags into driver_data,
> > so that it won't fake name as if it's an ATI HDMI board.
> 
> I meant the patch like below.  Could you check it?
> 
> 
> thanks,
> 

Hmm. I'll check the patch below and double check HDA/HDMI differences as
well. Thanks.

Thanks,
Andiry 


> 
> ===
> Subject: [PATCH] ALSA: hda - Reorganize controller quriks with bit
> flags
> 
> Introduce bit-flags indicating the necessary controller quirks, and
> set them in pci driver_data field.  This simplifies the checks in the
> driver code and avoids the pci-id lookup in different places.
> 
> Signed-off-by: Takashi Iwai <tiwai@suse.de>
> ---
>  sound/pci/hda/hda_intel.c |  188
++++++++++++++++++++++++++-----------
> --------
>  1 files changed, 109 insertions(+), 79 deletions(-)
> 
> diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
> index 43a0367..6c51f07 100644
> --- a/sound/pci/hda/hda_intel.c
> +++ b/sound/pci/hda/hda_intel.c
> @@ -391,6 +391,7 @@ struct azx {
> 
>  	/* chip type specific */
>  	int driver_type;
> +	unsigned int driver_caps;
>  	int playback_streams;
>  	int playback_index_offset;
>  	int capture_streams;
> @@ -464,6 +465,32 @@ enum {
>  	AZX_NUM_DRIVERS, /* keep this as last entry */
>  };
> 
> +#define AZX_DCAPS_NO_TCSEL	(1 << 8)	/* No Intel TCSEL bit */
> +#define AZX_DCAPS_NO_MSI	(1 << 9)	/* No MSI support */
> +#define AZX_DCAPS_ATI_SNOOP	(1 << 10)	/* ATI snoop enable */
> +#define AZX_DCAPS_NVIDIA_SNOOP	(1 << 11)	/* Nvidia snoop
enable
> */
> +#define AZX_DCAPS_SCH_SNOOP	(1 << 12)	/* SCH/PCH snoop enable
*/
> +#define AZX_DCAPS_RIRB_DELAY	(1 << 13)	/* Long delay in read
loop */
> +#define AZX_DCAPS_RIRB_PRE_DELAY (1 << 14)	/* Put a delay before
> read */
> +#define AZX_DCAPS_CTX_WORKAROUND (1 << 15)	/* X-Fi workaround */
> +#define AZX_DCAPS_POSFIX_LPIB	(1 << 16)	/* Use LPIB as
default
> */
> +#define AZX_DCAPS_POSFIX_VIA	(1 << 17)	/* Use VIACOMBO as
default */
> +#define AZX_DCAPS_NO_64BIT	(1 << 18)	/* No 64bit address */
> +#define AZX_DCAPS_SYNC_WRITE	(1 << 19)	/* sync each cmd write
*/
> +
> +/* quirks for ATI SB / AMD Hudson */
> +#define AZX_DCAPS_PRESET_ATI_SB \
> +	(AZX_DCAPS_ATI_SNOOP | AZX_DCAPS_NO_TCSEL | \
> +	 AZX_DCAPS_SYNC_WRITE | AZX_DCAPS_POSFIX_LPIB)
> +
> +/* quirks for ATI/AMD HDMI */
> +#define AZX_DCAPS_PRESET_ATI_HDMI \
> +	(AZX_DCAPS_NO_TCSEL | AZX_DCAPS_SYNC_WRITE |
> AZX_DCAPS_POSFIX_LPIB)
> +
> +/* quirks for Nvidia */
> +#define AZX_DCAPS_PRESET_NVIDIA \
> +	(AZX_DCAPS_NVIDIA_SNOOP | AZX_DCAPS_RIRB_DELAY |
AZX_DCAPS_NO_MSI)
> +
>  static char *driver_short_names[] __devinitdata = {
>  	[AZX_DRIVER_ICH] = "HDA Intel",
>  	[AZX_DRIVER_PCH] = "HDA Intel PCH",
> @@ -566,7 +593,7 @@ static void azx_init_cmd_io(struct azx *chip)
>  	/* reset the rirb hw write pointer */
>  	azx_writew(chip, RIRBWP, ICH6_RIRBWP_RST);
>  	/* set N=1, get RIRB response interrupt for new entry */
> -	if (chip->driver_type == AZX_DRIVER_CTX)
> +	if (chip->driver_caps & AZX_DCAPS_CTX_WORKAROUND)
>  		azx_writew(chip, RINTCNT, 0xc0);
>  	else
>  		azx_writew(chip, RINTCNT, 1);
> @@ -1056,19 +1083,19 @@ static void azx_init_pci(struct azx *chip)
>  	 * codecs.
>  	 * The PCI register TCSEL is defined in the Intel manuals.
>  	 */
> -	if (chip->driver_type != AZX_DRIVER_ATI &&
> -	    chip->driver_type != AZX_DRIVER_ATIHDMI)
> +	if (chip->driver_caps & AZX_DCAPS_NO_TCSEL)
>  		update_pci_byte(chip->pci, ICH6_PCIREG_TCSEL, 0x07, 0);
> 
> -	switch (chip->driver_type) {
> -	case AZX_DRIVER_ATI:
> -		/* For ATI SB450 azalia HD audio, we need to enable
snoop
> */
> +	/* For ATI SB450/600/700/800/900 and AMD Hudson azalia HD audio,
> +	 * we need to enable snoop.
> +	 */
> +	if (chip->driver_caps & AZX_DCAPS_ATI_SNOOP)
>  		update_pci_byte(chip->pci,
>  				ATI_SB450_HDAUDIO_MISC_CNTR2_ADDR,
>  				0x07, ATI_SB450_HDAUDIO_ENABLE_SNOOP);
> -		break;
> -	case AZX_DRIVER_NVIDIA:
> -		/* For NVIDIA HDA, enable snoop */
> +
> +	/* For NVIDIA HDA, enable snoop */
> +	if (chip->driver_caps & AZX_DCAPS_NVIDIA_SNOOP) {
>  		update_pci_byte(chip->pci,
>  				NVIDIA_HDA_TRANSREG_ADDR,
>  				0x0f, NVIDIA_HDA_ENABLE_COHBITS);
> @@ -1078,9 +1105,10 @@ static void azx_init_pci(struct azx *chip)
>  		update_pci_byte(chip->pci,
>  				NVIDIA_HDA_OSTRM_COH,
>  				0x01, NVIDIA_HDA_ENABLE_COHBIT);
> -		break;
> -	case AZX_DRIVER_SCH:
> -	case AZX_DRIVER_PCH:
> +	}
> +
> +	/* Enable SCH/PCH snoop if needed */
> +	if (chip->driver_caps & AZX_DCAPS_SCH_SNOOP) {
>  		pci_read_config_word(chip->pci, INTEL_SCH_HDA_DEVC,
&snoop);
>  		if (snoop & INTEL_SCH_HDA_DEVC_NOSNOOP) {
>  			pci_write_config_word(chip->pci,
INTEL_SCH_HDA_DEVC,
> @@ -1091,14 +1119,6 @@ static void azx_init_pci(struct azx *chip)
>  				(snoop & INTEL_SCH_HDA_DEVC_NOSNOOP)
>  				? "Failed" : "OK");
>  		}
> -		break;
> -	default:
> -		/* AMD Hudson needs the similar snoop, as it seems... */
> -		if (chip->pci->vendor == PCI_VENDOR_ID_AMD)
> -			update_pci_byte(chip->pci,
> -				ATI_SB450_HDAUDIO_MISC_CNTR2_ADDR,
> -				0x07, ATI_SB450_HDAUDIO_ENABLE_SNOOP);
> -		break;
>          }
>  }
> 
> @@ -1152,7 +1172,7 @@ static irqreturn_t azx_interrupt(int irq, void
> *dev_id)
>  	status = azx_readb(chip, RIRBSTS);
>  	if (status & RIRB_INT_MASK) {
>  		if (status & RIRB_INT_RESPONSE) {
> -			if (chip->driver_type == AZX_DRIVER_CTX)
> +			if (chip->driver_caps &
AZX_DCAPS_RIRB_PRE_DELAY)
>  				udelay(80);
>  			azx_update_rirb(chip);
>  		}
> @@ -1421,7 +1441,7 @@ static int __devinit azx_codec_create(struct azx
> *chip, const char *model)
>  	if (err < 0)
>  		return err;
> 
> -	if (chip->driver_type == AZX_DRIVER_NVIDIA)
> +	if (chip->driver_caps & AZX_DCAPS_RIRB_DELAY)
>  		chip->bus->needs_damn_long_delay = 1;
> 
>  	codecs = 0;
> @@ -1720,7 +1740,7 @@ static int azx_pcm_prepare(struct
> snd_pcm_substream *substream)
> 
>  	stream_tag = azx_dev->stream_tag;
>  	/* CA-IBG chips need the playback stream starting from 1 */
> -	if (chip->driver_type == AZX_DRIVER_CTX &&
> +	if ((chip->driver_caps & AZX_DCAPS_CTX_WORKAROUND) &&
>  	    stream_tag > chip->capture_streams)
>  		stream_tag -= chip->capture_streams;
>  	return snd_hda_codec_prepare(apcm->codec, hinfo, stream_tag,
> @@ -2365,20 +2385,10 @@ static int __devinit check_position_fix(struct
> azx *chip, int fix)
>  	}
> 
>  	/* Check VIA/ATI HD Audio Controller exist */
> -	switch (chip->driver_type) {
> -	case AZX_DRIVER_VIA:
> -		/* Use link position directly, avoid any transfer
problem.
> */
> +	if (chip->driver_caps & AZX_DCAPS_POSFIX_VIA)
>  		return POS_FIX_VIACOMBO;
> -	case AZX_DRIVER_ATI:
> -		/* ATI chipsets don't work well with position-buffer */
> +	if (chip->driver_caps & AZX_DCAPS_POSFIX_LPIB)
>  		return POS_FIX_LPIB;
> -	case AZX_DRIVER_GENERIC:
> -		/* AMD chipsets also don't work with position-buffer */
> -		if (chip->pci->vendor == PCI_VENDOR_ID_AMD)
> -			return POS_FIX_LPIB;
> -		break;
> -	}
> -
>  	return POS_FIX_AUTO;
>  }
> 
> @@ -2460,8 +2470,8 @@ static void __devinit check_msi(struct azx
*chip)
>  	}
> 
>  	/* NVidia chipsets seem to cause troubles with MSI */
> -	if (chip->driver_type == AZX_DRIVER_NVIDIA) {
> -		printk(KERN_INFO "hda_intel: Disable MSI for Nvidia
> chipset\n");
> +	if (chip->driver_caps & AZX_DCAPS_NO_MSI) {
> +		printk(KERN_INFO "hda_intel: Disable MSI\n");
>  		chip->msi = 0;
>  	}
>  }
> @@ -2471,7 +2481,7 @@ static void __devinit check_msi(struct azx
*chip)
>   * constructor
>   */
>  static int __devinit azx_create(struct snd_card *card, struct pci_dev
> *pci,
> -				int dev, int driver_type,
> +				int dev, unsigned int driver_caps,
>  				struct azx **rchip)
>  {
>  	struct azx *chip;
> @@ -2499,7 +2509,8 @@ static int __devinit azx_create(struct snd_card
> *card, struct pci_dev *pci,
>  	chip->card = card;
>  	chip->pci = pci;
>  	chip->irq = -1;
> -	chip->driver_type = driver_type;
> +	chip->driver_caps = driver_caps;
> +	chip->driver_type = driver_caps & 0xff;
>  	check_msi(chip);
>  	chip->dev_index = dev;
>  	INIT_WORK(&chip->irq_pending_work, azx_irq_pending_work);
> @@ -2563,8 +2574,7 @@ static int __devinit azx_create(struct snd_card
> *card, struct pci_dev *pci,
>  	snd_printdd(SFX "chipset global capabilities = 0x%x\n", gcap);
> 
>  	/* disable SB600 64bit support for safety */
> -	if ((chip->driver_type == AZX_DRIVER_ATI) ||
> -	    (chip->driver_type == AZX_DRIVER_ATIHDMI)) {
> +	if (chip->pci->vendor == PCI_VENDOR_ID_ATI) {
>  		struct pci_dev *p_smbus;
>  		p_smbus = pci_get_device(PCI_VENDOR_ID_ATI,
>  					 PCI_DEVICE_ID_ATI_SBX00_SMBUS,
> @@ -2574,18 +2584,10 @@ static int __devinit azx_create(struct
snd_card
> *card, struct pci_dev *pci,
>  				gcap &= ~ICH6_GCAP_64OK;
>  			pci_dev_put(p_smbus);
>  		}
> -	} else {
> -		/* FIXME: not sure whether this is really needed, but
> -		 * Hudson isn't stable enough for allowing everything...
> -		 * let's check later again.
> -		 */
> -		if (chip->pci->vendor == PCI_VENDOR_ID_AMD)
> -			gcap &= ~ICH6_GCAP_64OK;
>  	}
> 
> -	/* disable 64bit DMA address for Teradici */
> -	/* it does not work with device 6549:1200 subsys e4a2:040b */
> -	if (chip->driver_type == AZX_DRIVER_TERA)
> +	/* disable 64bit DMA address on some devices */
> +	if (chip->driver_caps & AZX_DCAPS_NO_64BIT)
>  		gcap &= ~ICH6_GCAP_64OK;
> 
>  	/* allow 64bit DMA address if supported by H/W */
> @@ -2788,38 +2790,62 @@ static void __devexit azx_remove(struct
pci_dev
> *pci)
>  /* PCI IDs */
>  static DEFINE_PCI_DEVICE_TABLE(azx_ids) = {
>  	/* CPT */
> -	{ PCI_DEVICE(0x8086, 0x1c20), .driver_data = AZX_DRIVER_PCH },
> +	{ PCI_DEVICE(0x8086, 0x1c20),
> +	  .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP },
>  	/* PBG */
> -	{ PCI_DEVICE(0x8086, 0x1d20), .driver_data = AZX_DRIVER_PCH },
> +	{ PCI_DEVICE(0x8086, 0x1d20),
> +	  .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP },
>  	/* Panther Point */
> -	{ PCI_DEVICE(0x8086, 0x1e20), .driver_data = AZX_DRIVER_PCH },
> +	{ PCI_DEVICE(0x8086, 0x1e20),
> +	  .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP },
>  	/* SCH */
> -	{ PCI_DEVICE(0x8086, 0x811b), .driver_data = AZX_DRIVER_SCH },
> +	{ PCI_DEVICE(0x8086, 0x811b),
> +	  .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_SCH_SNOOP },
>  	/* Generic Intel */
>  	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_ANY_ID),
>  	  .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
>  	  .class_mask = 0xffffff,
>  	  .driver_data = AZX_DRIVER_ICH },
> -	/* ATI SB 450/600 */
> -	{ PCI_DEVICE(0x1002, 0x437b), .driver_data = AZX_DRIVER_ATI },
> -	{ PCI_DEVICE(0x1002, 0x4383), .driver_data = AZX_DRIVER_ATI },
> +	/* ATI SB 450/600/700/800/900 */
> +	{ PCI_DEVICE(0x1002, 0x437b),
> +	  .driver_data = AZX_DRIVER_ATI | AZX_DCAPS_PRESET_ATI_SB },
> +	{ PCI_DEVICE(0x1002, 0x4383),
> +	  .driver_data = AZX_DRIVER_ATI | AZX_DCAPS_PRESET_ATI_SB },
> +	/* AMD Hudson */
> +	{ PCI_DEVICE(0x1022, 0x780d),
> +	  .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_ATI_SB },
>  	/* ATI HDMI */
> -	{ PCI_DEVICE(0x1002, 0x793b), .driver_data = AZX_DRIVER_ATIHDMI
},
> -	{ PCI_DEVICE(0x1002, 0x7919), .driver_data = AZX_DRIVER_ATIHDMI
},
> -	{ PCI_DEVICE(0x1002, 0x960f), .driver_data = AZX_DRIVER_ATIHDMI
},
> -	{ PCI_DEVICE(0x1002, 0x970f), .driver_data = AZX_DRIVER_ATIHDMI
},
> -	{ PCI_DEVICE(0x1002, 0xaa00), .driver_data = AZX_DRIVER_ATIHDMI
},
> -	{ PCI_DEVICE(0x1002, 0xaa08), .driver_data = AZX_DRIVER_ATIHDMI
},
> -	{ PCI_DEVICE(0x1002, 0xaa10), .driver_data = AZX_DRIVER_ATIHDMI
},
> -	{ PCI_DEVICE(0x1002, 0xaa18), .driver_data = AZX_DRIVER_ATIHDMI
},
> -	{ PCI_DEVICE(0x1002, 0xaa20), .driver_data = AZX_DRIVER_ATIHDMI
},
> -	{ PCI_DEVICE(0x1002, 0xaa28), .driver_data = AZX_DRIVER_ATIHDMI
},
> -	{ PCI_DEVICE(0x1002, 0xaa30), .driver_data = AZX_DRIVER_ATIHDMI
},
> -	{ PCI_DEVICE(0x1002, 0xaa38), .driver_data = AZX_DRIVER_ATIHDMI
},
> -	{ PCI_DEVICE(0x1002, 0xaa40), .driver_data = AZX_DRIVER_ATIHDMI
},
> -	{ PCI_DEVICE(0x1002, 0xaa48), .driver_data = AZX_DRIVER_ATIHDMI
},
> +	{ PCI_DEVICE(0x1002, 0x793b),
> +	  .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI
},
> +	{ PCI_DEVICE(0x1002, 0x7919),
> +	  .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI
},
> +	{ PCI_DEVICE(0x1002, 0x960f),
> +	  .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI
},
> +	{ PCI_DEVICE(0x1002, 0x970f),
> +	  .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI
},
> +	{ PCI_DEVICE(0x1002, 0xaa00),
> +	  .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI
},
> +	{ PCI_DEVICE(0x1002, 0xaa08),
> +	  .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI
},
> +	{ PCI_DEVICE(0x1002, 0xaa10),
> +	  .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI
},
> +	{ PCI_DEVICE(0x1002, 0xaa18),
> +	  .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI
},
> +	{ PCI_DEVICE(0x1002, 0xaa20),
> +	  .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI
},
> +	{ PCI_DEVICE(0x1002, 0xaa28),
> +	  .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI
},
> +	{ PCI_DEVICE(0x1002, 0xaa30),
> +	  .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI
},
> +	{ PCI_DEVICE(0x1002, 0xaa38),
> +	  .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI
},
> +	{ PCI_DEVICE(0x1002, 0xaa40),
> +	  .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI
},
> +	{ PCI_DEVICE(0x1002, 0xaa48),
> +	  .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI
},
>  	/* VIA VT8251/VT8237A */
> -	{ PCI_DEVICE(0x1106, 0x3288), .driver_data = AZX_DRIVER_VIA },
> +	{ PCI_DEVICE(0x1106, 0x3288),
> +	  .driver_data = AZX_DRIVER_VIA | AZX_DCAPS_POSFIX_VIA },
>  	/* SIS966 */
>  	{ PCI_DEVICE(0x1039, 0x7502), .driver_data = AZX_DRIVER_SIS },
>  	/* ULI M5461 */
> @@ -2828,9 +2854,10 @@ static DEFINE_PCI_DEVICE_TABLE(azx_ids) = {
>  	{ PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID),
>  	  .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
>  	  .class_mask = 0xffffff,
> -	  .driver_data = AZX_DRIVER_NVIDIA },
> +	  .driver_data = AZX_DRIVER_NVIDIA | AZX_DCAPS_PRESET_NVIDIA },
>  	/* Teradici */
> -	{ PCI_DEVICE(0x6549, 0x1200), .driver_data = AZX_DRIVER_TERA },
> +	{ PCI_DEVICE(0x6549, 0x1200),
> +	  .driver_data = AZX_DRIVER_TERA | AZX_DCAPS_NO_64BIT },
>  	/* Creative X-Fi (CA0110-IBG) */
>  #if !defined(CONFIG_SND_CTXFI) && !defined(CONFIG_SND_CTXFI_MODULE)
>  	/* the following entry conflicts with snd-ctxfi driver,
> @@ -2840,10 +2867,13 @@ static DEFINE_PCI_DEVICE_TABLE(azx_ids) = {
>  	{ PCI_DEVICE(PCI_VENDOR_ID_CREATIVE, PCI_ANY_ID),
>  	  .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
>  	  .class_mask = 0xffffff,
> -	  .driver_data = AZX_DRIVER_CTX },
> +	  .driver_data = AZX_DRIVER_CTX | AZX_DCAPS_CTX_WORKAROUND |
> +	  AZX_DCAPS_RIRB_PRE_DELAY },
>  #else
>  	/* this entry seems still valid -- i.e. without emu20kx chip */
> -	{ PCI_DEVICE(0x1102, 0x0009), .driver_data = AZX_DRIVER_CTX },
> +	{ PCI_DEVICE(0x1102, 0x0009),
> +	  .driver_data = AZX_DRIVER_CTX | AZX_DCAPS_CTX_WORKAROUND |
> +	  AZX_DCAPS_RIRB_PRE_DELAY },
>  #endif
>  	/* Vortex86MX */
>  	{ PCI_DEVICE(0x17f3, 0x3010), .driver_data = AZX_DRIVER_GENERIC
},
> @@ -2853,11 +2883,11 @@ static DEFINE_PCI_DEVICE_TABLE(azx_ids) = {
>  	{ PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_ANY_ID),
>  	  .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
>  	  .class_mask = 0xffffff,
> -	  .driver_data = AZX_DRIVER_GENERIC },
> +	  .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_ATI_HDMI
},
>  	{ PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_ANY_ID),
>  	  .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
>  	  .class_mask = 0xffffff,
> -	  .driver_data = AZX_DRIVER_GENERIC },
> +	  .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_ATI_HDMI
},
>  	{ 0, }
>  };
>  MODULE_DEVICE_TABLE(pci, azx_ids);
> --
> 1.7.4.2
> 

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2011-05-25  7:20 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-05-25  5:59 [PATCH] ALSA: HDA: Use AZX_DRIVER_ATI for AMD/ATI platforms Andiry Xu
2011-05-25  6:29 ` Takashi Iwai
2011-05-25  7:16   ` Takashi Iwai
2011-05-25  7:19     ` Xu, Andiry

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.