Module Name: src
Committed By: phx
Date: Tue Nov 1 16:32:57 UTC 2011
Modified Files:
src/sys/arch/sandpoint/stand/altboot: brdsetup.c dsk.c pciide.c
Log Message:
The Apollo family of IDE interface chips has both channels disabled by
default, so we have to enable them in a new chipfix function. Also move
the channel enable code for the 82C686B from encpcifix() to pciide.c.
To generate a diff of this commit:
cvs rdiff -u -r1.19 -r1.20 src/sys/arch/sandpoint/stand/altboot/brdsetup.c
cvs rdiff -u -r1.9 -r1.10 src/sys/arch/sandpoint/stand/altboot/dsk.c
cvs rdiff -u -r1.7 -r1.8 src/sys/arch/sandpoint/stand/altboot/pciide.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/sandpoint/stand/altboot/brdsetup.c
diff -u src/sys/arch/sandpoint/stand/altboot/brdsetup.c:1.19 src/sys/arch/sandpoint/stand/altboot/brdsetup.c:1.20
--- src/sys/arch/sandpoint/stand/altboot/brdsetup.c:1.19 Sun Oct 30 21:08:33 2011
+++ src/sys/arch/sandpoint/stand/altboot/brdsetup.c Tue Nov 1 16:32:57 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: brdsetup.c,v 1.19 2011/10/30 21:08:33 phx Exp $ */
+/* $NetBSD: brdsetup.c,v 1.20 2011/11/01 16:32:57 phx Exp $ */
/*-
* Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -454,25 +454,20 @@ encpcifix(struct brdprop *brd)
/*
* //// IDE fixup ////
* - "native mode" (ide 0x09)
- * - use primary only (ide 0x40)
*/
+
/* ide: 0x09 - programming interface; 1000'SsPp */
val = pcicfgread(ide, 0x08) & 0xffff00ff;
pcicfgwrite(ide, 0x08, val | (0x8f << 8));
/* ide: 0x10-20 - leave them PCI memory space assigned */
-
- /* ide: 0x40 - use primary only */
- val = pcicfgread(ide, 0x40) &~ 03;
- val |= 02;
- pcicfgwrite(ide, 0x40, val);
#else
/*
* //// IDE fixup ////
* - "compatiblity mode" (ide 0x09)
- * - use primary only (ide 0x40)
* - remove PCI pin assignment (ide 0x3d)
*/
+
/* ide: 0x09 - programming interface; 1000'SsPp */
val = pcicfgread(ide, 0x08) & 0xffff00ff;
val |= (0x8a << 8);
@@ -480,22 +475,17 @@ encpcifix(struct brdprop *brd)
/* ide: 0x10-20 */
/*
- experiment shows writing ide: 0x09 changes these
- register behaviour. The pcicfgwrite() above writes
- 0x8a at ide: 0x09 to make sure legacy IDE. Then
- reading BAR0-3 is to return value 0s even though
- pcisetup() has written range assignments. Value
- overwrite makes no effect. Having 0x8f for native
- PCIIDE doesn't change register values and brings no
- weirdness.
+ * experiment shows writing ide: 0x09 changes these
+ * register behaviour. The pcicfgwrite() above writes
+ * 0x8a at ide: 0x09 to make sure legacy IDE. Then
+ * reading BAR0-3 is to return value 0s even though
+ * pcisetup() has written range assignments. Value
+ * overwrite makes no effect. Having 0x8f for native
+ * PCIIDE doesn't change register values and brings no
+ * weirdness.
*/
- /* ide: 0x40 - use primary only */
- val = pcicfgread(ide, 0x40) &~ 03;
- val |= 02;
- pcicfgwrite(ide, 0x40, val);
-
- /* ide: 0x3d/3c - turn off PCI pin */
+ /* ide: 0x3d/3c - turn off PCI pin */
val = pcicfgread(ide, 0x3c) & 0xffff00ff;
pcicfgwrite(ide, 0x3c, val);
#endif
Index: src/sys/arch/sandpoint/stand/altboot/dsk.c
diff -u src/sys/arch/sandpoint/stand/altboot/dsk.c:1.9 src/sys/arch/sandpoint/stand/altboot/dsk.c:1.10
--- src/sys/arch/sandpoint/stand/altboot/dsk.c:1.9 Sun Oct 30 21:08:33 2011
+++ src/sys/arch/sandpoint/stand/altboot/dsk.c Tue Nov 1 16:32:57 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: dsk.c,v 1.9 2011/10/30 21:08:33 phx Exp $ */
+/* $NetBSD: dsk.c,v 1.10 2011/11/01 16:32:57 phx Exp $ */
/*-
* Copyright (c) 2010 The NetBSD Foundation, Inc.
@@ -102,6 +102,8 @@ dskdv_init(void *self)
return 0;
found:
pci->drv = (*dv->init)(tag, NULL);
+ if (pci->drv == NULL)
+ return 0;
disk_scan(pci->drv);
return 1;
}
Index: src/sys/arch/sandpoint/stand/altboot/pciide.c
diff -u src/sys/arch/sandpoint/stand/altboot/pciide.c:1.7 src/sys/arch/sandpoint/stand/altboot/pciide.c:1.8
--- src/sys/arch/sandpoint/stand/altboot/pciide.c:1.7 Mon Apr 25 18:30:18 2011
+++ src/sys/arch/sandpoint/stand/altboot/pciide.c Tue Nov 1 16:32:57 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: pciide.c,v 1.7 2011/04/25 18:30:18 phx Exp $ */
+/* $NetBSD: pciide.c,v 1.8 2011/11/01 16:32:57 phx Exp $ */
/*-
* Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -36,6 +36,7 @@
#include "globals.h"
static int cmdidefix(struct dkdev_ata *);
+static int apoidefix(struct dkdev_ata *);
static uint32_t pciiobase = PCI_XIOBASE;
@@ -45,6 +46,7 @@ struct myops {
};
static struct myops defaultops = { NULL, NULL };
static struct myops cmdideops = { cmdidefix, NULL };
+static struct myops apoideops = { apoidefix, NULL };
static struct myops *myops;
int
@@ -57,9 +59,12 @@ pciide_match(unsigned tag, void *data)
case PCI_DEVICE(0x1095, 0x0680): /* SiI 0680 IDE */
myops = &cmdideops;
return 1;
- case PCI_DEVICE(0x1283, 0x8211): /* ITE 8211 IDE */
+ case PCI_DEVICE(0x1106, 0x0571): /* VIA 82C586A IDE */
case PCI_DEVICE(0x1106, 0x1571): /* VIA 82C586 IDE */
- case PCI_DEVICE(0x1106, 0x3164): /* VIA VT6410 */
+ case PCI_DEVICE(0x1106, 0x3164): /* VIA VT6410 RAID IDE */
+ myops = &apoideops;
+ return 1;
+ case PCI_DEVICE(0x1283, 0x8211): /* ITE 8211 IDE */
case PCI_DEVICE(0x10ad, 0x0105): /* Symphony Labs 82C105 IDE */
case PCI_DEVICE(0x10b8, 0x5229): /* ALi IDE */
case PCI_DEVICE(0x1191, 0x0008): /* ACARD ATP865 */
@@ -82,9 +87,15 @@ pciide_init(unsigned tag, void *data)
l->iobuf = allocaligned(512, 16);
l->tag = tag;
+ /* chipset specific fixes */
+ if (myops->chipfix)
+ if (!(*myops->chipfix)(l))
+ return NULL;
+
val = pcicfgread(tag, PCI_CLASS_REG);
native = PCI_CLASS(val) != PCI_CLASS_IDE ||
(PCI_INTERFACE(val) & 05) != 0;
+
if (native) {
/* native, use BAR 01234 */
l->bar[0] = pciiobase + (pcicfgread(tag, 0x10) &~ 01);
@@ -124,17 +135,13 @@ pciide_init(unsigned tag, void *data)
printf("channel %d present\n", n);
}
- /* make sure to have PIO0 */
- if (myops->chipfix)
- (*myops->chipfix)(l);
-
return l;
}
static int
cmdidefix(struct dkdev_ata *l)
{
- int v;
+ unsigned v;
v = pcicfgread(l->tag, 0x80);
pcicfgwrite(l->tag, 0x80, (v & ~0xff) | 0x01);
@@ -147,3 +154,15 @@ cmdidefix(struct dkdev_ata *l)
return 1;
}
+
+static int
+apoidefix(struct dkdev_ata *l)
+{
+ unsigned v;
+
+ /* enable primary and secondary channel */
+ v = pcicfgread(l->tag, 0x40) & ~0x03;
+ pcicfgwrite(l->tag, 0x40, v | 0x03);
+
+ return 1;
+}