Current-Users archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

patches for RDC pcidevs, rdcpcib driver and Vortex86 SoCs identification



Hi,

I updated pcidevs list with RDC devices from various DM&P SoCs.
Additionally, by doing this exercise I noticed that there's a custom
rdcpcib driver which configures watchdog timer (WDT0). This driver
actually is needed for all Vortex86 SoCs, since all of them has the
same configuration regarding first watchdog timer (and similar with
the second one, but it's not being enabled specifically in the
driver). I changed the driver to match all currently known PCIBs.
Finally I updated the CPU identification to add EX2 (it's surely
working but since I am not that familiar with C and bitwise
operations, not sure if it's the best approach). Everything was tested
on Vortex86DX3, Vortex86EX2.

pcidevs+rdcpcib:

diff --git a/sys/dev/pci/pcidevs b/sys/dev/pci/pcidevs
index 12434bb23b3..b353d2a0b2a 100644
--- a/sys/dev/pci/pcidevs
+++ b/sys/dev/pci/pcidevs
@@ -7067,13 +7067,28 @@ product RALINK  RT5390_5        0x539f  RT5390
 product RATOC  REXPCI31        0x0853  REX PCI-31/33 SCSI

 /* RDC Semiconductor products */
-product RDC    R1010_IDE       0x1010  R1010 IDE controller
-product RDC    R1011_IDE       0x1011  R1011 IDE controller
-product RDC    R1012_IDE       0x1012  R1012 IDE controller
+product RDC    R1010_IDE       0x1010  R1010 IDE Controller
+product RDC    R1011_IDE       0x1011  R1011 IDE Controller
+product RDC    R1012_IDE       0x1012  R1012 IDE Controller
+product RDC    R1031_PPB       0x1031  R1031 PCI-PCIE Bridge
+product RDC    R1060_USBD      0x1060  R1060 USB Device
+product RDC    R1061_USBD      0x1061  R1061 USB Device
+product RDC    R1070_CAN       0x1070  R1070 CANbus
+product RDC    R1331_MC        0x1331  R1331 Motion Control
+product RDC    R1710_SPI       0x1710  R1710 SPI
+product RDC    R1930_HBRD      0x1930  R1930 Hybrid Function Control Register
+product RDC    R2010_VGA       0x2010  R2010 VGA Controller
+product RDC    R2012_VGA       0x2012  R2012 VGA Controller
+product RDC    R2015_VGA       0x2015  R2015 VGA Controller
+product RDC    R6011_PCIB      0x6011  R6011 PCI-ISA bridge
+product RDC    R6013_PCIB      0x6013  R6013 PCI-ISA bridge
 product RDC    R6021_HB        0x6021  R6021 Host
+product RDC    R6023_HB        0x6023  R6023 Host
 product RDC    R6025_HB        0x6025  R6025 Host
-product RDC    R6031_ISA       0x6031  R6031 PCI-ISA bridge
-product RDC    PCIB            0x6036  R6036 PCI-ISA bridge
+product RDC    R6026_HB        0x6026  R6026 Host
+product RDC    R6031_PCIB      0x6031  R6031 PCI-ISA bridge
+product RDC    R6035_PCIB      0x6035  R6035 PCI-ISA bridge
+product RDC    R6036_PCIB      0x6036  R6036 PCI-ISA bridge
 product RDC    R6040           0x6040  R6040 10/100 Ethernet
 product RDC    R6060_OHCI      0x6060  R6060 USB OHCI
 product RDC    R6061_EHCI      0x6061  R6061 USB EHCI

diff --git a/sys/arch/x86/pci/rdcpcib.c b/sys/arch/x86/pci/rdcpcib.c
index a5d521f8a50..4c4c659716c 100644
--- a/sys/arch/x86/pci/rdcpcib.c
+++ b/sys/arch/x86/pci/rdcpcib.c
@@ -25,7 +25,7 @@
  */

 /*
- * driver for the RDC vortex86/PMX-1000 SoC PCI-ISA bridge, which also drives
+ * driver for the RDC Vortex86 SoC family PCI-ISA bridge, which also drives
  * the watchdog timer
  */

@@ -87,19 +87,32 @@ static void rdc_wdtimer_start(struct rdcpcib_softc *);
 CFATTACH_DECL2_NEW(rdcpcib, sizeof(struct rdcpcib_softc),
     rdcpcibmatch, rdcpcibattach, rdcpcibdetach, NULL,
     pcibrescan, pcibchilddet);
+
+static const struct rdcpcib_device {
+       pcireg_t vendor, product;
+} rdcpcib_devices[] = {
+       { PCI_VENDOR_RDC, PCI_PRODUCT_RDC_R6011_PCIB},
+       { PCI_VENDOR_RDC, PCI_PRODUCT_RDC_R6013_PCIB},
+       { PCI_VENDOR_RDC, PCI_PRODUCT_RDC_R6031_PCIB},
+       { PCI_VENDOR_RDC, PCI_PRODUCT_RDC_R6035_PCIB},
+       { PCI_VENDOR_RDC, PCI_PRODUCT_RDC_R6035_PCIB},
+};

 static int
 rdcpcibmatch(device_t parent, cfdata_t match, void *aux)
 {
        struct pci_attach_args *pa = aux;
+       const struct rdcpcib_device *rdcpcib_dev;

        if (PCI_CLASS(pa->pa_class) != PCI_CLASS_BRIDGE ||
            PCI_SUBCLASS(pa->pa_class) != PCI_SUBCLASS_BRIDGE_ISA)
                return 0;

-       if (PCI_VENDOR(pa->pa_id) == PCI_VENDOR_RDC &&
-           PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_RDC_PCIB)
+       for (rdcpcib_dev = rdcpcib_devices; rdcpcib_dev->vendor;
++rdcpcib_dev) {
+               if (PCI_VENDOR(pa->pa_id) == rdcpcib_dev->vendor &&
+                   PCI_PRODUCT(pa->pa_id) == rdcpcib_dev->product)
                        return 10;
+       }

        return 0;
 }

CPU identification:

diff --git a/sys/arch/x86/x86/identcpu.c b/sys/arch/x86/x86/identcpu.c
index 80f7e403a37..5c52635825f 100644
--- a/sys/arch/x86/x86/identcpu.c
+++ b/sys/arch/x86/x86/identcpu.c
@@ -704,7 +704,7 @@ cpu_probe_vortex86(struct cpu_info *ci)
 #define PCI_MODE1_DATA_REG     0x0cfc
 #define PCI_MODE1_ENABLE       0x80000000UL

-       uint32_t reg;
+       uint32_t reg, idx;

        if (cpu_vendor != CPUVENDOR_VORTEX86)
                return;
@@ -718,17 +718,18 @@ cpu_probe_vortex86(struct cpu_info *ci)
        outl(PCI_MODE1_ADDRESS_REG, PCI_MODE1_ENABLE | 0x90);
        reg = inl(PCI_MODE1_DATA_REG);

-       if ((reg & 0xf8ffffff) != 0x30504d44) {
-               reg = 0;
+       if ((reg & 0xf0ffffff) != 0x30504d44) {
+               idx = 0;
        } else {
-               reg = (reg >> 24) & 7;
+               idx = (reg >> 24) & 0x0f;
        }

        static const char *cpu_vortex86_flavor[] = {
-           "??", "SX", "DX", "MX", "DX2", "MX+", "DX3", "EX",
+           "??", "SX", "DX", "MX", "DX2", "MX+", "DX3", "EX", "EX2"
        };
+       idx = sizeof(cpu_vortex86_flavor) > idx ? idx : 0;
        snprintf(cpu_brand_string, sizeof(cpu_brand_string), "Vortex86%s",
-           cpu_vortex86_flavor[reg]);
+           cpu_vortex86_flavor[idx]);

 #undef PCI_MODE1_ENABLE
 #undef PCI_MODE1_ADDRESS_REG


Home | Main Index | Thread Index | Old Index