From: John Jacques <john.jacq...@intel.com>

Signed-off-by: John Jacques <john.jacq...@intel.com>
---
 drivers/misc/axxia-pei.c | 138 ++++++++++++++++++++++++++++++++---------------
 1 file changed, 96 insertions(+), 42 deletions(-)

diff --git a/drivers/misc/axxia-pei.c b/drivers/misc/axxia-pei.c
index f016fc1..623a82c 100644
--- a/drivers/misc/axxia-pei.c
+++ b/drivers/misc/axxia-pei.c
@@ -39,23 +39,25 @@ static int is_5500;
 static int is_5600;
 static int is_6700;
 
-static void __iomem *pcie_gpreg0;
-static void __iomem *pcie_gpreg1;
-static void __iomem *pcie_gpreg2;
 static void __iomem *pcie_rc;
 static void __iomem *syscon;
 
+struct axxia_pei {
+       unsigned long phys;
+       void __iomem *virt;
+};
+
+struct axxia_pei axxia_pei[3];
+
 static int pcie_cc_gpreg_offset = 0x8000;
 static int is_pei_control_available;
 static int is_pei_control_v2;
 
 DEFINE_MUTEX(axxia_pei_mux);
 
-struct axxia_pei {
-       unsigned int    control;
-       int             control_set;
-       unsigned int    initialized;
-};
+static unsigned int control;
+static int control_set;
+static unsigned int initialized;
 
 struct pei_coefficients {
        unsigned version;
@@ -72,7 +74,6 @@ struct pei_coefficients {
        unsigned lane_1_vboost;
 };
 
-static struct axxia_pei axxia_pei;
 static struct pei_coefficients coefficients;
 
 enum SataMode {
@@ -97,9 +98,9 @@ enum SrioSpeed {
 };
 
 enum PCIMode {
-       PEI0,
-       PEI1,
-       PEI2
+       PEI0 = 0,
+       PEI1 = 1,
+       PEI2 = 2
 };
 enum PLLMode {
        PLLA,
@@ -147,9 +148,9 @@ enum pipe_nphy {
        four_phy = 0x3,
 };
 
-static int pei_trace;
-module_param(pei_trace, int, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
-MODULE_PARM_DESC(pei_trace, "enable pei_trace");
+static int trace;
+module_param(trace, int, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
+MODULE_PARM_DESC(trace, "Trace PEI Accesses");
 
 /*
   
------------------------------------------------------------------------------
@@ -162,6 +163,45 @@ get_config(unsigned control)
        return (0xf & (control >> 22));
 }
 
+static inline void
+axxia_pei_trace(void *address, int read, u32 value)
+{
+       int pei = -1;
+       unsigned long pci_gpreg;
+       unsigned int offset;
+
+       pci_gpreg = (unsigned long)address;
+       pci_gpreg &= ~0x1ffff;
+
+       if (0 != is_5600) {
+               if ((unsigned long)(axxia_pei[0].virt) ==
+                   pci_gpreg)
+                       pei = 0;
+               else if ((unsigned long)(axxia_pei[1].virt) ==
+                        pci_gpreg)
+                       pei = 1;
+               else if ((unsigned long)(axxia_pei[2].virt) ==
+                        pci_gpreg)
+                       pei = 2;
+       } else if ((unsigned long)(axxia_pei[0].virt) == pci_gpreg) {
+               pei = 0;
+       }
+
+       if (-1 == pei)
+               pr_warn("Unknown PEI Address!\n");
+
+       offset = (unsigned int)((unsigned long)address - pci_gpreg);
+
+       if (0 == read)
+               printk("PEI%d: Wrote 0x%x to 0x%08x\n",
+                      pei, value, offset);
+       else
+               printk("PEI%d: Read 0x%x from 0x%08x\n",
+                      pei, value, offset);
+
+       return;
+}
+
 static u32
 pei_readl(void *address)
 {
@@ -169,8 +209,8 @@ pei_readl(void *address)
 
        value = readl(address);
 
-       if (0 != pei_trace)
-               printk("PEI: Read 0x%x from 0x%px\n", value, address);
+       if (0 != trace)
+               axxia_pei_trace(address, 1, value);
 
        return value;
 }
@@ -180,8 +220,8 @@ pei_writel(u32 value, void *address)
 {
        writel(value, address);
 
-       if (0 != pei_trace)
-               printk("PEI: Wrote 0x%x to 0x%p\n", value, address);
+       if (0 != trace)
+               axxia_pei_trace(address, 0, value);
 
        return;
 }
@@ -669,25 +709,33 @@ void disable_ltssm(enum PCIMode mode)
        switch (mode) {
        case PEI0:
                /* LTSSM Disable for PEI0 */
-               val = pei_readl(pcie_gpreg0 + pcie_cc_gpreg_offset + 0x38);
+               val = pei_readl(axxia_pei[mode].virt +
+                               pcie_cc_gpreg_offset + 0x38);
                val &= (~(0x1));
-               pei_writel(val, pcie_gpreg0 + pcie_cc_gpreg_offset + 0x38);
+               pei_writel(val, axxia_pei[mode].virt +
+                          pcie_cc_gpreg_offset + 0x38);
                break;
        case PEI1:
                /* LTSSM Disable for PEI1 */
                if (!is_5600)
                        break;
-               val = pei_readl(pcie_gpreg1 + pcie_cc_gpreg_offset + 0x38);
+
+               val = pei_readl(axxia_pei[mode].virt +
+                               pcie_cc_gpreg_offset + 0x38);
                val &= (~(0x1));
-               pei_writel(val, pcie_gpreg1 + pcie_cc_gpreg_offset + 0x38);
+               pei_writel(val, axxia_pei[mode].virt +
+                          pcie_cc_gpreg_offset + 0x38);
                break;
        case PEI2:
                /* LTSSM Disable for PEI2 */
                if (!is_5600)
                        break;
-               val = pei_readl(pcie_gpreg2 + pcie_cc_gpreg_offset + 0x38);
+
+               val = pei_readl(axxia_pei[mode].virt +
+                               pcie_cc_gpreg_offset + 0x38);
                val &= (~(0x1));
-               pei_writel(val, pcie_gpreg2 + pcie_cc_gpreg_offset + 0x38);
+               pei_writel(val, axxia_pei[mode].virt +
+                          pcie_cc_gpreg_offset + 0x38);
                break;
        default:
                pr_err("%s Unsupported PEI %d\n", __func__, mode);
@@ -1312,7 +1360,7 @@ pei_setup_56xx(unsigned int control)
        u32 reg_val = 0;
        int phy;
 
-       if (0 != pei_trace)
+       if (0 != trace)
                ncr_start_trace();
 
        pci_srio_sata_mode = (control & 0x03c00000) >> 22;
@@ -1594,7 +1642,7 @@ pei_setup_56xx(unsigned int control)
                pr_err("pei_setup control=0x%08x pci_srio_sata_mode=%d\n",
                        control, pci_srio_sata_mode);
 
-               if (0 != pei_trace)
+               if (0 != trace)
                        ncr_stop_trace();
 
                return -1;
@@ -1603,7 +1651,7 @@ pei_setup_56xx(unsigned int control)
 
        update_settings();
 
-       if (0 != pei_trace)
+       if (0 != trace)
                ncr_stop_trace();
 
        return 0;
@@ -1724,7 +1772,7 @@ get_v2_coefficients(struct device_node *pei_control)
        return 0;
 }
 
-int axxia_pei_setup(unsigned int control, unsigned int force)
+int axxia_pei_setup(unsigned int control_in, unsigned int force)
 {
        int ret = 0;
        int rv = -1;
@@ -1732,14 +1780,14 @@ int axxia_pei_setup(unsigned int control, unsigned int 
force)
        mutex_lock(&axxia_pei_mux);
 
        pr_debug("axxia_pei_setup: control=0x%08x, force = 0x%08x\n",
-                       control, force);
-       axxia_pei.control = control;
-       axxia_pei.control_set = 1;
+                control_in, force);
+       control = control_in;
+       control_set = 1;
 
        if (1 == force)
-               axxia_pei.initialized = 0;
+               initialized = 0;
 
-       if (axxia_pei.initialized)
+       if (initialized)
                goto cleanup;
 
        /*
@@ -1748,7 +1796,7 @@ int axxia_pei_setup(unsigned int control, unsigned int 
force)
          assumption.
        */
 
-       if (0 == axxia_pei.initialized) {
+       if (0 == initialized) {
                if (is_5600) {
                        rv = pei_setup_56xx(control);
                } else if (is_6700) {
@@ -1761,7 +1809,7 @@ int axxia_pei_setup(unsigned int control, unsigned int 
force)
                        ret = -EINVAL;
                        goto cleanup;
                } else {
-                       axxia_pei.initialized = 1;
+                       initialized = 1;
                }
 
                msleep(100);
@@ -1778,7 +1826,7 @@ unsigned int axxia_pei_get_control(void)
        unsigned int ret;
 
        mutex_lock(&axxia_pei_mux);
-       ret = axxia_pei.control;
+       ret = control;
        mutex_unlock(&axxia_pei_mux);
        return ret;
 }
@@ -1789,7 +1837,7 @@ int axxia_pei_is_control_set(void)
        int ret;
 
        mutex_lock(&axxia_pei_mux);
-       ret = axxia_pei.control_set;
+       ret = control_set;
        mutex_unlock(&axxia_pei_mux);
        return ret;
 }
@@ -2133,20 +2181,26 @@ EXPORT_SYMBOL(axxia_pei_reset);
 static int
 pei_init(void)
 {
+       memset(axxia_pei, 0, sizeof(axxia_pei));
+
        /* Use the device tree to determine the Axxia type. */
        if (of_find_compatible_node(NULL, NULL, "lsi,axm5500") ||
            of_find_compatible_node(NULL, NULL, "lsi,axm5516")) {
                is_5500 = 1;
        } else if (of_find_compatible_node(NULL, NULL, "lsi,axm5616")) {
                is_5600 = 1;
-               pcie_gpreg0 = ioremap(0xa003000000, 0x10000);
-               pcie_gpreg1 = ioremap(0xa005000000, 0x10000);
-               pcie_gpreg2 = ioremap(0xa007000000, 0x10000);
+               axxia_pei[0].phys = 0xa003000000;
+               axxia_pei[0].virt = ioremap(axxia_pei[0].phys, 0x10000);
+               axxia_pei[1].phys = 0xa005000000;
+               axxia_pei[1].virt = ioremap(axxia_pei[1].phys, 0x10000);
+               axxia_pei[2].phys = 0xa007000000;
+               axxia_pei[2].virt = ioremap(axxia_pei[2].phys, 0x10000);
                pcie_rc = ioremap(0xa002000000, 0x1000);
                syscon = ioremap(0x8002c00000, 0x4000);
        } else if (of_find_compatible_node(NULL, NULL, "lsi,axc6732")) {
                is_6700 = 1;
-               pcie_gpreg0 = ioremap(0xa003000000, 0x10000);
+               axxia_pei[0].phys = 0xa003000000;
+               axxia_pei[0].virt = ioremap(axxia_pei[0].phys, 0x10000);
                pcie_rc = ioremap(0xa002000000, 0x1000);
        } else {
                pr_err("No Valid Compatible String Found for PEI!\n");
-- 
2.7.4

-- 
_______________________________________________
linux-yocto mailing list
linux-yocto@yoctoproject.org
https://lists.yoctoproject.org/listinfo/linux-yocto

Reply via email to