Re: VT8251 SATA controller improvements for viaide(4)

Andrius V <[email protected]>
Newsgroups gmane.os.netbsd.devel.kernel
Message-ID <CAFO4Nkr0wAU7cQULaB5j=8PvJjWkEbQPWVdQvVQvR8_f=XS9qA@mail.gmail.com>
On Mon, Apr 14, 2025 at 12:18 AM Andrius V <[email protected]> wrote:
>
> Hi,
>
> I am working on improvements to the viaide(4) driver, specifically for VIA
> controllers (despite the name, it also supports other vendors like AMD/NVIDIA).
>
> Recent changes include more complete support for CX700/VX800, VT6415 IDE
> controller support, basic VT8261 support (unfortunately, the motherboard died,
> so further work is unlikely), VT8237S IDE identification, VX900 RAID mode
> support, and general VIA RAID improvements.
>
> My final "big" goal is to improve support for the VT8251 chipset controller in
> IDE/RAID modes (AHCI mode already works fine). Current support is incomplete and
> has several issues:
>
> 1) A bogus wd0 attaches if no drive is present on the first SATA port.
> 2) No drives are detected on SATA ports other than the first.
> 3) PCI ID 0x3349 is defined as a VT8237R integrated controller, but is actually
>    a VT8251 integrated controller.
>
> The VT8251 integrated controller has 2 SATA channels with 2 ports each, and 2
> PATA channels. The SATA controller uses PCI ID 0x3349 in IDE/RAID modes
> (at least on the motherboard I have). It may use either 0x3349 or 0x6287 in
> AHCI mode (I believe this depends on the CD/CE revisions of the southbridge,
> visible in chip markings).
>

Forgot to mention that there's also 0x5287 PCI ID, which is used in
IDE mode in CE revision.
CE revision uses 0x3349 only on RAID mode.

> The PATA controller appears under PCI ID 0x0571, which is reused by many
> [...]
>
> However, simply switching to 'via_chip_map()` is not enough. Some problems
> remain:
>
> 1) Attaching a drive on port 4 (second channel, second port) may cause
>    never-ending timeouts.

Even with the fix below, I still get timeouts sometimes on older
revision chipset, but only with one SSD model out of few drives tested
(and only if nothing attach to port 3).

> 2) Attaching a SATA disk to any second channel port (typically ports 3/4)
>    causes PATA drives to fail to attach at all.
>
> [...]
>
> Now I am considering how best to implement a fix. I see a few options:
>
> 1) Add a new flag in 'via_chip_map()` indicating whether it is a SATA
> controller,
>    and assign the proper setup function:
>      sc->sc_wdcdev.sc_atac.atac_set_modes =
>          sata_channel ? sata_setup_channel : via_setup_channel;
>
> 2) Add a sata_channel flag to the ata_channel struct and skip the
>    problematic writes:
>      if (!chp->sata_channel) {
>          pci_conf_write(...);
>          pci_conf_write(...);
>      }
>    Alternatively, call sata_setup_channel() early inside via_setup_channel():
>      if (chp->sata_channel) {
>          sata_setup_channel();
>          return;
>      }
>
> 3) Use ide_flags instead to achieve the same goal:
> https://nxr.netbsd.org/xref/src/sys/dev/pci/pciidevar.h#180
>
> I'd appreciate any feedback on which direction is preferred or what
> are other alternatives.
>
> I can also prepare patches or give additional details if needed.

I also came up with one more option to set atac_set_modes to
sata_setup_channel together with udma option and use null check to set
via_setup_channel otherwise.

@@ -501,12 +515,18 @@ via_chip_map(struct pciide_softc *sc, const
struct pci_attach_args *pa)
  no_ideconf = 1;
  /* FALLTHROUGH */
  case PCI_PRODUCT_VIATECH_CX700_IDE:
+ sc->sc_wdcdev.sc_atac.atac_udma_cap = 6;
+ break;
+ case PCI_PRODUCT_VIATECH_VT8251_SATA:
+ /* FALLTHROUGH */
+ case PCI_PRODUCT_VIATECH_VT8251_SATA_2:
  /* FALLTHROUGH */
  case PCI_PRODUCT_VIATECH_VT8261_SATA:
  /* FALLTHROUGH */
  case PCI_PRODUCT_VIATECH_VX900_IDE:
  /* FALLTHROUGH */
  case PCI_PRODUCT_VIATECH_VX900_RAID:
+ sc->sc_wdcdev.sc_atac.atac_set_modes = sata_setup_channel;
  sc->sc_wdcdev.sc_atac.atac_udma_cap = 6;
  break;
  default:
@@ -662,7 +682,8 @@ via_chip_map(struct pciide_softc *sc, const struct
pci_attach_args *pa)
  }
  sc->sc_wdcdev.sc_atac.atac_pio_cap = 4;
  sc->sc_wdcdev.sc_atac.atac_dma_cap = 2;
- sc->sc_wdcdev.sc_atac.atac_set_modes = via_setup_channel;
+ if (sc->sc_wdcdev.sc_atac.atac_set_modes == NULL)
+ sc->sc_wdcdev.sc_atac.atac_set_modes = via_setup_channel;
  sc->sc_wdcdev.sc_atac.atac_channels = sc->wdc_chanarray;
  if (single_channel)



Prepared the full patch for review and comments
https://netbsd.org/~andvar/viaide-vt8251.diff

>
> Thank you.
>
> Regards,
> Andrius V
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.