diff --git a/Documentation/devicetree/bindings/pci/msm_ep_pcie.txt b/Documentation/devicetree/bindings/pci/msm_ep_pcie.txt index 1ae00121771c..a9803fa850c9 100644 --- a/Documentation/devicetree/bindings/pci/msm_ep_pcie.txt +++ b/Documentation/devicetree/bindings/pci/msm_ep_pcie.txt @@ -42,6 +42,9 @@ Optional Properties: - qcom,pcie-phy-ver: version of PCIe PHY. - qcom,pcie-link-speed: generation of PCIe link speed. The value could be 1, 2 or 3. + - qcom,pcie-active-config: boolean type; active configuration of PCIe + addressing. + - qcom,pcie-aggregated-irq: boolean type; interrupts are aggregated. - Refer to "Documentation/devicetree/bindings/arm/msm/msm_bus.txt" for below optional properties: - qcom,msm-bus,name @@ -103,4 +106,6 @@ Example: <45 512 500 800>; qcom,pcie-link-speed = <1>; + qcom,pcie-active-config; + qcom,pcie-aggregated-irq; }; \ No newline at end of file diff --git a/drivers/platform/msm/ep_pcie/ep_pcie.c b/drivers/platform/msm/ep_pcie/ep_pcie.c index 59d9771ebdc7..b02169f8a33c 100644 --- a/drivers/platform/msm/ep_pcie/ep_pcie.c +++ b/drivers/platform/msm/ep_pcie/ep_pcie.c @@ -230,3 +230,15 @@ int ep_pcie_disable_endpoint(struct ep_pcie_hw *phandle) } } EXPORT_SYMBOL(ep_pcie_disable_endpoint); + +int ep_pcie_mask_irq_event(struct ep_pcie_hw *phandle, + enum ep_pcie_irq_event event, + bool enable) +{ + if (phandle) + return phandle->mask_irq_event(event, enable); + + pr_err("ep_pcie:%s: the input driver handle is NULL.", __func__); + return -EINVAL; +} +EXPORT_SYMBOL(ep_pcie_mask_irq_event); diff --git a/drivers/platform/msm/ep_pcie/ep_pcie_com.h b/drivers/platform/msm/ep_pcie/ep_pcie_com.h index 6bb268f358aa..c886dd2777dd 100644 --- a/drivers/platform/msm/ep_pcie/ep_pcie_com.h +++ b/drivers/platform/msm/ep_pcie/ep_pcie_com.h @@ -31,8 +31,6 @@ #define PCIE20_PARF_PHY_REFCLK 0x4C #define PCIE20_PARF_CONFIG_BITS 0x50 #define PCIE20_PARF_TEST_BUS 0xE4 -#define PCIE20_PARF_DBI_BASE_ADDR 0x168 -#define PCIE20_PARF_SLV_ADDR_SPACE_SIZE 0x16C #define PCIE20_PARF_MHI_BASE_ADDR_LOWER 0x178 #define PCIE20_PARF_MHI_BASE_ADDR_UPPER 0x17c #define PCIE20_PARF_DEBUG_INT_EN 0x190 @@ -43,6 +41,15 @@ #define PCIE20_PARF_AXI_MSTR_WR_ADDR_HALT 0x1A8 #define PCIE20_PARF_Q2A_FLUSH 0x1AC #define PCIE20_PARF_LTSSM 0x1B0 +#define PCIE20_PARF_LTR_MSI_EXIT_L1SS 0x214 +#define PCIE20_PARF_INT_ALL_STATUS 0x224 +#define PCIE20_PARF_INT_ALL_CLEAR 0x228 +#define PCIE20_PARF_INT_ALL_MASK 0x22C +#define PCIE20_PARF_SLV_ADDR_MSB_CTRL 0x2C0 +#define PCIE20_PARF_DBI_BASE_ADDR 0x350 +#define PCIE20_PARF_DBI_BASE_ADDR_HI 0x354 +#define PCIE20_PARF_SLV_ADDR_SPACE_SIZE 0x358 +#define PCIE20_PARF_SLV_ADDR_SPACE_SIZE_HI 0x35C #define PCIE20_PARF_DEVICE_TYPE 0x1000 #define PCIE20_ELBI_VERSION 0x00 @@ -62,6 +69,7 @@ #define PCIE20_MSI_LOWER 0x54 #define PCIE20_MSI_UPPER 0x58 #define PCIE20_MSI_DATA 0x5C +#define PCIE20_MSI_MASK 0x60 #define PCIE20_DEVICE_CAPABILITIES 0x74 #define PCIE20_MASK_EP_L1_ACCPT_LATENCY 0xE00 #define PCIE20_MASK_EP_L0S_ACCPT_LATENCY 0x1C0 @@ -87,6 +95,8 @@ #define PCIE20_PLR_IATU_LTAR 0x918 #define PCIE20_PLR_IATU_UTAR 0x91c +#define PCIE20_AUX_CLK_FREQ_REG 0xB40 + #define PERST_TIMEOUT_US_MIN 1000 #define PERST_TIMEOUT_US_MAX 1000 #define PERST_CHECK_MAX_COUNT 30000 @@ -101,6 +111,8 @@ #define REFCLK_STABILIZATION_DELAY_US_MIN 1000 #define REFCLK_STABILIZATION_DELAY_US_MAX 1000 #define PHY_READY_TIMEOUT_COUNT 30000 +#define MSI_EXIT_L1SS_WAIT 10 +#define MSI_EXIT_L1SS_WAIT_MAX_COUNT 100 #define XMLH_LINK_UP 0x400 #define MAX_PROP_SIZE 32 @@ -120,6 +132,8 @@ #define EP_PCIE_OATU_INDEX_CTRL 2 #define EP_PCIE_OATU_INDEX_DATA 3 +#define EP_PCIE_OATU_UPPER 0x100 + #define EP_PCIE_GEN_DBG(x...) do { \ if (ep_pcie_get_debug_mask()) \ pr_alert(x); \ @@ -128,9 +142,6 @@ } while (0) #define EP_PCIE_DBG(dev, fmt, arg...) do { \ - if ((dev)->ipc_log_sel) \ - ipc_log_string((dev)->ipc_log_sel, \ - "DBG1:%s: " fmt, __func__, arg); \ if ((dev)->ipc_log_ful) \ ipc_log_string((dev)->ipc_log_ful, "%s: " fmt, __func__, arg); \ if (ep_pcie_get_debug_mask()) \ @@ -138,6 +149,9 @@ } while (0) #define EP_PCIE_DBG2(dev, fmt, arg...) do { \ + if ((dev)->ipc_log_sel) \ + ipc_log_string((dev)->ipc_log_sel, \ + "DBG1:%s: " fmt, __func__, arg); \ if ((dev)->ipc_log_ful) \ ipc_log_string((dev)->ipc_log_ful, \ "DBG2:%s: " fmt, __func__, arg); \ @@ -190,6 +204,7 @@ enum ep_pcie_irq { EP_PCIE_INT_LINK_UP, EP_PCIE_INT_LINK_DOWN, EP_PCIE_INT_BRIDGE_FLUSH_N, + EP_PCIE_INT_GLOBAL, EP_PCIE_MAX_IRQ, }; @@ -256,6 +271,8 @@ struct ep_pcie_dev_t { struct msm_bus_scale_pdata *bus_scale_table; u32 bus_client; u32 link_speed; + bool active_config; + bool aggregated_irq; u32 rev; u32 phy_rev; @@ -278,6 +295,7 @@ struct ep_pcie_dev_t { ulong perst_deast_counter; ulong wake_counter; ulong msi_counter; + ulong global_irq_counter; bool dump_conf; diff --git a/drivers/platform/msm/ep_pcie/ep_pcie_core.c b/drivers/platform/msm/ep_pcie/ep_pcie_core.c index a72b0eb4b36c..6e5923742aec 100644 --- a/drivers/platform/msm/ep_pcie/ep_pcie_core.c +++ b/drivers/platform/msm/ep_pcie/ep_pcie_core.c @@ -32,10 +32,6 @@ #include #include #include -#include -#include -#include -#include #include "ep_pcie_com.h" @@ -90,7 +86,8 @@ static const struct ep_pcie_irq_info_t ep_pcie_irq_info[EP_PCIE_MAX_IRQ] = { {"int_l1sub_timeout", 0}, {"int_link_up", 0}, {"int_link_down", 0}, - {"int_bridge_flush_n", 0} + {"int_bridge_flush_n", 0}, + {"int_global", 0} }; int ep_pcie_get_debug_mask(void) @@ -559,6 +556,23 @@ static void ep_pcie_core_init(struct ep_pcie_dev_t *dev) /* Configure BARs */ ep_pcie_bar_init(dev); + + /* Configure IRQ events */ + if (dev->aggregated_irq) { + ep_pcie_write_reg(dev->parf, PCIE20_PARF_INT_ALL_MASK, 0); + ep_pcie_write_mask(dev->parf + PCIE20_PARF_INT_ALL_MASK, 0, + BIT(EP_PCIE_INT_EVT_LINK_DOWN) | + BIT(EP_PCIE_INT_EVT_BME) | + BIT(EP_PCIE_INT_EVT_PM_TURNOFF) | + BIT(EP_PCIE_INT_EVT_MHI_A7) | + BIT(EP_PCIE_INT_EVT_DSTATE_CHANGE) | + BIT(EP_PCIE_INT_EVT_LINK_UP)); + EP_PCIE_DBG(dev, "PCIe V%d: PCIE20_PARF_INT_ALL_MASK:0x%x\n", + dev->rev, + readl_relaxed(dev->parf + PCIE20_PARF_INT_ALL_MASK)); + } + + ep_pcie_write_reg(dev->dm_core, PCIE20_AUX_CLK_FREQ_REG, 0x14); } static void ep_pcie_config_inbound_iatu(struct ep_pcie_dev_t *dev) @@ -600,7 +614,7 @@ static void ep_pcie_config_inbound_iatu(struct ep_pcie_dev_t *dev) } static void ep_pcie_config_outbound_iatu_entry(struct ep_pcie_dev_t *dev, - u32 region, u32 lower, + u32 region, u32 lower, u32 upper, u32 limit, u32 tgt_lower, u32 tgt_upper) { EP_PCIE_DBG(dev, @@ -613,7 +627,7 @@ static void ep_pcie_config_outbound_iatu_entry(struct ep_pcie_dev_t *dev, ep_pcie_write_reg(dev->dm_core, PCIE20_PLR_IATU_CTRL1, 0x0); /* setup source address registers */ ep_pcie_write_reg(dev->dm_core, PCIE20_PLR_IATU_LBAR, lower); - ep_pcie_write_reg(dev->dm_core, PCIE20_PLR_IATU_UBAR, 0x0); + ep_pcie_write_reg(dev->dm_core, PCIE20_PLR_IATU_UBAR, upper); ep_pcie_write_reg(dev->dm_core, PCIE20_PLR_IATU_LAR, limit); /* setup target address registers */ ep_pcie_write_reg(dev->dm_core, PCIE20_PLR_IATU_LTAR, tgt_lower); @@ -711,7 +725,7 @@ static int ep_pcie_get_resources(struct ep_pcie_dev_t *dev, if (IS_ERR(vreg_info->hdl)) { if (vreg_info->required) { - EP_PCIE_DBG(dev, "Vreg %s doesn't exist\n", + EP_PCIE_ERR(dev, "Vreg %s doesn't exist\n", vreg_info->name); ret = PTR_ERR(vreg_info->hdl); goto out; @@ -772,7 +786,7 @@ static int ep_pcie_get_resources(struct ep_pcie_dev_t *dev, if (IS_ERR(clk_info->hdl)) { if (clk_info->required) { - EP_PCIE_DBG(dev, + EP_PCIE_ERR(dev, "Clock %s isn't available:%ld\n", clk_info->name, PTR_ERR(clk_info->hdl)); ret = PTR_ERR(clk_info->hdl); @@ -799,7 +813,7 @@ static int ep_pcie_get_resources(struct ep_pcie_dev_t *dev, if (IS_ERR(clk_info->hdl)) { if (clk_info->required) { - EP_PCIE_DBG(dev, + EP_PCIE_ERR(dev, "Clock %s isn't available:%ld\n", clk_info->name, PTR_ERR(clk_info->hdl)); ret = PTR_ERR(clk_info->hdl); @@ -871,18 +885,11 @@ static int ep_pcie_get_resources(struct ep_pcie_dev_t *dev, irq_info->name); if (!res) { - int j; - for (j = 0; j < EP_PCIE_MAX_RES; j++) { - iounmap(dev->res[j].base); - dev->res[j].base = NULL; - } - EP_PCIE_ERR(dev, "PCIe V%d: can't find IRQ # for %s\n", + EP_PCIE_DBG2(dev, "PCIe V%d: can't find IRQ # for %s\n", dev->rev, irq_info->name); - ret = -ENODEV; - goto out; } else { irq_info->num = res->start; - EP_PCIE_DBG(dev, "IRQ # for %s is %d.\n", + EP_PCIE_DBG2(dev, "IRQ # for %s is %d.\n", irq_info->name, irq_info->num); } } @@ -1098,6 +1105,19 @@ int ep_pcie_core_enable_endpoint(enum ep_pcie_options opt) dev->rev); } + if (dev->active_config) { + ep_pcie_write_mask(dev->parf + PCIE20_PARF_SLV_ADDR_MSB_CTRL, + 0, BIT(0)); + ep_pcie_write_reg(dev->parf, PCIE20_PARF_SLV_ADDR_SPACE_SIZE_HI, + 0x200); + ep_pcie_write_reg(dev->parf, PCIE20_PARF_SLV_ADDR_SPACE_SIZE, + 0x0); + ep_pcie_write_reg(dev->parf, PCIE20_PARF_DBI_BASE_ADDR_HI, + 0x100); + ep_pcie_write_reg(dev->parf, PCIE20_PARF_DBI_BASE_ADDR, + 0x7FFFE000); + } + /* Wait for up to 1000ms for BME to be set */ retries = 0; bme = readl_relaxed(dev->dm_core + @@ -1177,6 +1197,50 @@ out: return rc; } +int ep_pcie_core_mask_irq_event(enum ep_pcie_irq_event event, + bool enable) +{ + int rc = 0; + struct ep_pcie_dev_t *dev = &ep_pcie_dev; + unsigned long irqsave_flags; + u32 mask = 0; + + EP_PCIE_DUMP(dev, + "PCIe V%d: Client askes to %s IRQ event 0x%x.\n", + dev->rev, + enable ? "enable" : "disable", + event); + + spin_lock_irqsave(&dev->ext_lock, irqsave_flags); + + if (dev->aggregated_irq) { + mask = readl_relaxed(dev->dm_core + PCIE20_PARF_INT_ALL_MASK); + EP_PCIE_DUMP(dev, + "PCIe V%d: current PCIE20_PARF_INT_ALL_MASK:0x%x\n", + dev->rev, mask); + if (enable) + ep_pcie_write_mask(dev->parf + PCIE20_PARF_INT_ALL_MASK, + 0, BIT(event)); + else + ep_pcie_write_mask(dev->parf + PCIE20_PARF_INT_ALL_MASK, + BIT(event), 0); + EP_PCIE_DUMP(dev, + "PCIe V%d: new PCIE20_PARF_INT_ALL_MASK:0x%x\n", + dev->rev, + readl_relaxed(dev->dm_core + PCIE20_PARF_INT_ALL_MASK)); + } else { + EP_PCIE_ERR(dev, + "PCIe V%d: Client askes to %s IRQ event 0x%x when aggregated IRQ is not supported.\n", + dev->rev, + enable ? "enable" : "disable", + event); + rc = EP_PCIE_ERROR; + } + + spin_unlock_irqrestore(&dev->ext_lock, irqsave_flags); + return rc; +} + static irqreturn_t ep_pcie_handle_linkdown_irq(int irq, void *data) { struct ep_pcie_dev_t *dev = data; @@ -1328,6 +1392,71 @@ out: return IRQ_HANDLED; } +static irqreturn_t ep_pcie_handle_global_irq(int irq, void *data) +{ + struct ep_pcie_dev_t *dev = data; + int i; + u32 status = readl_relaxed(dev->parf + PCIE20_PARF_INT_ALL_STATUS); + u32 mask = readl_relaxed(dev->parf + PCIE20_PARF_INT_ALL_MASK); + + ep_pcie_write_mask(dev->parf + PCIE20_PARF_INT_ALL_CLEAR, 0, status); + + dev->global_irq_counter++; + EP_PCIE_DUMP(dev, + "PCIe V%d: No. %ld Global IRQ %d received; status:0x%x; mask:0x%x.\n", + dev->rev, dev->global_irq_counter, irq, status, mask); + status &= mask; + + for (i = 1; i <= EP_PCIE_INT_EVT_MAX; i++) { + if (status & BIT(i)) { + switch (i) { + case EP_PCIE_INT_EVT_LINK_DOWN: + EP_PCIE_DUMP(dev, + "PCIe V%d: handle linkdown event.\n", + dev->rev); + ep_pcie_handle_linkdown_irq(irq, data); + break; + case EP_PCIE_INT_EVT_BME: + EP_PCIE_DUMP(dev, + "PCIe V%d: handle BME event.\n", + dev->rev); + dev->link_status = EP_PCIE_LINK_ENABLED; + break; + case EP_PCIE_INT_EVT_PM_TURNOFF: + EP_PCIE_DUMP(dev, + "PCIe V%d: handle PM Turn-off event.\n", + dev->rev); + ep_pcie_handle_pm_turnoff_irq(irq, data); + break; + case EP_PCIE_INT_EVT_MHI_A7: + EP_PCIE_DUMP(dev, + "PCIe V%d: handle MHI A7 event.\n", + dev->rev); + ep_pcie_notify_event(dev, EP_PCIE_EVENT_MHI_A7); + break; + case EP_PCIE_INT_EVT_DSTATE_CHANGE: + EP_PCIE_DUMP(dev, + "PCIe V%d: handle D state chagge event.\n", + dev->rev); + ep_pcie_handle_dstate_change_irq(irq, data); + break; + case EP_PCIE_INT_EVT_LINK_UP: + EP_PCIE_DUMP(dev, + "PCIe V%d: handle linkup event.\n", + dev->rev); + ep_pcie_handle_linkup_irq(irq, data); + break; + default: + EP_PCIE_ERR(dev, + "PCIe V%d: Unexpected event %d is caught!\n", + dev->rev, i); + } + } + } + + return IRQ_HANDLED; +} + int32_t ep_pcie_irq_init(struct ep_pcie_dev_t *dev) { int ret; @@ -1336,6 +1465,25 @@ int32_t ep_pcie_irq_init(struct ep_pcie_dev_t *dev) EP_PCIE_DBG(dev, "PCIe V%d\n", dev->rev); + if (dev->aggregated_irq) { + ret = devm_request_irq(pdev, + dev->irq[EP_PCIE_INT_GLOBAL].num, + ep_pcie_handle_global_irq, + IRQF_TRIGGER_HIGH, dev->irq[EP_PCIE_INT_GLOBAL].name, + dev); + if (ret) { + EP_PCIE_ERR(dev, + "PCIe V%d: Unable to request global interrupt %d\n", + dev->rev, dev->irq[EP_PCIE_INT_GLOBAL].num); + return ret; + } + + EP_PCIE_DBG(dev, + "PCIe V%d: request global interrupt %d\n", + dev->rev, dev->irq[EP_PCIE_INT_GLOBAL].num); + goto perst_irq; + } + /* register handler for linkdown interrupt */ ret = devm_request_irq(pdev, dev->irq[EP_PCIE_INT_LINK_DOWN].num, @@ -1387,6 +1535,7 @@ int32_t ep_pcie_irq_init(struct ep_pcie_dev_t *dev) return ret; } +perst_irq: /* register handler for PERST interrupt */ perst_irq = gpio_to_irq(dev->gpio[EP_PCIE_GPIO_PERST].num); ret = devm_request_irq(pdev, perst_irq, @@ -1496,6 +1645,18 @@ int ep_pcie_core_config_outbound_iatu(struct ep_pcie_iatu entries[], u32 ctrl_end = 0; u32 ctrl_tgt_lower = 0; u32 ctrl_tgt_upper = 0; + u32 upper = 0; + bool once = true; + + if (ep_pcie_dev.active_config) { + upper = EP_PCIE_OATU_UPPER; + if (once) { + once = false; + EP_PCIE_DBG2(&ep_pcie_dev, + "PCIe V%d: No outbound iATU config is needed since active config is enabled.\n", + ep_pcie_dev.rev); + } + } if ((num_entries > MAX_IATU_ENTRY_NUM) || !num_entries) { EP_PCIE_ERR(&ep_pcie_dev, @@ -1529,11 +1690,11 @@ int ep_pcie_core_config_outbound_iatu(struct ep_pcie_iatu entries[], ep_pcie_dev.rev); ep_pcie_config_outbound_iatu_entry(&ep_pcie_dev, EP_PCIE_OATU_INDEX_DATA, - data_start, data_end, + data_start, upper, data_end, data_tgt_lower, data_tgt_upper); ep_pcie_config_outbound_iatu_entry(&ep_pcie_dev, EP_PCIE_OATU_INDEX_CTRL, - ctrl_start, ctrl_end, + ctrl_start, upper, ctrl_end, ctrl_tgt_lower, ctrl_tgt_upper); } else if ((data_start <= ctrl_start) && (ctrl_end <= data_end)) { EP_PCIE_DBG(&ep_pcie_dev, @@ -1541,7 +1702,7 @@ int ep_pcie_core_config_outbound_iatu(struct ep_pcie_iatu entries[], ep_pcie_dev.rev); ep_pcie_config_outbound_iatu_entry(&ep_pcie_dev, EP_PCIE_OATU_INDEX_DATA, - data_start, data_end, + data_start, upper, data_end, data_tgt_lower, data_tgt_upper); } else { EP_PCIE_DBG(&ep_pcie_dev, @@ -1549,11 +1710,11 @@ int ep_pcie_core_config_outbound_iatu(struct ep_pcie_iatu entries[], ep_pcie_dev.rev); ep_pcie_config_outbound_iatu_entry(&ep_pcie_dev, EP_PCIE_OATU_INDEX_CTRL, - ctrl_start, ctrl_end, + ctrl_start, upper, ctrl_end, ctrl_tgt_lower, ctrl_tgt_upper); ep_pcie_config_outbound_iatu_entry(&ep_pcie_dev, EP_PCIE_OATU_INDEX_DATA, - data_start, data_end, + data_start, upper, data_end, data_tgt_lower, data_tgt_upper); } @@ -1596,10 +1757,17 @@ int ep_pcie_core_get_msi_config(struct ep_pcie_msi_config *cfg) if (ctrl_reg & BIT(16)) { struct resource *msi = ep_pcie_dev.res[EP_PCIE_RES_MSI].resource; - ep_pcie_config_outbound_iatu_entry(&ep_pcie_dev, + if (ep_pcie_dev.active_config) + ep_pcie_config_outbound_iatu_entry(&ep_pcie_dev, EP_PCIE_OATU_INDEX_MSI, - msi->start, msi->end, + msi->start, EP_PCIE_OATU_UPPER, + msi->end, lower, upper); + else + ep_pcie_config_outbound_iatu_entry(&ep_pcie_dev, + EP_PCIE_OATU_INDEX_MSI, + msi->start, 0, msi->end, lower, upper); + cfg->lower = msi->start + (lower & 0xfff); cfg->upper = 0; cfg->data = data; @@ -1635,6 +1803,7 @@ int ep_pcie_core_get_msi_config(struct ep_pcie_msi_config *cfg) int ep_pcie_core_trigger_msi(u32 idx) { u32 addr, data, ctrl_reg; + int max_poll = MSI_EXIT_L1SS_WAIT_MAX_COUNT; if (ep_pcie_dev.link_status == EP_PCIE_LINK_DISABLED) { EP_PCIE_ERR(&ep_pcie_dev, @@ -1651,14 +1820,44 @@ int ep_pcie_core_trigger_msi(u32 idx) if (ctrl_reg & BIT(16)) { ep_pcie_dev.msi_counter++; EP_PCIE_DUMP(&ep_pcie_dev, - "PCIe V%d: No. %ld MSI fired for IRQ %d; index from client:%d\n", + "PCIe V%d: No. %ld MSI fired for IRQ %d; index from client:%d; active-config is %s enabled.\n", ep_pcie_dev.rev, ep_pcie_dev.msi_counter, - data + idx, idx); - ep_pcie_write_reg(ep_pcie_dev.msi, addr & 0xfff, data + idx); + data + idx, idx, + ep_pcie_dev.active_config ? "" : "not"); + if (ep_pcie_dev.active_config) { + u32 status; + + ep_pcie_write_reg(ep_pcie_dev.dm_core, + PCIE20_MSI_MASK, idx); + status = readl_relaxed(ep_pcie_dev.parf + + PCIE20_PARF_LTR_MSI_EXIT_L1SS); + while ((status & BIT(1)) && (max_poll-- > 0)) { + udelay(MSI_EXIT_L1SS_WAIT); + status = readl_relaxed(ep_pcie_dev.parf + + PCIE20_PARF_LTR_MSI_EXIT_L1SS); + } + if (max_poll == 0) + EP_PCIE_DBG2(&ep_pcie_dev, + "PCIe V%d: MSI_EXIT_L1SS is not cleared yet.\n", + ep_pcie_dev.rev); + else + EP_PCIE_DBG2(&ep_pcie_dev, + "PCIe V%d: MSI_EXIT_L1SS has been cleared.\n", + ep_pcie_dev.rev); + + EP_PCIE_DBG2(&ep_pcie_dev, + "PCIe V%d: try to trigger MSI by direct address write as well.\n", + ep_pcie_dev.rev); + ep_pcie_write_reg(ep_pcie_dev.msi, addr & 0xfff, data + + idx); + } else { + ep_pcie_write_reg(ep_pcie_dev.msi, addr & 0xfff, data + + idx); + } return 0; } else { EP_PCIE_ERR(&ep_pcie_dev, - "PCIe V%d: Wrong MSI info found. MSI addr:0x%x; data:0x%x; index from client:%d.\n", + "PCIe V%d: MSI is not enabled yet. MSI addr:0x%x; data:0x%x; index from client:%d.\n", ep_pcie_dev.rev, addr, data, idx); return EP_PCIE_ERROR; } @@ -1721,6 +1920,7 @@ struct ep_pcie_hw hw_drv = { .config_db_routing = ep_pcie_core_config_db_routing, .enable_endpoint = ep_pcie_core_enable_endpoint, .disable_endpoint = ep_pcie_core_disable_endpoint, + .mask_irq_event = ep_pcie_core_mask_irq_event, }; static int ep_pcie_probe(struct platform_device *pdev) @@ -1753,7 +1953,20 @@ static int ep_pcie_probe(struct platform_device *pdev) EP_PCIE_DBG(&ep_pcie_dev, "PCIe V%d: pcie-phy-ver:%d.\n", ep_pcie_dev.rev, ep_pcie_dev.phy_rev); - ep_pcie_dev.rev = 1503191; + ep_pcie_dev.active_config = of_property_read_bool((&pdev->dev)->of_node, + "qcom,pcie-active-config"); + EP_PCIE_DBG(&ep_pcie_dev, + "PCIe V%d: active config is %s enabled.\n", + ep_pcie_dev.rev, ep_pcie_dev.active_config ? "" : "not"); + + ep_pcie_dev.aggregated_irq = + of_property_read_bool((&pdev->dev)->of_node, + "qcom,pcie-aggregated-irq"); + EP_PCIE_DBG(&ep_pcie_dev, + "PCIe V%d: aggregated IRQ is %s enabled.\n", + ep_pcie_dev.rev, ep_pcie_dev.aggregated_irq ? "" : "not"); + + ep_pcie_dev.rev = 1511053; ep_pcie_dev.pdev = pdev; memcpy(ep_pcie_dev.vreg, ep_pcie_vreg_info, sizeof(ep_pcie_vreg_info)); @@ -1878,7 +2091,7 @@ static int __init ep_pcie_init(void) snprintf(logname, MAX_NAME_LEN, "ep-pcie-long"); ep_pcie_dev.ipc_log_sel = - ipc_log_context_create(EP_PCIE_LOG_PAGES, logname); + ipc_log_context_create(EP_PCIE_LOG_PAGES, logname, 0); if (ep_pcie_dev.ipc_log_sel == NULL) pr_err("%s: unable to create IPC selected log for %s\n", __func__, logname); @@ -1889,7 +2102,7 @@ static int __init ep_pcie_init(void) snprintf(logname, MAX_NAME_LEN, "ep-pcie-short"); ep_pcie_dev.ipc_log_ful = - ipc_log_context_create(EP_PCIE_LOG_PAGES * 2, logname); + ipc_log_context_create(EP_PCIE_LOG_PAGES * 2, logname, 0); if (ep_pcie_dev.ipc_log_ful == NULL) pr_err("%s: unable to create IPC detailed log for %s\n", __func__, logname); @@ -1900,7 +2113,7 @@ static int __init ep_pcie_init(void) snprintf(logname, MAX_NAME_LEN, "ep-pcie-dump"); ep_pcie_dev.ipc_log_dump = - ipc_log_context_create(EP_PCIE_LOG_PAGES, logname); + ipc_log_context_create(EP_PCIE_LOG_PAGES, logname, 0); if (ep_pcie_dev.ipc_log_dump == NULL) pr_err("%s: unable to create IPC dump log for %s\n", __func__, logname); diff --git a/drivers/platform/msm/ep_pcie/ep_pcie_dbg.c b/drivers/platform/msm/ep_pcie/ep_pcie_dbg.c index da8dfdbdaeb5..39828882ab66 100644 --- a/drivers/platform/msm/ep_pcie/ep_pcie_dbg.c +++ b/drivers/platform/msm/ep_pcie/ep_pcie_dbg.c @@ -95,104 +95,6 @@ static void ep_pcie_phy_dump(struct ep_pcie_dev_t *dev) EP_PCIE_DUMP(dev, "PCIe V%d: PHY register dump\n", dev->rev); - EP_PCIE_DUMP(dev, "PCIe V%d: QSERDES_COM_PLL_VCO_HIGH: 0x%x\n", - dev->rev, readl_relaxed(dev->phy + QSERDES_COM_PLL_VCO_HIGH)); - EP_PCIE_DUMP(dev, "PCIe V%d: QSERDES_COM_RESET_SM: 0x%x\n", - dev->rev, readl_relaxed(dev->phy + QSERDES_COM_RESET_SM)); - EP_PCIE_DUMP(dev, "PCIe V%d: QSERDES_COM_MUXVAL: 0x%x\n", - dev->rev, readl_relaxed(dev->phy + QSERDES_COM_MUXVAL)); - EP_PCIE_DUMP(dev, "PCIe V%d: QSERDES_RX_PI_CTRL1: 0x%x\n", - dev->rev, readl_relaxed(dev->phy + QSERDES_RX_PI_CTRL1)); - EP_PCIE_DUMP(dev, "PCIe V%d: QSERDES_RX_PI_CTRL2: 0x%x\n", - dev->rev, readl_relaxed(dev->phy + QSERDES_RX_PI_CTRL2)); - EP_PCIE_DUMP(dev, "PCIe V%d: QSERDES_RX_PI_QUAD: 0x%x\n", - dev->rev, readl_relaxed(dev->phy + QSERDES_RX_PI_QUAD)); - EP_PCIE_DUMP(dev, "PCIe V%d: QSERDES_RX_IDATA1: 0x%x\n", - dev->rev, readl_relaxed(dev->phy + QSERDES_RX_IDATA1)); - EP_PCIE_DUMP(dev, "PCIe V%d: QSERDES_RX_IDATA2: 0x%x\n", - dev->rev, readl_relaxed(dev->phy + QSERDES_RX_IDATA2)); - EP_PCIE_DUMP(dev, "PCIe V%d: QSERDES_RX_AUX_DATA1: 0x%x\n", - dev->rev, readl_relaxed(dev->phy + QSERDES_RX_AUX_DATA1)); - EP_PCIE_DUMP(dev, "PCIe V%d: QSERDES_RX_AUX_DATA2: 0x%x\n", - dev->rev, readl_relaxed(dev->phy + QSERDES_RX_AUX_DATA2)); - EP_PCIE_DUMP(dev, "PCIe V%d: QSERDES_RX_AC_JTAG_OUTP: 0x%x\n", - dev->rev, readl_relaxed(dev->phy + QSERDES_RX_AC_JTAG_OUTP)); - EP_PCIE_DUMP(dev, "PCIe V%d: QSERDES_RX_AC_JTAG_OUTN: 0x%x\n", - dev->rev, readl_relaxed(dev->phy + QSERDES_RX_AC_JTAG_OUTN)); - EP_PCIE_DUMP(dev, "PCIe V%d: QSERDES_RX_RX_SIGDET: 0x%x\n", - dev->rev, readl_relaxed(dev->phy + QSERDES_RX_RX_SIGDET)); - EP_PCIE_DUMP(dev, "PCIe V%d: QSERDES_RX_RX_VDCOFF: 0x%x\n", - dev->rev, readl_relaxed(dev->phy + QSERDES_RX_RX_VDCOFF)); - EP_PCIE_DUMP(dev, "PCIe V%d: QSERDES_RX_IDAC_CAL_ON: 0x%x\n", - dev->rev, readl_relaxed(dev->phy + QSERDES_RX_IDAC_CAL_ON)); - EP_PCIE_DUMP(dev, "PCIe V%d: QSERDES_RX_IDAC_STATUS_I: 0x%x\n", - dev->rev, readl_relaxed(dev->phy + QSERDES_RX_IDAC_STATUS_I)); - EP_PCIE_DUMP(dev, "PCIe V%d: QSERDES_RX_IDAC_STATUS_Q: 0x%x\n", - dev->rev, readl_relaxed(dev->phy + QSERDES_RX_IDAC_STATUS_Q)); - EP_PCIE_DUMP(dev, "PCIe V%d: QSERDES_RX_IDAC_STATUS_A: 0x%x\n", - dev->rev, readl_relaxed(dev->phy + QSERDES_RX_IDAC_STATUS_A)); - EP_PCIE_DUMP(dev, "PCIe V%d: QSERDES_RX_CALST_STATUS_I: 0x%x\n", - dev->rev, readl_relaxed(dev->phy + QSERDES_RX_CALST_STATUS_I)); - EP_PCIE_DUMP(dev, "PCIe V%d: QSERDES_RX_CALST_STATUS_Q: 0x%x\n", - dev->rev, readl_relaxed(dev->phy + QSERDES_RX_CALST_STATUS_Q)); - EP_PCIE_DUMP(dev, "PCIe V%d: QSERDES_RX_CALST_STATUS_A: 0x%x\n", - dev->rev, readl_relaxed(dev->phy + QSERDES_RX_CALST_STATUS_A)); - EP_PCIE_DUMP(dev, "PCIe V%d: QSERDES_RX_EOM_STATUS0: 0x%x\n", - dev->rev, readl_relaxed(dev->phy + QSERDES_RX_EOM_STATUS0)); - EP_PCIE_DUMP(dev, "PCIe V%d: QSERDES_RX_EOM_STATUS1: 0x%x\n", - dev->rev, readl_relaxed(dev->phy + QSERDES_RX_EOM_STATUS1)); - EP_PCIE_DUMP(dev, "PCIe V%d: QSERDES_RX_EOM_STATUS2: 0x%x\n", - dev->rev, readl_relaxed(dev->phy + QSERDES_RX_EOM_STATUS2)); - EP_PCIE_DUMP(dev, "PCIe V%d: QSERDES_RX_EOM_STATUS3: 0x%x\n", - dev->rev, readl_relaxed(dev->phy + QSERDES_RX_EOM_STATUS3)); - EP_PCIE_DUMP(dev, "PCIe V%d: QSERDES_RX_EOM_STATUS4: 0x%x\n", - dev->rev, readl_relaxed(dev->phy + QSERDES_RX_EOM_STATUS4)); - EP_PCIE_DUMP(dev, "PCIe V%d: QSERDES_RX_EOM_STATUS5: 0x%x\n", - dev->rev, readl_relaxed(dev->phy + QSERDES_RX_EOM_STATUS5)); - EP_PCIE_DUMP(dev, "PCIe V%d: QSERDES_RX_EOM_STATUS6: 0x%x\n", - dev->rev, readl_relaxed(dev->phy + QSERDES_RX_EOM_STATUS6)); - EP_PCIE_DUMP(dev, "PCIe V%d: QSERDES_RX_EOM_STATUS7: 0x%x\n", - dev->rev, readl_relaxed(dev->phy + QSERDES_RX_EOM_STATUS7)); - EP_PCIE_DUMP(dev, "PCIe V%d: QSERDES_RX_EOM_STATUS8: 0x%x\n", - dev->rev, readl_relaxed(dev->phy + QSERDES_RX_EOM_STATUS8)); - EP_PCIE_DUMP(dev, "PCIe V%d: QSERDES_RX_EOM_STATUS9: 0x%x\n", - dev->rev, readl_relaxed(dev->phy + QSERDES_RX_EOM_STATUS9)); - EP_PCIE_DUMP(dev, "PCIe V%d: QSERDES_RX_RX_ALOG_INTF_OBSV: 0x%x\n", - dev->rev, readl_relaxed(dev->phy + QSERDES_RX_RX_ALOG_INTF_OBSV)); - EP_PCIE_DUMP(dev, "PCIe V%d: QSERDES_RX_READ_EQCODE: 0x%x\n", - dev->rev, readl_relaxed(dev->phy + QSERDES_RX_READ_EQCODE)); - EP_PCIE_DUMP(dev, "PCIe V%d: QSERDES_RX_READ_OFFSETCODE: 0x%x\n", - dev->rev, readl_relaxed(dev->phy + QSERDES_RX_READ_OFFSETCODE)); - EP_PCIE_DUMP(dev, "PCIe V%d: QSERDES_TX_BIST_STATUS: 0x%x\n", - dev->rev, readl_relaxed(dev->phy + QSERDES_TX_BIST_STATUS)); - EP_PCIE_DUMP(dev, "PCIe V%d: QSERDES_TX_BIST_ERROR_COUNT1: 0x%x\n", - dev->rev, readl_relaxed(dev->phy + QSERDES_TX_BIST_ERROR_COUNT1)); - EP_PCIE_DUMP(dev, "PCIe V%d: QSERDES_TX_BIST_ERROR_COUNT2: 0x%x\n", - dev->rev, readl_relaxed(dev->phy + QSERDES_TX_BIST_ERROR_COUNT2)); - EP_PCIE_DUMP(dev, "PCIe V%d: QSERDES_TX_TX_ALOG_INTF_OBSV: 0x%x\n", - dev->rev, readl_relaxed(dev->phy + QSERDES_TX_TX_ALOG_INTF_OBSV)); - EP_PCIE_DUMP(dev, "PCIe V%d: QSERDES_TX_PWM_DEC_STATUS: 0x%x\n", - dev->rev, readl_relaxed(dev->phy + QSERDES_TX_PWM_DEC_STATUS)); - EP_PCIE_DUMP(dev, "PCIe V%d: PCIE_PHY_BIST_CHK_ERR_CNT_L: 0x%x\n", - dev->rev, readl_relaxed(dev->phy + PCIE_PHY_BIST_CHK_ERR_CNT_L)); - EP_PCIE_DUMP(dev, "PCIe V%d: PCIE_PHY_BIST_CHK_ERR_CNT_H: 0x%x\n", - dev->rev, readl_relaxed(dev->phy + PCIE_PHY_BIST_CHK_ERR_CNT_H)); - EP_PCIE_DUMP(dev, "PCIe V%d: PCIE_PHY_BIST_CHK_STATUS: 0x%x\n", - dev->rev, readl_relaxed(dev->phy + PCIE_PHY_BIST_CHK_STATUS)); - EP_PCIE_DUMP(dev, "PCIe V%d: PCIE_PHY_LFPS_RXTERM_IRQ_SOURCE: 0x%x\n", - dev->rev, readl_relaxed(dev->phy + PCIE_PHY_LFPS_RXTERM_IRQ_SOURCE)); - EP_PCIE_DUMP(dev, "PCIe V%d: PCIE_PHY_PCS_STATUS: 0x%x\n", - dev->rev, readl_relaxed(dev->phy + PCIE_PHY_PCS_STATUS)); - EP_PCIE_DUMP(dev, "PCIe V%d: PCIE_PHY_PCS_STATUS2: 0x%x\n", - dev->rev, readl_relaxed(dev->phy + PCIE_PHY_PCS_STATUS2)); - EP_PCIE_DUMP(dev, "PCIe V%d: PCIE_PHY_REVISION_ID0: 0x%x\n", - dev->rev, readl_relaxed(dev->phy + PCIE_PHY_REVISION_ID0)); - EP_PCIE_DUMP(dev, "PCIe V%d: PCIE_PHY_REVISION_ID1: 0x%x\n", - dev->rev, readl_relaxed(dev->phy + PCIE_PHY_REVISION_ID1)); - EP_PCIE_DUMP(dev, "PCIe V%d: PCIE_PHY_REVISION_ID2: 0x%x\n", - dev->rev, readl_relaxed(dev->phy + PCIE_PHY_REVISION_ID2)); - EP_PCIE_DUMP(dev, "PCIe V%d: PCIE_PHY_REVISION_ID3: 0x%x\n", - dev->rev, readl_relaxed(dev->phy + PCIE_PHY_REVISION_ID3)); } void ep_pcie_reg_dump(struct ep_pcie_dev_t *dev, u32 sel, bool linkdown) diff --git a/drivers/platform/msm/ep_pcie/ep_pcie_phy.c b/drivers/platform/msm/ep_pcie/ep_pcie_phy.c index 015617aaa1c2..633daf1860f4 100644 --- a/drivers/platform/msm/ep_pcie/ep_pcie_phy.c +++ b/drivers/platform/msm/ep_pcie/ep_pcie_phy.c @@ -17,95 +17,82 @@ #include "ep_pcie_com.h" #include "ep_pcie_phy.h" -static u32 qserdes_com_oft; - void ep_pcie_phy_init(struct ep_pcie_dev_t *dev) { EP_PCIE_DBG(dev, - "PCIe V%d: PHY V%d: Initializing 20nm QMP phy - 100MHz\n", + "PCIe V%d: PHY V%d: Initializing 14nm QMP phy - 100MHz\n", dev->rev, dev->phy_rev); - switch (dev->phy_rev) { - case 3: - qserdes_com_oft = 8; - break; - default: - qserdes_com_oft = 0; - } - + ep_pcie_write_reg(dev->phy, PCIE_PHY_SW_RESET, 0x01); ep_pcie_write_reg(dev->phy, PCIE_PHY_POWER_DOWN_CONTROL, 0x01); - ep_pcie_write_reg(dev->phy, QSERDES_COM_SYS_CLK_CTRL, 0x1E); - ep_pcie_write_reg(dev->phy, QSERDES_COM_PLL_CP_SETI, 0x11); - ep_pcie_write_reg(dev->phy, QSERDES_COM_PLL_IP_SETP, 0x3F); - ep_pcie_write_reg(dev->phy, QSERDES_COM_PLL_CP_SETP, 0x00); - ep_pcie_write_reg(dev->phy, QSERDES_COM_PLL_IP_SETI, 0x3F); - ep_pcie_write_reg(dev->phy, QSERDES_COM_IP_TRIM, 0x0F); - ep_pcie_write_reg(dev->phy, QSERDES_COM_RESETSM_CNTRL, 0x90); - ep_pcie_write_reg(dev->phy, QSERDES_COM_RES_CODE_CAL_CSR - + qserdes_com_oft, 0x77); - ep_pcie_write_reg(dev->phy, QSERDES_COM_RES_TRIM_CONTROL - + qserdes_com_oft, 0x15); - ep_pcie_write_reg(dev->phy, QSERDES_TX_RCV_DETECT_LVL, 0x03); - ep_pcie_write_reg(dev->phy, QSERDES_RX_RX_EQ_GAIN1_LSB, 0xFF); - ep_pcie_write_reg(dev->phy, QSERDES_RX_RX_EQ_GAIN2_LSB, 0xFF); - ep_pcie_write_reg(dev->phy, QSERDES_RX_RX_EQ_GAIN2_MSB, 0x00); - ep_pcie_write_reg(dev->phy, QSERDES_RX_SIGDET_ENABLES, 0x40); - ep_pcie_write_reg(dev->phy, QSERDES_RX_SIGDET_CNTRL, 0x70); - ep_pcie_write_reg(dev->phy, PCIE_PHY_PWRUP_RESET_DLY_TIME_SYSCLK, 0xC8); + + ep_pcie_write_reg(dev->phy, QSERDES_COM_SYSCLK_EN_SEL, 0x00); + ep_pcie_write_reg(dev->phy, QSERDES_COM_BIAS_EN_CLKBUFLR_EN, 0x18); + ep_pcie_write_reg(dev->phy, QSERDES_COM_CLK_SELECT, 0x30); + ep_pcie_write_reg(dev->phy, QSERDES_COM_RESETSM_CNTRL, 0x20); + ep_pcie_write_reg(dev->phy, QSERDES_COM_CMN_CONFIG, 0x06); + ep_pcie_write_reg(dev->phy, QSERDES_COM_DEC_START_MODE0, 0x19); + ep_pcie_write_reg(dev->phy, QSERDES_COM_CP_CTRL_MODE0, 0x3F); + ep_pcie_write_reg(dev->phy, QSERDES_COM_PLL_RCTRL_MODE0, 0x1A); + ep_pcie_write_reg(dev->phy, QSERDES_COM_PLL_CCTRL_MODE0, 0x00); + ep_pcie_write_reg(dev->phy, QSERDES_COM_INTEGLOOP_GAIN1_MODE0, 0x00); + ep_pcie_write_reg(dev->phy, QSERDES_COM_INTEGLOOP_GAIN0_MODE0, 0xFF); + ep_pcie_write_reg(dev->phy, QSERDES_COM_SVS_MODE_CLK_SEL, 0x01); + ep_pcie_write_reg(dev->phy, QSERDES_COM_CORE_CLK_EN, 0x00); + ep_pcie_write_reg(dev->phy, QSERDES_COM_LOCK_CMP2_MODE0, 0x04); + ep_pcie_write_reg(dev->phy, QSERDES_COM_LOCK_CMP1_MODE0, 0xFF); + ep_pcie_write_reg(dev->phy, QSERDES_COM_LOCK_CMP_EN, 0x42); + ep_pcie_write_reg(dev->phy, QSERDES_COM_VCO_TUNE_MAP, 0x00); + ep_pcie_write_reg(dev->phy, QSERDES_COM_VCO_TUNE_TIMER2, 0x3F); + ep_pcie_write_reg(dev->phy, QSERDES_COM_VCO_TUNE_TIMER1, 0xFF); + ep_pcie_write_reg(dev->phy, QSERDES_COM_BG_TIMER, 0x01); + ep_pcie_write_reg(dev->phy, QSERDES_COM_BG_TRIM, 0x0F); + ep_pcie_write_reg(dev->phy, QSERDES_COM_PLL_IVCO, 0x0F); + + ep_pcie_write_reg(dev->phy, QSERDES_RX_UCDR_SO_SATURATION_AND_ENABLE, + 0x4B); + ep_pcie_write_reg(dev->phy, QSERDES_RX_UCDR_FO_GAIN, 0x0A); + ep_pcie_write_reg(dev->phy, QSERDES_RX_UCDR_FO_GAIN_HALF, 0x0A); + ep_pcie_write_reg(dev->phy, QSERDES_RX_UCDR_SO_GAIN, 0x04); + ep_pcie_write_reg(dev->phy, QSERDES_RX_UCDR_SO_GAIN_HALF, 0x04); + ep_pcie_write_reg(dev->phy, QSERDES_RX_RX_EQU_ADAPTOR_CNTRL2, 0x01); + ep_pcie_write_reg(dev->phy, QSERDES_RX_RX_EQU_ADAPTOR_CNTRL3, 0x00); + ep_pcie_write_reg(dev->phy, QSERDES_RX_RX_EQU_ADAPTOR_CNTRL4, 0xDB); + ep_pcie_write_reg(dev->phy, QSERDES_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, + 0x77); + ep_pcie_write_reg(dev->phy, QSERDES_RX_RX_OFFSET_ADAPTOR_CNTRL2, 0x80); + ep_pcie_write_reg(dev->phy, QSERDES_RX_SIGDET_ENABLES, 0x1C); + ep_pcie_write_reg(dev->phy, QSERDES_RX_SIGDET_CNTRL, 0x03); + ep_pcie_write_reg(dev->phy, QSERDES_RX_SIGDET_DEGLITCH_CNTRL, 0x14); + + ep_pcie_write_reg(dev->phy, QSERDES_TX_RES_CODE_LANE_OFFSET, 0x02); + ep_pcie_write_reg(dev->phy, QSERDES_TX_HIGHZ_TRANSCEIVEREN_BIAS_DRVR_EN, + 0x45); + ep_pcie_write_reg(dev->phy, QSERDES_TX_RCV_DETECT_LVL_2, 0x12); + ep_pcie_write_reg(dev->phy, QSERDES_TX_LANE_MODE, 0x06); + + ep_pcie_write_reg(dev->phy, PCIE_PHY_OSC_DTCT_ACTIONS, 0x0A); + ep_pcie_write_reg(dev->phy, PCIE_PHY_RX_IDLE_DTCT_CNTRL, 0x4C); + ep_pcie_write_reg(dev->phy, PCIE_PHY_TXDEEMPH_M3P5DB_V0, 0x0F); ep_pcie_write_reg(dev->phy, PCIE_PHY_POWER_STATE_CONFIG1, 0xA3); ep_pcie_write_reg(dev->phy, PCIE_PHY_POWER_STATE_CONFIG2, 0x1B); - - ep_pcie_write_reg(dev->phy, QSERDES_COM_PLL_VCOTAIL_EN, 0xE1); - ep_pcie_write_reg(dev->phy, QSERDES_COM_RESETSM_CNTRL2, 0x07); - ep_pcie_write_reg(dev->phy, QSERDES_COM_IE_TRIM, 0x3F); - ep_pcie_write_reg(dev->phy, QSERDES_COM_PLL_CNTRL, 0x46); - ep_pcie_write_reg(dev->phy, QSERDES_COM_PLLLOCK_CMP2 - + qserdes_com_oft, 0x05); - ep_pcie_write_reg(dev->phy, QSERDES_COM_PLLLOCK_CMP_EN - + qserdes_com_oft, 0x03); - ep_pcie_write_reg(dev->phy, QSERDES_COM_DEC_START1 - + qserdes_com_oft, 0x99); - ep_pcie_write_reg(dev->phy, QSERDES_RX_CDR_CONTROL1, 0xF5); - ep_pcie_write_reg(dev->phy, QSERDES_RX_CDR_CONTROL_HALF, 0x2C); - ep_pcie_write_reg(dev->phy, QSERDES_COM_RES_CODE_START_SEG1 - + qserdes_com_oft, 0x24); - ep_pcie_write_reg(dev->phy, QSERDES_RX_RX_EQ_GAIN1_MSB, 0x07); - ep_pcie_write_reg(dev->phy, QSERDES_RX_RX_EQU_ADAPTOR_CNTRL2, 0x1E); - ep_pcie_write_reg(dev->phy, QSERDES_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, - 0x67); - ep_pcie_write_reg(dev->phy, QSERDES_RX_RX_OFFSET_ADAPTOR_CNTRL2, 0x80); - ep_pcie_write_reg(dev->phy, QSERDES_RX_SIGDET_DEGLITCH_CNTRL, 0x0C); - ep_pcie_write_reg(dev->phy, PCIE_PHY_PWRUP_RESET_DLY_TIME_AUXCLK, 0x80); - ep_pcie_write_reg(dev->phy, PCIE_PHY_RX_IDLE_DTCT_CNTRL, 0x4D); - - if (dev->phy_rev == 1) { - ep_pcie_write_reg(dev->phy, QSERDES_RX_RX_RCVR_IQ_EN, 0x31); - ep_pcie_write_reg(dev->phy, QSERDES_COM_RESETSM_CNTRL2, 0x5); - ep_pcie_write_reg(dev->phy, QSERDES_COM_PLL_VCOTAIL_EN, 0x1); - } else if (dev->phy_rev == 3) { - ep_pcie_write_reg(dev->phy, QSERDES_COM_RES_CODE_START_SEG1 - + qserdes_com_oft, 0x20); - - ep_pcie_write_reg(dev->phy, QSERDES_COM_PLL_CP_SETI, 0x3F); - ep_pcie_write_reg(dev->phy, QSERDES_COM_PLL_IP_SETP, 0x34); - ep_pcie_write_reg(dev->phy, QSERDES_COM_IE_TRIM, 0x0F); - ep_pcie_write_reg(dev->phy, QSERDES_RX_CDR_CONTROL1, 0xF4); - ep_pcie_write_reg(dev->phy, QSERDES_RX_RX_EQ_GAIN1_MSB, 0x1F); - ep_pcie_write_reg(dev->phy, QSERDES_RX_SIGDET_CNTRL, 0x90); - ep_pcie_write_reg(dev->phy, QSERDES_RX_SIGDET_DEGLITCH_CNTRL, - 0x06); - - ep_pcie_write_reg(dev->phy, QSERDES_COM_PLL_CRCTRL - + qserdes_com_oft, 0x09); - - ep_pcie_write_reg(dev->phy, - QSERDES_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x49); - ep_pcie_write_reg(dev->phy, QSERDES_RX_UCDR_FO_GAIN, 0x09); - ep_pcie_write_reg(dev->phy, QSERDES_RX_UCDR_SO_GAIN, 0x04); - } - + ep_pcie_write_reg(dev->phy, PCIE_PHY_POWER_STATE_CONFIG4, 0x00); + ep_pcie_write_reg(dev->phy, PCIE_PHY_RCVR_DTCT_DLY_P1U2_L, 0xF1); + ep_pcie_write_reg(dev->phy, PCIE_PHY_RCVR_DTCT_DLY_P1U2_H, 0x01); + ep_pcie_write_reg(dev->phy, PCIE_PHY_LOCK_DETECT_CONFIG1, 0x80); + ep_pcie_write_reg(dev->phy, PCIE_PHY_LOCK_DETECT_CONFIG2, 0x02); + ep_pcie_write_reg(dev->phy, PCIE_PHY_LOCK_DETECT_CONFIG3, 0x40); + ep_pcie_write_reg(dev->phy, PCIE_PHY_LOCK_DETECT_CONFIG4, 0x07); + ep_pcie_write_reg(dev->phy, PCIE_PHY_PWRUP_RESET_DLY_TIME_AUXCLK, 0x40); + ep_pcie_write_reg(dev->phy, PCIE_PHY_LP_WAKEUP_DLY_TIME_AUXCLK, 0x40); + ep_pcie_write_reg(dev->phy, PCIE_PHY_L1SS_WAKEUP_DLY_TIME_AUXCLK_LSB, + 0x40); + ep_pcie_write_reg(dev->phy, PCIE_PHY_PLL_LOCK_CHK_DLY_TIME, 0x73); + ep_pcie_write_reg(dev->phy, PCIE_PHY_ELECIDLE_DLY_SEL, 0x01); + ep_pcie_write_reg(dev->phy, PCIE_PHY_SIGDET_CNTRL, 0x0F); + ep_pcie_write_reg(dev->phy, PCIE_PHY_RX_SIGDET_LVL, 0x77); ep_pcie_write_reg(dev->phy, PCIE_PHY_SW_RESET, 0x00); - ep_pcie_write_reg(dev->phy, PCIE_PHY_START, 0x03); + ep_pcie_write_reg(dev->phy, PCIE_PHY_START_CONTROL, 0x03); } bool ep_pcie_phy_is_ready(struct ep_pcie_dev_t *dev) diff --git a/drivers/platform/msm/ep_pcie/ep_pcie_phy.h b/drivers/platform/msm/ep_pcie/ep_pcie_phy.h index e0823e408f88..199e0760956a 100644 --- a/drivers/platform/msm/ep_pcie/ep_pcie_phy.h +++ b/drivers/platform/msm/ep_pcie/ep_pcie_phy.h @@ -13,339 +13,451 @@ #ifndef __EP_PCIE_PHY_H #define __EP_PCIE_PHY_H -#define QSERDES_COM_SYS_CLK_CTRL 0x0 -#define QSERDES_COM_PLL_VCOTAIL_EN 0x4 -#define QSERDES_COM_CMN_MODE 0x8 -#define QSERDES_COM_IE_TRIM 0xC -#define QSERDES_COM_IP_TRIM 0x10 -#define QSERDES_COM_PLL_CNTRL 0x14 -#define QSERDES_COM_PLL_PHSEL_CONTROL 0x18 -#define QSERDES_COM_IPTAT_TRIM_VCCA_TX_SEL 0x1C -#define QSERDES_COM_PLL_PHSEL_DC 0x20 -#define QSERDES_COM_PLL_IP_SETI 0x24 -#define QSERDES_COM_CORE_CLK_IN_SYNC_SEL 0x28 -#define QSERDES_COM_PLL_BKG_KVCO_CAL_EN 0x2C -#define QSERDES_COM_BIAS_EN_CLKBUFLR_EN 0x30 -#define QSERDES_COM_PLL_CP_SETI 0x34 -#define QSERDES_COM_PLL_IP_SETP 0x38 -#define QSERDES_COM_PLL_CP_SETP 0x3C -#define QSERDES_COM_ATB_SEL1 0x40 -#define QSERDES_COM_ATB_SEL2 0x44 -#define QSERDES_COM_SYSCLK_EN_SEL_TXBAND 0x48 -#define QSERDES_COM_RESETSM_CNTRL 0x4C -#define QSERDES_COM_RESETSM_CNTRL2 0x50 -#define QSERDES_COM_RESETSM_CNTRL3 0x54 -#define QSERDES_COM_DIV_REF1 0x58 -#define QSERDES_COM_DIV_REF2 0x5C -#define QSERDES_COM_KVCO_COUNT1 0x60 -#define QSERDES_COM_KVCO_COUNT2 0x64 -#define QSERDES_COM_KVCO_CAL_CNTRL 0x68 -#define QSERDES_COM_KVCO_CODE 0x6C -#define QSERDES_COM_VREF_CFG1 0x70 -#define QSERDES_COM_VREF_CFG2 0x74 -#define QSERDES_COM_VREF_CFG3 0x78 -#define QSERDES_COM_VREF_CFG4 0x7C -#define QSERDES_COM_VREF_CFG5 0x80 -#define QSERDES_COM_VREF_CFG6 0x84 -#define QSERDES_COM_PLLLOCK_CMP1 0x88 -#define QSERDES_COM_PLLLOCK_CMP2 0x8C -#define QSERDES_COM_PLLLOCK_CMP3 0x90 -#define QSERDES_COM_PLLLOCK_CMP_EN 0x94 -#define QSERDES_COM_BGTC 0x98 -#define QSERDES_COM_PLL_TEST_UPDN 0x9C -#define QSERDES_COM_PLL_VCO_TUNE 0xA0 -#define QSERDES_COM_DEC_START1 0xA4 -#define QSERDES_COM_PLL_AMP_OS 0xA8 -#define QSERDES_COM_SSC_EN_CENTER 0xAC -#define QSERDES_COM_SSC_ADJ_PER1 0xB0 -#define QSERDES_COM_SSC_ADJ_PER2 0xB4 -#define QSERDES_COM_SSC_PER1 0xB8 -#define QSERDES_COM_SSC_PER2 0xBC -#define QSERDES_COM_SSC_STEP_SIZE1 0xC0 -#define QSERDES_COM_SSC_STEP_SIZE2 0xC4 -#define QSERDES_COM_RES_CODE_UP 0xC8 -#define QSERDES_COM_RES_CODE_DN 0xCC -#define QSERDES_COM_RES_CODE_UP_OFFSET 0xD0 -#define QSERDES_COM_RES_CODE_DN_OFFSET 0xD4 -#define QSERDES_COM_RES_CODE_START_SEG1 0xD8 -#define QSERDES_COM_RES_CODE_START_SEG2 0xDC -#define QSERDES_COM_RES_CODE_CAL_CSR 0xE0 -#define QSERDES_COM_RES_CODE 0xE4 -#define QSERDES_COM_RES_TRIM_CONTROL 0xE8 -#define QSERDES_COM_RES_TRIM_CONTROL2 0xEC -#define QSERDES_COM_RES_TRIM_EN_VCOCALDONE 0xF0 -#define QSERDES_COM_FAUX_EN 0xF4 -#define QSERDES_COM_DIV_FRAC_START1 0xF8 -#define QSERDES_COM_DIV_FRAC_START2 0xFC -#define QSERDES_COM_DIV_FRAC_START3 0x100 -#define QSERDES_COM_DEC_START2 0x104 -#define QSERDES_COM_PLL_RXTXEPCLK_EN 0x108 -#define QSERDES_COM_PLL_CRCTRL 0x10C -#define QSERDES_COM_PLL_CLKEPDIV 0x110 -#define QSERDES_COM_PLL_FREQUPDATE 0x114 -#define QSERDES_COM_PLL_BKGCAL_TRIM_UP 0x118 -#define QSERDES_COM_PLL_BKGCAL_TRIM_DN 0x11C -#define QSERDES_COM_PLL_BKGCAL_TRIM_MUX 0x120 -#define QSERDES_COM_PLL_BKGCAL_VREF_CFG 0x124 -#define QSERDES_COM_PLL_BKGCAL_DIV_REF1 0x128 -#define QSERDES_COM_PLL_BKGCAL_DIV_REF2 0x12C -#define QSERDES_COM_MUXADDR 0x130 -#define QSERDES_COM_LOW_POWER_RO_CONTROL 0x134 -#define QSERDES_COM_POST_DIVIDER_CONTROL 0x138 -#define QSERDES_COM_HR_OCLK2_DIVIDER 0x13C -#define QSERDES_COM_HR_OCLK3_DIVIDER 0x140 -#define QSERDES_COM_PLL_VCO_HIGH 0x144 -#define QSERDES_COM_RESET_SM 0x148 -#define QSERDES_COM_MUXVAL 0x14C -#define QSERDES_TX_BIST_MODE_LANENO 0x200 -#define QSERDES_TX_CLKBUF_ENABLE 0x204 -#define QSERDES_TX_TX_EMP_POST1_LVL 0x208 -#define QSERDES_TX_TX_DRV_LVL 0x20C -#define QSERDES_TX_RESET_TSYNC_EN 0x210 -#define QSERDES_TX_LPB_EN 0x214 -#define QSERDES_TX_RES_CODE_UP 0x218 -#define QSERDES_TX_RES_CODE_DN 0x21C -#define QSERDES_TX_PERL_LENGTH1 0x220 -#define QSERDES_TX_PERL_LENGTH2 0x224 -#define QSERDES_TX_SERDES_BYP_EN_OUT 0x228 -#define QSERDES_TX_HIGHZ_TRANSCEIVEREN_BIAS_DRVR_EN 0x22C -#define QSERDES_TX_PARRATE_REC_DETECT_IDLE_EN 0x230 -#define QSERDES_TX_BIST_PATTERN1 0x234 -#define QSERDES_TX_BIST_PATTERN2 0x238 -#define QSERDES_TX_BIST_PATTERN3 0x23C -#define QSERDES_TX_BIST_PATTERN4 0x240 -#define QSERDES_TX_BIST_PATTERN5 0x244 -#define QSERDES_TX_BIST_PATTERN6 0x248 -#define QSERDES_TX_BIST_PATTERN7 0x24C -#define QSERDES_TX_BIST_PATTERN8 0x250 -#define QSERDES_TX_LANE_MODE 0x254 -#define QSERDES_TX_IDAC_CAL_LANE_MODE 0x258 -#define QSERDES_TX_IDAC_CAL_LANE_MODE_CONFIGURATION 0x25C -#define QSERDES_TX_ATB_SEL1 0x260 -#define QSERDES_TX_ATB_SEL2 0x264 -#define QSERDES_TX_RCV_DETECT_LVL 0x268 -#define QSERDES_TX_PRBS_SEED1 0x26C -#define QSERDES_TX_PRBS_SEED2 0x270 -#define QSERDES_TX_PRBS_SEED3 0x274 -#define QSERDES_TX_PRBS_SEED4 0x278 -#define QSERDES_TX_RESET_GEN 0x27C -#define QSERDES_TX_TRAN_DRVR_EMP_EN 0x280 -#define QSERDES_TX_TX_INTERFACE_MODE 0x284 -#define QSERDES_TX_PWM_CTRL 0x288 -#define QSERDES_TX_PWM_DATA 0x28C -#define QSERDES_TX_PWM_ENC_DIV_CTRL 0x290 -#define QSERDES_TX_VMODE_CTRL1 0x294 -#define QSERDES_TX_VMODE_CTRL2 0x298 -#define QSERDES_TX_VMODE_CTRL3 0x29C -#define QSERDES_TX_VMODE_CTRL4 0x2A0 -#define QSERDES_TX_VMODE_CTRL5 0x2A4 -#define QSERDES_TX_VMODE_CTRL6 0x2A8 -#define QSERDES_TX_VMODE_CTRL7 0x2AC -#define QSERDES_TX_TX_ALOG_INTF_OBSV_CNTL 0x2B0 -#define QSERDES_TX_BIST_STATUS 0x2B4 -#define QSERDES_TX_BIST_ERROR_COUNT1 0x2B8 -#define QSERDES_TX_BIST_ERROR_COUNT2 0x2BC -#define QSERDES_TX_TX_ALOG_INTF_OBSV 0x2C0 -#define QSERDES_TX_PWM_DEC_STATUS 0x2C4 -#define QSERDES_RX_CDR_CONTROL1 0x400 -#define QSERDES_RX_CDR_CONTROL2 0x404 -#define QSERDES_RX_CDR_CONTROL_HALF 0x408 -#define QSERDES_RX_CDR_CONTROL_QUARTER 0x40C -#define QSERDES_RX_CDR_CONTROL_EIGHTH 0x410 -#define QSERDES_RX_UCDR_FO_GAIN 0x414 -#define QSERDES_RX_UCDR_SO_GAIN 0x418 -#define QSERDES_RX_UCDR_SO_SATURATION_AND_ENABLE 0x41C -#define QSERDES_RX_UCDR_FO_TO_SO_DELAY 0x420 -#define QSERDES_RX_AUX_CONTROL 0x424 -#define QSERDES_RX_AUX_DATA_TCOARSE 0x428 -#define QSERDES_RX_AUX_DATA_TFINE_LSB 0x42C -#define QSERDES_RX_AUX_DATA_TFINE_MSB 0x430 -#define QSERDES_RX_RCLK_AUXDATA_SEL 0x434 -#define QSERDES_RX_AC_JTAG_ENABLE 0x438 -#define QSERDES_RX_AC_JTAG_INITP 0x43C -#define QSERDES_RX_AC_JTAG_INITN 0x440 -#define QSERDES_RX_AC_JTAG_LVL 0x444 -#define QSERDES_RX_AC_JTAG_MODE 0x448 -#define QSERDES_RX_AC_JTAG_RESET 0x44C -#define QSERDES_RX_RX_RCVR_IQ_EN 0x450 -#define QSERDES_RX_RX_IDAC_I_DC_OFFSETS 0x454 -#define QSERDES_RX_RX_IDAC_Q_DC_OFFSETS 0x458 -#define QSERDES_RX_RX_IDAC_A_DC_OFFSETS 0x45C -#define QSERDES_RX_RX_IDAC_EN 0x460 -#define QSERDES_RX_RX_IDAC_CTRL0 0x464 -#define QSERDES_RX_RX_IDAC_CTRL1 0x468 -#define QSERDES_RX_RX_EOM_EN 0x46C -#define QSERDES_RX_RX_EOM_CTRL0 0x470 -#define QSERDES_RX_RX_EOM_CTRL1 0x474 -#define QSERDES_RX_RX_EOM_CTRL2 0x478 -#define QSERDES_RX_RX_EOM_CTRL3 0x47C -#define QSERDES_RX_RX_EOM_CTRL4 0x480 -#define QSERDES_RX_RX_EOM_CTRL5 0x484 -#define QSERDES_RX_RX_EOM_CTRL6 0x488 -#define QSERDES_RX_RX_EOM_CTRL7 0x48C -#define QSERDES_RX_RX_EOM_CTRL8 0x490 -#define QSERDES_RX_RX_EOM_CTRL9 0x494 -#define QSERDES_RX_RX_EOM_CTRL10 0x498 -#define QSERDES_RX_RX_EOM_CTRL11 0x49C -#define QSERDES_RX_RX_HIGHZ_HIGHRATE 0x4A0 -#define QSERDES_RX_RX_TERM_AC_BYPASS_DC_COUPLE_OFFSET 0x4A4 -#define QSERDES_RX_RX_EQ_GAIN1_LSB 0x4A8 -#define QSERDES_RX_RX_EQ_GAIN1_MSB 0x4AC -#define QSERDES_RX_RX_EQ_GAIN2_LSB 0x4B0 -#define QSERDES_RX_RX_EQ_GAIN2_MSB 0x4B4 -#define QSERDES_RX_RX_EQU_ADAPTOR_CNTRL1 0x4B8 -#define QSERDES_RX_RX_EQU_ADAPTOR_CNTRL2 0x4BC -#define QSERDES_RX_RX_EQU_ADAPTOR_CNTRL3 0x4C0 -#define QSERDES_RX_RX_EQU_ADAPTOR_CNTRL4 0x4C4 -#define QSERDES_RX_RX_IDAC_CAL_CONFIGURATION 0x4C8 -#define QSERDES_RX_RX_IDAC_CAL_CONFIGURATION_2 0x4CC -#define QSERDES_RX_RX_IDAC_TSETTLE_LOW 0x4D0 -#define QSERDES_RX_RX_IDAC_TSETTLE_HIGH 0x4D4 -#define QSERDES_RX_RX_IDAC_ENDSAMP_LOW 0x4D8 -#define QSERDES_RX_RX_IDAC_ENDSAMP_HIGH 0x4DC -#define QSERDES_RX_RX_IDAC_MIDPOINT_LOW 0x4E0 -#define QSERDES_RX_RX_IDAC_MIDPOINT_HIGH 0x4E4 -#define QSERDES_RX_RX_EQ_OFFSET_LSB 0x4E8 -#define QSERDES_RX_RX_EQ_OFFSET_MSB 0x4EC -#define QSERDES_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1 0x4F0 -#define QSERDES_RX_RX_OFFSET_ADAPTOR_CNTRL2 0x4F4 -#define QSERDES_RX_SIGDET_ENABLES 0x4F8 -#define QSERDES_RX_SIGDET_ENABLES_2 0x4FC -#define QSERDES_RX_SIGDET_CNTRL 0x500 -#define QSERDES_RX_SIGDET_DEGLITCH_CNTRL 0x504 -#define QSERDES_RX_SIGDET_TIMER_LIMIT 0x508 -#define QSERDES_RX_RX_BAND 0x50C -#define QSERDES_RX_CDR_FREEZE_UP_DN 0x510 -#define QSERDES_RX_RX_INTERFACE_MODE 0x514 -#define QSERDES_RX_JITTER_GEN_MODE 0x518 -#define QSERDES_RX_BUJ_AMP 0x51C -#define QSERDES_RX_SJ_AMP1 0x520 -#define QSERDES_RX_SJ_AMP2 0x524 -#define QSERDES_RX_SJ_PER1 0x528 -#define QSERDES_RX_SJ_PER2 0x52C -#define QSERDES_RX_BUJ_STEP_FREQ1 0x530 -#define QSERDES_RX_BUJ_STEP_FREQ2 0x534 -#define QSERDES_RX_PPM_OFFSET1 0x538 -#define QSERDES_RX_PPM_OFFSET2 0x53C -#define QSERDES_RX_SIGN_PPM_PERIOD1 0x540 -#define QSERDES_RX_SIGN_PPM_PERIOD2 0x544 -#define QSERDES_RX_SSC_CTRL 0x548 -#define QSERDES_RX_SSC_COUNT1 0x54C -#define QSERDES_RX_SSC_COUNT2 0x550 -#define QSERDES_RX_RX_ALOG_INTF_OBSV_CNTL 0x554 -#define QSERDES_RX_PI_CTRL1 0x558 -#define QSERDES_RX_PI_CTRL2 0x55C -#define QSERDES_RX_PI_QUAD 0x560 -#define QSERDES_RX_IDATA1 0x564 -#define QSERDES_RX_IDATA2 0x568 -#define QSERDES_RX_AUX_DATA1 0x56C -#define QSERDES_RX_AUX_DATA2 0x570 -#define QSERDES_RX_AC_JTAG_OUTP 0x574 -#define QSERDES_RX_AC_JTAG_OUTN 0x578 -#define QSERDES_RX_RX_SIGDET 0x57C -#define QSERDES_RX_RX_VDCOFF 0x580 -#define QSERDES_RX_IDAC_CAL_ON 0x584 -#define QSERDES_RX_IDAC_STATUS_I 0x588 -#define QSERDES_RX_IDAC_STATUS_Q 0x58C -#define QSERDES_RX_IDAC_STATUS_A 0x590 -#define QSERDES_RX_CALST_STATUS_I 0x594 -#define QSERDES_RX_CALST_STATUS_Q 0x598 -#define QSERDES_RX_CALST_STATUS_A 0x59C -#define QSERDES_RX_EOM_STATUS0 0x5A0 -#define QSERDES_RX_EOM_STATUS1 0x5A4 -#define QSERDES_RX_EOM_STATUS2 0x5A8 -#define QSERDES_RX_EOM_STATUS3 0x5AC -#define QSERDES_RX_EOM_STATUS4 0x5B0 -#define QSERDES_RX_EOM_STATUS5 0x5B4 -#define QSERDES_RX_EOM_STATUS6 0x5B8 -#define QSERDES_RX_EOM_STATUS7 0x5BC -#define QSERDES_RX_EOM_STATUS8 0x5C0 -#define QSERDES_RX_EOM_STATUS9 0x5C4 -#define QSERDES_RX_RX_ALOG_INTF_OBSV 0x5C8 -#define QSERDES_RX_READ_EQCODE 0x5CC -#define QSERDES_RX_READ_OFFSETCODE 0x5D0 -#define PCIE_PHY_SW_RESET 0x600 -#define PCIE_PHY_POWER_DOWN_CONTROL 0x604 -#define PCIE_PHY_START 0x608 -#define PCIE_PHY_TXMGN_V1_V0 0x60C -#define PCIE_PHY_TXMGN_V3_V2 0x610 -#define PCIE_PHY_TXMGN_LS_V4 0x614 -#define PCIE_PHY_TXDEEMPH_M6DB_V0 0x618 -#define PCIE_PHY_TXDEEMPH_M3P5DB_V0 0x61C -#define PCIE_PHY_TXDEEMPH_M6DB_V1 0x620 -#define PCIE_PHY_TXDEEMPH_M3P5DB_V1 0x624 -#define PCIE_PHY_TXDEEMPH_M6DB_V2 0x628 -#define PCIE_PHY_TXDEEMPH_M3P5DB_V2 0x62C -#define PCIE_PHY_TXDEEMPH_M6DB_V3 0x630 -#define PCIE_PHY_TXDEEMPH_M3P5DB_V3 0x634 -#define PCIE_PHY_TXDEEMPH_M6DB_V4 0x638 -#define PCIE_PHY_TXDEEMPH_M3P5DB_V4 0x63C -#define PCIE_PHY_TXDEEMPH_M6DB_LS 0x640 -#define PCIE_PHY_TXDEEMPH_M3P5DB_LS 0x644 -#define PCIE_PHY_ENDPOINT_REFCLK_DRIVE 0x648 -#define PCIE_PHY_RX_IDLE_DTCT_CNTRL 0x64C -#define PCIE_PHY_POWER_STATE_CONFIG1 0x650 -#define PCIE_PHY_POWER_STATE_CONFIG2 0x654 -#define PCIE_PHY_POWER_STATE_CONFIG3 0x658 -#define PCIE_PHY_RCVR_DTCT_DLY_P1U2_L 0x65C -#define PCIE_PHY_RCVR_DTCT_DLY_P1U2_H 0x660 -#define PCIE_PHY_RCVR_DTCT_DLY_U3_L 0x664 -#define PCIE_PHY_RCVR_DTCT_DLY_U3_H 0x668 -#define PCIE_PHY_LOCK_DETECT_CONFIG1 0x66C -#define PCIE_PHY_LOCK_DETECT_CONFIG2 0x670 -#define PCIE_PHY_LOCK_DETECT_CONFIG3 0x674 -#define PCIE_PHY_TSYNC_RSYNC_TIME 0x678 -#define PCIE_PHY_SIGDET_LOW_2_IDLE_TIME 0x67C -#define PCIE_PHY_BEACON_2_IDLE_TIME_L 0x680 -#define PCIE_PHY_BEACON_2_IDLE_TIME_H 0x684 -#define PCIE_PHY_PWRUP_RESET_DLY_TIME_SYSCLK 0x688 -#define PCIE_PHY_PWRUP_RESET_DLY_TIME_AUXCLK 0x68C -#define PCIE_PHY_LFPS_DET_HIGH_COUNT_VAL 0x690 -#define PCIE_PHY_LFPS_TX_ECSTART_EQTLOCK 0x694 -#define PCIE_PHY_LFPS_TX_END_CNT_P2U3_START 0x698 -#define PCIE_PHY_RXEQTRAINING_WAIT_TIME 0x69C -#define PCIE_PHY_RXEQTRAINING_RUN_TIME 0x6A0 -#define PCIE_PHY_TXONESZEROS_RUN_LENGTH 0x6A4 -#define PCIE_PHY_FLL_CNTRL1 0x6A8 -#define PCIE_PHY_FLL_CNTRL2 0x6AC -#define PCIE_PHY_FLL_CNT_VAL_L 0x6B0 -#define PCIE_PHY_FLL_CNT_VAL_H_TOL 0x6B4 -#define PCIE_PHY_FLL_MAN_CODE 0x6B8 -#define PCIE_PHY_AUTONOMOUS_MODE_CTRL 0x6BC -#define PCIE_PHY_LFPS_RXTERM_IRQ_CLEAR 0x6C0 -#define PCIE_PHY_ARCVR_DTCT_EN_PERIOD 0x6C4 -#define PCIE_PHY_ARCVR_DTCT_CM_DLY 0x6C8 -#define PCIE_PHY_ALFPS_DEGLITCH_VAL 0x6CC -#define PCIE_PHY_INSIG_SW_CTRL1 0x6D0 -#define PCIE_PHY_INSIG_SW_CTRL2 0x6D4 -#define PCIE_PHY_INSIG_SW_CTRL3 0x6D8 -#define PCIE_PHY_INSIG_MX_CTRL1 0x6DC -#define PCIE_PHY_INSIG_MX_CTRL2 0x6E0 -#define PCIE_PHY_INSIG_MX_CTRL3 0x6E4 -#define PCIE_PHY_TEST_CONTROL 0x6E8 -#define PCIE_PHY_BIST_CTRL 0x6EC -#define PCIE_PHY_PRBS_POLY0 0x6F0 -#define PCIE_PHY_PRBS_POLY1 0x6F4 -#define PCIE_PHY_PRBS_SEED0 0x6F8 -#define PCIE_PHY_PRBS_SEED1 0x6FC -#define PCIE_PHY_FIXED_PAT_CTRL 0x700 -#define PCIE_PHY_FIXED_PAT0 0x704 -#define PCIE_PHY_FIXED_PAT1 0x708 -#define PCIE_PHY_FIXED_PAT2 0x70C -#define PCIE_PHY_FIXED_PAT3 0x710 -#define PCIE_PHY_SPARE1 0x714 -#define PCIE_PHY_BIST_CHK_ERR_CNT_L 0x718 -#define PCIE_PHY_BIST_CHK_ERR_CNT_H 0x71C -#define PCIE_PHY_BIST_CHK_STATUS 0x720 -#define PCIE_PHY_LFPS_RXTERM_IRQ_SOURCE 0x724 -#define PCIE_PHY_PCS_STATUS 0x728 -#define PCIE_PHY_PCS_STATUS2 0x72C -#define PCIE_PHY_REVISION_ID0 0x730 -#define PCIE_PHY_REVISION_ID1 0x734 -#define PCIE_PHY_REVISION_ID2 0x738 -#define PCIE_PHY_REVISION_ID3 0x73C -#define PCIE_PHY_DEBUG_BUS_0_STATUS 0x740 -#define PCIE_PHY_DEBUG_BUS_1_STATUS 0x744 -#define PCIE_PHY_DEBUG_BUS_2_STATUS 0x748 -#define PCIE_PHY_DEBUG_BUS_3_STATUS 0x74C +#define QSERDES_COM_ATB_SEL1 0x000 +#define QSERDES_COM_ATB_SEL2 0x004 +#define QSERDES_COM_FREQ_UPDATE 0x008 +#define QSERDES_COM_BG_TIMER 0x00C +#define QSERDES_COM_SSC_EN_CENTER 0x010 +#define QSERDES_COM_SSC_ADJ_PER1 0x014 +#define QSERDES_COM_SSC_ADJ_PER2 0x018 +#define QSERDES_COM_SSC_PER1 0x01C +#define QSERDES_COM_SSC_PER2 0x020 +#define QSERDES_COM_SSC_STEP_SIZE1 0x024 +#define QSERDES_COM_SSC_STEP_SIZE2 0x028 +#define QSERDES_COM_POST_DIV 0x02C +#define QSERDES_COM_POST_DIV_MUX 0x030 +#define QSERDES_COM_BIAS_EN_CLKBUFLR_EN 0x034 +#define QSERDES_COM_CLK_ENABLE1 0x038 +#define QSERDES_COM_SYS_CLK_CTRL 0x03C +#define QSERDES_COM_SYSCLK_BUF_ENABLE 0x040 +#define QSERDES_COM_PLL_EN 0x044 +#define QSERDES_COM_PLL_IVCO 0x048 +#define QSERDES_COM_LOCK_CMP1_MODE0 0x04C +#define QSERDES_COM_LOCK_CMP2_MODE0 0x050 +#define QSERDES_COM_LOCK_CMP3_MODE0 0x054 +#define QSERDES_COM_LOCK_CMP1_MODE1 0x058 +#define QSERDES_COM_LOCK_CMP2_MODE1 0x05C +#define QSERDES_COM_LOCK_CMP3_MODE1 0x060 +#define QSERDES_COM_CMN_RSVD0 0x064 +#define QSERDES_COM_EP_CLOCK_DETECT_CTRL 0x068 +#define QSERDES_COM_SYSCLK_DET_COMP_STATUS 0x06C +#define QSERDES_COM_BG_TRIM 0x070 +#define QSERDES_COM_CLK_EP_DIV 0x074 +#define QSERDES_COM_CP_CTRL_MODE0 0x078 +#define QSERDES_COM_CP_CTRL_MODE1 0x07C +#define QSERDES_COM_CMN_RSVD1 0x080 +#define QSERDES_COM_PLL_RCTRL_MODE0 0x084 +#define QSERDES_COM_PLL_RCTRL_MODE1 0x088 +#define QSERDES_COM_CMN_RSVD2 0x08C +#define QSERDES_COM_PLL_CCTRL_MODE0 0x090 +#define QSERDES_COM_PLL_CCTRL_MODE1 0x094 +#define QSERDES_COM_CMN_RSVD3 0x098 +#define QSERDES_COM_PLL_CNTRL 0x09C +#define QSERDES_COM_PHASE_SEL_CTRL 0x0A0 +#define QSERDES_COM_PHASE_SEL_DC 0x0A4 +#define QSERDES_COM_BIAS_EN_CTRL_BY_PSM 0x0A8 +#define QSERDES_COM_SYSCLK_EN_SEL 0x0AC +#define QSERDES_COM_CML_SYSCLK_SEL 0x0B0 +#define QSERDES_COM_RESETSM_CNTRL 0x0B4 +#define QSERDES_COM_RESETSM_CNTRL2 0x0B8 +#define QSERDES_COM_RESTRIM_CTRL 0x0BC +#define QSERDES_COM_RESTRIM_CTRL2 0x0C0 +#define QSERDES_COM_RESCODE_DIV_NUM 0x0C4 +#define QSERDES_COM_LOCK_CMP_EN 0x0C8 +#define QSERDES_COM_LOCK_CMP_CFG 0x0CC +#define QSERDES_COM_DEC_START_MODE0 0x0D0 +#define QSERDES_COM_DEC_START_MODE1 0x0D4 +#define QSERDES_COM_VCOCAL_DEADMAN_CTRL 0x0D8 +#define QSERDES_COM_DIV_FRAC_START1_MODE0 0x0DC +#define QSERDES_COM_DIV_FRAC_START2_MODE0 0x0E0 +#define QSERDES_COM_DIV_FRAC_START3_MODE0 0x0E4 +#define QSERDES_COM_DIV_FRAC_START1_MODE1 0x0E8 +#define QSERDES_COM_DIV_FRAC_START2_MODE1 0x0EC +#define QSERDES_COM_DIV_FRAC_START3_MODE1 0x0F0 +#define QSERDES_COM_VCO_TUNE_MINVAL1 0x0F4 +#define QSERDES_COM_VCO_TUNE_MINVAL2 0x0F8 +#define QSERDES_COM_CMN_RSVD4 0x0FC +#define QSERDES_COM_INTEGLOOP_INITVAL 0x100 +#define QSERDES_COM_INTEGLOOP_EN 0x104 +#define QSERDES_COM_INTEGLOOP_GAIN0_MODE0 0x108 +#define QSERDES_COM_INTEGLOOP_GAIN1_MODE0 0x10C +#define QSERDES_COM_INTEGLOOP_GAIN0_MODE1 0x110 +#define QSERDES_COM_INTEGLOOP_GAIN1_MODE1 0x114 +#define QSERDES_COM_VCO_TUNE_MAXVAL1 0x118 +#define QSERDES_COM_VCO_TUNE_MAXVAL2 0x11C +#define QSERDES_COM_RES_TRIM_CONTROL2 0x120 +#define QSERDES_COM_VCO_TUNE_CTRL 0x124 +#define QSERDES_COM_VCO_TUNE_MAP 0x128 +#define QSERDES_COM_VCO_TUNE1_MODE0 0x12C +#define QSERDES_COM_VCO_TUNE2_MODE0 0x130 +#define QSERDES_COM_VCO_TUNE1_MODE1 0x134 +#define QSERDES_COM_VCO_TUNE2_MODE1 0x138 +#define QSERDES_COM_VCO_TUNE_INITVAL1 0x13C +#define QSERDES_COM_VCO_TUNE_INITVAL2 0x140 +#define QSERDES_COM_VCO_TUNE_TIMER1 0x144 +#define QSERDES_COM_VCO_TUNE_TIMER2 0x148 +#define QSERDES_COM_SAR 0x14C +#define QSERDES_COM_SAR_CLK 0x150 +#define QSERDES_COM_SAR_CODE_OUT_STATUS 0x154 +#define QSERDES_COM_SAR_CODE_READY_STATUS 0x158 +#define QSERDES_COM_CMN_STATUS 0x15C +#define QSERDES_COM_RESET_SM_STATUS 0x160 +#define QSERDES_COM_RESTRIM_CODE_STATUS 0x164 +#define QSERDES_COM_PLLCAL_CODE1_STATUS 0x168 +#define QSERDES_COM_PLLCAL_CODE2_STATUS 0x16C +#define QSERDES_COM_BG_CTRL 0x170 +#define QSERDES_COM_CLK_SELECT 0x174 +#define QSERDES_COM_HSCLK_SEL 0x178 +#define QSERDES_COM_PLL_ANALOG 0x180 +#define QSERDES_COM_CORECLK_DIV 0x184 +#define QSERDES_COM_SW_RESET 0x188 +#define QSERDES_COM_CORE_CLK_EN 0x18C +#define QSERDES_COM_C_READY_STATUS 0x190 +#define QSERDES_COM_CMN_CONFIG 0x194 +#define QSERDES_COM_CMN_RATE_OVERRIDE 0x198 +#define QSERDES_COM_SVS_MODE_CLK_SEL 0x19C +#define QSERDES_COM_DEBUG_BUS0 0x1A0 +#define QSERDES_COM_DEBUG_BUS1 0x1A4 +#define QSERDES_COM_DEBUG_BUS2 0x1A8 +#define QSERDES_COM_DEBUG_BUS3 0x1AC +#define QSERDES_COM_DEBUG_BUS_SEL 0x1B0 +#define QSERDES_COM_CMN_MISC1 0x1B4 +#define QSERDES_COM_CMN_MISC2 0x1B8 +#define QSERDES_COM_CORECLK_DIV_MODE1 0x1BC +#define QSERDES_COM_CMN_RSVD5 0x1C0 +#define QSERDES_TX_BIST_MODE_LANENO 0x200 +#define QSERDES_TX_BIST_INVERT 0x204 +#define QSERDES_TX_CLKBUF_ENABLE 0x208 +#define QSERDES_TX_CMN_CONTROL_ONE 0x20C +#define QSERDES_TX_CMN_CONTROL_TWO 0x210 +#define QSERDES_TX_CMN_CONTROL_THREE 0x214 +#define QSERDES_TX_TX_EMP_POST1_LVL 0x218 +#define QSERDES_TX_TX_POST2_EMPH 0x21C +#define QSERDES_TX_TX_BOOST_LVL_UP_DN 0x220 +#define QSERDES_TX_HP_PD_ENABLES 0x224 +#define QSERDES_TX_TX_IDLE_LVL_LARGE_AMP 0x228 +#define QSERDES_TX_TX_DRV_LVL 0x22C +#define QSERDES_TX_TX_DRV_LVL_OFFSET 0x230 +#define QSERDES_TX_RESET_TSYNC_EN 0x234 +#define QSERDES_TX_PRE_STALL_LDO_BOOST_EN 0x238 +#define QSERDES_TX_TX_BAND 0x23C +#define QSERDES_TX_SLEW_CNTL 0x240 +#define QSERDES_TX_INTERFACE_SELECT 0x244 +#define QSERDES_TX_LPB_EN 0x248 +#define QSERDES_TX_RES_CODE_LANE_TX 0x24C +#define QSERDES_TX_RES_CODE_LANE_RX 0x250 +#define QSERDES_TX_RES_CODE_LANE_OFFSET 0x254 +#define QSERDES_TX_PERL_LENGTH1 0x258 +#define QSERDES_TX_PERL_LENGTH2 0x25C +#define QSERDES_TX_SERDES_BYP_EN_OUT 0x260 +#define QSERDES_TX_DEBUG_BUS_SEL 0x264 +#define QSERDES_TX_HIGHZ_TRANSCEIVEREN_BIAS_DRVR_EN 0x268 +#define QSERDES_TX_TX_POL_INV 0x26C +#define QSERDES_TX_PARRATE_REC_DETECT_IDLE_EN 0x270 +#define QSERDES_TX_BIST_PATTERN1 0x274 +#define QSERDES_TX_BIST_PATTERN2 0x278 +#define QSERDES_TX_BIST_PATTERN3 0x27C +#define QSERDES_TX_BIST_PATTERN4 0x280 +#define QSERDES_TX_BIST_PATTERN5 0x284 +#define QSERDES_TX_BIST_PATTERN6 0x288 +#define QSERDES_TX_BIST_PATTERN7 0x28C +#define QSERDES_TX_BIST_PATTERN8 0x290 +#define QSERDES_TX_LANE_MODE 0x294 +#define QSERDES_TX_IDAC_CAL_LANE_MODE 0x298 +#define QSERDES_TX_IDAC_CAL_LANE_MODE_CONFIGURATION 0x29C +#define QSERDES_TX_ATB_SEL1 0x2A0 +#define QSERDES_TX_ATB_SEL2 0x2A4 +#define QSERDES_TX_RCV_DETECT_LVL 0x2A8 +#define QSERDES_TX_RCV_DETECT_LVL_2 0x2AC +#define QSERDES_TX_PRBS_SEED1 0x2B0 +#define QSERDES_TX_PRBS_SEED2 0x2B4 +#define QSERDES_TX_PRBS_SEED3 0x2B8 +#define QSERDES_TX_PRBS_SEED4 0x2BC +#define QSERDES_TX_RESET_GEN 0x2C0 +#define QSERDES_TX_RESET_GEN_MUXES 0x2C4 +#define QSERDES_TX_TRAN_DRVR_EMP_EN 0x2C8 +#define QSERDES_TX_TX_INTERFACE_MODE 0x2CC +#define QSERDES_TX_PWM_CTRL 0x2D0 +#define QSERDES_TX_PWM_ENCODED_OR_DATA 0x2D4 +#define QSERDES_TX_PWM_GEAR_1_DIVIDER_BAND2 0x2D8 +#define QSERDES_TX_PWM_GEAR_2_DIVIDER_BAND2 0x2DC +#define QSERDES_TX_PWM_GEAR_3_DIVIDER_BAND2 0x2E0 +#define QSERDES_TX_PWM_GEAR_4_DIVIDER_BAND2 0x2E4 +#define QSERDES_TX_PWM_GEAR_1_DIVIDER_BAND0_1 0x2E8 +#define QSERDES_TX_PWM_GEAR_2_DIVIDER_BAND0_1 0x2EC +#define QSERDES_TX_PWM_GEAR_3_DIVIDER_BAND0_1 0x2F0 +#define QSERDES_TX_PWM_GEAR_4_DIVIDER_BAND0_1 0x2F4 +#define QSERDES_TX_VMODE_CTRL1 0x2F8 +#define QSERDES_TX_VMODE_CTRL2 0x2FC +#define QSERDES_TX_TX_ALOG_INTF_OBSV_CNTL 0x300 +#define QSERDES_TX_BIST_STATUS 0x304 +#define QSERDES_TX_BIST_ERROR_COUNT1 0x308 +#define QSERDES_TX_BIST_ERROR_COUNT2 0x30C +#define QSERDES_TX_TX_ALOG_INTF_OBSV 0x310 +#define QSERDES_RX_UCDR_FO_GAIN_HALF 0x400 +#define QSERDES_RX_UCDR_FO_GAIN_QUARTER 0x404 +#define QSERDES_RX_UCDR_FO_GAIN_EIGHTH 0x408 +#define QSERDES_RX_UCDR_FO_GAIN 0x40C +#define QSERDES_RX_UCDR_SO_GAIN_HALF 0x410 +#define QSERDES_RX_UCDR_SO_GAIN_QUARTER 0x414 +#define QSERDES_RX_UCDR_SO_GAIN_EIGHTH 0x418 +#define QSERDES_RX_UCDR_SO_GAIN 0x41C +#define QSERDES_RX_UCDR_SVS_FO_GAIN_HALF 0x420 +#define QSERDES_RX_UCDR_SVS_FO_GAIN_QUARTER 0x424 +#define QSERDES_RX_UCDR_SVS_FO_GAIN_EIGHTH 0x428 +#define QSERDES_RX_UCDR_SVS_FO_GAIN 0x42C +#define QSERDES_RX_UCDR_SVS_SO_GAIN_HALF 0x430 +#define QSERDES_RX_UCDR_SVS_SO_GAIN_QUARTER 0x434 +#define QSERDES_RX_UCDR_SVS_SO_GAIN_EIGHTH 0x438 +#define QSERDES_RX_UCDR_SVS_SO_GAIN 0x43C +#define QSERDES_RX_UCDR_FASTLOCK_FO_GAIN 0x440 +#define QSERDES_RX_UCDR_FD_GAIN 0x444 +#define QSERDES_RX_UCDR_SO_SATURATION_AND_ENABLE 0x448 +#define QSERDES_RX_UCDR_FO_TO_SO_DELAY 0x44C +#define QSERDES_RX_UCDR_FASTLOCK_COUNT_LOW 0x450 +#define QSERDES_RX_UCDR_FASTLOCK_COUNT_HIGH 0x454 +#define QSERDES_RX_UCDR_MODULATE 0x458 +#define QSERDES_RX_UCDR_PI_CONTROLS 0x45C +#define QSERDES_RX_RBIST_CONTROL 0x460 +#define QSERDES_RX_AUX_CONTROL 0x464 +#define QSERDES_RX_AUX_DATA_TCOARSE 0x468 +#define QSERDES_RX_AUX_DATA_TFINE_LSB 0x46C +#define QSERDES_RX_AUX_DATA_TFINE_MSB 0x470 +#define QSERDES_RX_RCLK_AUXDATA_SEL 0x474 +#define QSERDES_RX_AC_JTAG_ENABLE 0x478 +#define QSERDES_RX_AC_JTAG_INITP 0x47C +#define QSERDES_RX_AC_JTAG_INITN 0x480 +#define QSERDES_RX_AC_JTAG_LVL 0x484 +#define QSERDES_RX_AC_JTAG_MODE 0x488 +#define QSERDES_RX_AC_JTAG_RESET 0x48C +#define QSERDES_RX_RX_TERM_BW 0x490 +#define QSERDES_RX_RX_RCVR_IQ_EN 0x494 +#define QSERDES_RX_RX_IDAC_I_DC_OFFSETS 0x498 +#define QSERDES_RX_RX_IDAC_IBAR_DC_OFFSETS 0x49C +#define QSERDES_RX_RX_IDAC_Q_DC_OFFSETS 0x4A0 +#define QSERDES_RX_RX_IDAC_QBAR_DC_OFFSETS 0x4A4 +#define QSERDES_RX_RX_IDAC_A_DC_OFFSETS 0x4A8 +#define QSERDES_RX_RX_IDAC_ABAR_DC_OFFSETS 0x4AC +#define QSERDES_RX_RX_IDAC_EN 0x4B0 +#define QSERDES_RX_RX_IDAC_ENABLES 0x4B4 +#define QSERDES_RX_RX_IDAC_SIGN 0x4B8 +#define QSERDES_RX_RX_HIGHZ_HIGHRATE 0x4BC +#define QSERDES_RX_RX_TERM_AC_BYPASS_DC_COUPLE_OFFSET 0x4C0 +#define QSERDES_RX_RX_EQ_GAIN1_LSB 0x4C4 +#define QSERDES_RX_RX_EQ_GAIN1_MSB 0x4C8 +#define QSERDES_RX_RX_EQ_GAIN2_LSB 0x4CC +#define QSERDES_RX_RX_EQ_GAIN2_MSB 0x4D0 +#define QSERDES_RX_RX_EQU_ADAPTOR_CNTRL1 0x4D4 +#define QSERDES_RX_RX_EQU_ADAPTOR_CNTRL2 0x4D8 +#define QSERDES_RX_RX_EQU_ADAPTOR_CNTRL3 0x4DC +#define QSERDES_RX_RX_EQU_ADAPTOR_CNTRL4 0x4E0 +#define QSERDES_RX_RX_IDAC_CAL_CONFIGURATION 0x4E4 +#define QSERDES_RX_RX_IDAC_TSETTLE_LOW 0x4E8 +#define QSERDES_RX_RX_IDAC_TSETTLE_HIGH 0x4EC +#define QSERDES_RX_RX_IDAC_ENDSAMP_LOW 0x4F0 +#define QSERDES_RX_RX_IDAC_ENDSAMP_HIGH 0x4F4 +#define QSERDES_RX_RX_IDAC_MIDPOINT_LOW 0x4F8 +#define QSERDES_RX_RX_IDAC_MIDPOINT_HIGH 0x4FC +#define QSERDES_RX_RX_EQ_OFFSET_LSB 0x500 +#define QSERDES_RX_RX_EQ_OFFSET_MSB 0x504 +#define QSERDES_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1 0x508 +#define QSERDES_RX_RX_OFFSET_ADAPTOR_CNTRL2 0x50C +#define QSERDES_RX_SIGDET_ENABLES 0x510 +#define QSERDES_RX_SIGDET_CNTRL 0x514 +#define QSERDES_RX_SIGDET_LVL 0x518 +#define QSERDES_RX_SIGDET_DEGLITCH_CNTRL 0x51C +#define QSERDES_RX_RX_BAND 0x520 +#define QSERDES_RX_CDR_FREEZE_UP_DN 0x524 +#define QSERDES_RX_CDR_RESET_OVERRIDE 0x528 +#define QSERDES_RX_RX_INTERFACE_MODE 0x52C +#define QSERDES_RX_JITTER_GEN_MODE 0x530 +#define QSERDES_RX_BUJ_AMP 0x534 +#define QSERDES_RX_SJ_AMP1 0x538 +#define QSERDES_RX_SJ_AMP2 0x53C +#define QSERDES_RX_SJ_PER1 0x540 +#define QSERDES_RX_SJ_PER2 0x544 +#define QSERDES_RX_BUJ_STEP_FREQ1 0x548 +#define QSERDES_RX_BUJ_STEP_FREQ2 0x54C +#define QSERDES_RX_PPM_OFFSET1 0x550 +#define QSERDES_RX_PPM_OFFSET2 0x554 +#define QSERDES_RX_SIGN_PPM_PERIOD1 0x558 +#define QSERDES_RX_SIGN_PPM_PERIOD2 0x55C +#define QSERDES_RX_SSC_CTRL 0x560 +#define QSERDES_RX_SSC_COUNT1 0x564 +#define QSERDES_RX_SSC_COUNT2 0x568 +#define QSERDES_RX_RX_ALOG_INTF_OBSV_CNTL 0x56C +#define QSERDES_RX_RX_PWM_ENABLE_AND_DATA 0x570 +#define QSERDES_RX_RX_PWM_GEAR1_TIMEOUT_COUNT 0x574 +#define QSERDES_RX_RX_PWM_GEAR2_TIMEOUT_COUNT 0x578 +#define QSERDES_RX_RX_PWM_GEAR3_TIMEOUT_COUNT 0x57C +#define QSERDES_RX_RX_PWM_GEAR4_TIMEOUT_COUNT 0x580 +#define QSERDES_RX_PI_CTRL1 0x584 +#define QSERDES_RX_PI_CTRL2 0x588 +#define QSERDES_RX_PI_QUAD 0x58C +#define QSERDES_RX_IDATA1 0x590 +#define QSERDES_RX_IDATA2 0x594 +#define QSERDES_RX_AUX_DATA1 0x598 +#define QSERDES_RX_AUX_DATA2 0x59C +#define QSERDES_RX_AC_JTAG_OUTP 0x5A0 +#define QSERDES_RX_AC_JTAG_OUTN 0x5A4 +#define QSERDES_RX_RX_SIGDET 0x5A8 +#define QSERDES_RX_RX_VDCOFF 0x5AC +#define QSERDES_RX_IDAC_CAL_ON 0x5B0 +#define QSERDES_RX_IDAC_STATUS_I 0x5B4 +#define QSERDES_RX_IDAC_STATUS_IBAR 0x5B8 +#define QSERDES_RX_IDAC_STATUS_Q 0x5BC +#define QSERDES_RX_IDAC_STATUS_QBAR 0x5C0 +#define QSERDES_RX_IDAC_STATUS_A 0x5C4 +#define QSERDES_RX_IDAC_STATUS_ABAR 0x5C8 +#define QSERDES_RX_CALST_STATUS_I 0x5CC +#define QSERDES_RX_CALST_STATUS_Q 0x5D0 +#define QSERDES_RX_CALST_STATUS_A 0x5D4 +#define QSERDES_RX_RX_ALOG_INTF_OBSV 0x5D8 +#define QSERDES_RX_READ_EQCODE 0x5DC +#define QSERDES_RX_READ_OFFSETCODE 0x5E0 +#define QSERDES_RX_IA_ERROR_COUNTER_LOW 0x5E4 +#define QSERDES_RX_IA_ERROR_COUNTER_HIGH 0x5E8 +#define PCIE_PHY_MISC_DEBUG_BUS_BYTE0_INDEX 0x600 +#define PCIE_PHY_MISC_DEBUG_BUS_BYTE1_INDEX 0x604 +#define PCIE_PHY_MISC_DEBUG_BUS_BYTE2_INDEX 0x608 +#define PCIE_PHY_MISC_DEBUG_BUS_BYTE3_INDEX 0x60C +#define PCIE_PHY_MISC_PLACEHOLDER_STATUS 0x610 +#define PCIE_PHY_MISC_DEBUG_BUS_0_STATUS 0x614 +#define PCIE_PHY_MISC_DEBUG_BUS_1_STATUS 0x618 +#define PCIE_PHY_MISC_DEBUG_BUS_2_STATUS 0x61C +#define PCIE_PHY_MISC_DEBUG_BUS_3_STATUS 0x620 +#define PCIE_PHY_MISC_OSC_DTCT_STATUS 0x624 +#define PCIE_PHY_MISC_OSC_DTCT_CONFIG1 0x628 +#define PCIE_PHY_MISC_OSC_DTCT_CONFIG2 0x62C +#define PCIE_PHY_MISC_OSC_DTCT_CONFIG3 0x630 +#define PCIE_PHY_MISC_OSC_DTCT_CONFIG4 0x634 +#define PCIE_PHY_MISC_OSC_DTCT_CONFIG5 0x638 +#define PCIE_PHY_MISC_OSC_DTCT_CONFIG6 0x63C +#define PCIE_PHY_MISC_OSC_DTCT_CONFIG7 0x640 +#define PCIE_PHY_SW_RESET 0x800 +#define PCIE_PHY_POWER_DOWN_CONTROL 0x804 +#define PCIE_PHY_START_CONTROL 0x808 +#define PCIE_PHY_TXMGN_V0 0x80C +#define PCIE_PHY_TXMGN_V1 0x810 +#define PCIE_PHY_TXMGN_V2 0x814 +#define PCIE_PHY_TXMGN_V3 0x818 +#define PCIE_PHY_TXMGN_V4 0x81C +#define PCIE_PHY_TXMGN_LS 0x820 +#define PCIE_PHY_TXDEEMPH_M6DB_V0 0x824 +#define PCIE_PHY_TXDEEMPH_M3P5DB_V0 0x828 +#define PCIE_PHY_TXDEEMPH_M6DB_V1 0x82C +#define PCIE_PHY_TXDEEMPH_M3P5DB_V1 0x830 +#define PCIE_PHY_TXDEEMPH_M6DB_V2 0x834 +#define PCIE_PHY_TXDEEMPH_M3P5DB_V2 0x838 +#define PCIE_PHY_TXDEEMPH_M6DB_V3 0x83C +#define PCIE_PHY_TXDEEMPH_M3P5DB_V3 0x840 +#define PCIE_PHY_TXDEEMPH_M6DB_V4 0x844 +#define PCIE_PHY_TXDEEMPH_M3P5DB_V4 0x848 +#define PCIE_PHY_TXDEEMPH_M6DB_LS 0x84C +#define PCIE_PHY_TXDEEMPH_M3P5DB_LS 0x850 +#define PCIE_PHY_ENDPOINT_REFCLK_DRIVE 0x854 +#define PCIE_PHY_RX_IDLE_DTCT_CNTRL 0x858 +#define PCIE_PHY_RATE_SLEW_CNTRL 0x85C +#define PCIE_PHY_POWER_STATE_CONFIG1 0x860 +#define PCIE_PHY_POWER_STATE_CONFIG2 0x864 +#define PCIE_PHY_POWER_STATE_CONFIG3 0x868 +#define PCIE_PHY_POWER_STATE_CONFIG4 0x86C +#define PCIE_PHY_RCVR_DTCT_DLY_P1U2_L 0x870 +#define PCIE_PHY_RCVR_DTCT_DLY_P1U2_H 0x874 +#define PCIE_PHY_RCVR_DTCT_DLY_U3_L 0x878 +#define PCIE_PHY_RCVR_DTCT_DLY_U3_H 0x87C +#define PCIE_PHY_LOCK_DETECT_CONFIG1 0x880 +#define PCIE_PHY_LOCK_DETECT_CONFIG2 0x884 +#define PCIE_PHY_LOCK_DETECT_CONFIG3 0x888 +#define PCIE_PHY_TSYNC_RSYNC_TIME 0x88C +#define PCIE_PHY_SIGDET_LOW_2_IDLE_TIME 0x890 +#define PCIE_PHY_BEACON_2_IDLE_TIME_L 0x894 +#define PCIE_PHY_BEACON_2_IDLE_TIME_H 0x898 +#define PCIE_PHY_PWRUP_RESET_DLY_TIME_SYSCLK 0x89C +#define PCIE_PHY_PWRUP_RESET_DLY_TIME_AUXCLK 0x8A0 +#define PCIE_PHY_LP_WAKEUP_DLY_TIME_AUXCLK 0x8A4 +#define PCIE_PHY_PLL_LOCK_CHK_DLY_TIME 0x8A8 +#define PCIE_PHY_LFPS_DET_HIGH_COUNT_VAL 0x8AC +#define PCIE_PHY_LFPS_TX_ECSTART_EQTLOCK 0x8B0 +#define PCIE_PHY_LFPS_TX_END_CNT_P2U3_START 0x8B4 +#define PCIE_PHY_RXEQTRAINING_WAIT_TIME 0x8B8 +#define PCIE_PHY_RXEQTRAINING_RUN_TIME 0x8BC +#define PCIE_PHY_TXONESZEROS_RUN_LENGTH 0x8C0 +#define PCIE_PHY_FLL_CNTRL1 0x8C4 +#define PCIE_PHY_FLL_CNTRL2 0x8C8 +#define PCIE_PHY_FLL_CNT_VAL_L 0x8CC +#define PCIE_PHY_FLL_CNT_VAL_H_TOL 0x8D0 +#define PCIE_PHY_FLL_MAN_CODE 0x8D4 +#define PCIE_PHY_AUTONOMOUS_MODE_CTRL 0x8D8 +#define PCIE_PHY_LFPS_RXTERM_IRQ_CLEAR 0x8DC +#define PCIE_PHY_ARCVR_DTCT_EN_PERIOD 0x8E0 +#define PCIE_PHY_ARCVR_DTCT_CM_DLY 0x8E4 +#define PCIE_PHY_ALFPS_DEGLITCH_VAL 0x8E8 +#define PCIE_PHY_INSIG_SW_CTRL1 0x8EC +#define PCIE_PHY_INSIG_SW_CTRL2 0x8F0 +#define PCIE_PHY_INSIG_SW_CTRL3 0x8F4 +#define PCIE_PHY_INSIG_MX_CTRL1 0x8F8 +#define PCIE_PHY_INSIG_MX_CTRL2 0x8FC +#define PCIE_PHY_INSIG_MX_CTRL3 0x900 +#define PCIE_PHY_OUTSIG_SW_CTRL1 0x904 +#define PCIE_PHY_OUTSIG_MX_CTRL1 0x908 +#define PCIE_PHY_CLK_DEBUG_BYPASS_CTRL 0x90C +#define PCIE_PHY_TEST_CONTROL 0x910 +#define PCIE_PHY_TEST_CONTROL2 0x914 +#define PCIE_PHY_TEST_CONTROL3 0x918 +#define PCIE_PHY_TEST_CONTROL4 0x91C +#define PCIE_PHY_TEST_CONTROL5 0x920 +#define PCIE_PHY_TEST_CONTROL6 0x924 +#define PCIE_PHY_TEST_CONTROL7 0x928 +#define PCIE_PHY_COM_RESET_CONTROL 0x92C +#define PCIE_PHY_BIST_CTRL 0x930 +#define PCIE_PHY_PRBS_POLY0 0x934 +#define PCIE_PHY_PRBS_POLY1 0x938 +#define PCIE_PHY_PRBS_SEED0 0x93C +#define PCIE_PHY_PRBS_SEED1 0x940 +#define PCIE_PHY_FIXED_PAT_CTRL 0x944 +#define PCIE_PHY_FIXED_PAT0 0x948 +#define PCIE_PHY_FIXED_PAT1 0x94C +#define PCIE_PHY_FIXED_PAT2 0x950 +#define PCIE_PHY_FIXED_PAT3 0x954 +#define PCIE_PHY_COM_CLK_SWITCH_CTRL 0x958 +#define PCIE_PHY_ELECIDLE_DLY_SEL 0x95C +#define PCIE_PHY_SPARE1 0x960 +#define PCIE_PHY_BIST_CHK_ERR_CNT_L_STATUS 0x964 +#define PCIE_PHY_BIST_CHK_ERR_CNT_H_STATUS 0x968 +#define PCIE_PHY_BIST_CHK_STATUS 0x96C +#define PCIE_PHY_LFPS_RXTERM_IRQ_SOURCE_STATUS 0x970 +#define PCIE_PHY_PCS_STATUS 0x974 +#define PCIE_PHY_PCS_STATUS2 0x978 +#define PCIE_PHY_PCS_STATUS3 0x97C +#define PCIE_PHY_COM_RESET_STATUS 0x980 +#define PCIE_PHY_OSC_DTCT_STATUS 0x984 +#define PCIE_PHY_REVISION_ID0 0x988 +#define PCIE_PHY_REVISION_ID1 0x98C +#define PCIE_PHY_REVISION_ID2 0x990 +#define PCIE_PHY_REVISION_ID3 0x994 +#define PCIE_PHY_DEBUG_BUS_0_STATUS 0x998 +#define PCIE_PHY_DEBUG_BUS_1_STATUS 0x99C +#define PCIE_PHY_DEBUG_BUS_2_STATUS 0x9A0 +#define PCIE_PHY_DEBUG_BUS_3_STATUS 0x9A4 +#define PCIE_PHY_LP_WAKEUP_DLY_TIME_AUXCLK_MSB 0x9A8 +#define PCIE_PHY_OSC_DTCT_ACTIONS 0x9AC +#define PCIE_PHY_SIGDET_CNTRL 0x9B0 +#define PCIE_PHY_IDAC_CAL_CNTRL 0x9B4 +#define PCIE_PHY_CMN_ACK_OUT_SEL 0x9B8 +#define PCIE_PHY_PLL_LOCK_CHK_DLY_TIME_SYSCLK 0x9BC +#define PCIE_PHY_AUTONOMOUS_MODE_STATUS 0x9C0 +#define PCIE_PHY_ENDPOINT_REFCLK_CNTRL 0x9C4 +#define PCIE_PHY_EPCLK_PRE_PLL_LOCK_DLY_SYSCLK 0x9C8 +#define PCIE_PHY_EPCLK_PRE_PLL_LOCK_DLY_AUXCLK 0x9CC +#define PCIE_PHY_EPCLK_DLY_COUNT_VAL_L 0x9D0 +#define PCIE_PHY_EPCLK_DLY_COUNT_VAL_H 0x9D4 +#define PCIE_PHY_RX_SIGDET_LVL 0x9D8 +#define PCIE_PHY_L1SS_WAKEUP_DLY_TIME_AUXCLK_LSB 0x9DC +#define PCIE_PHY_L1SS_WAKEUP_DLY_TIME_AUXCLK_MSB 0x9E0 +#define PCIE_PHY_AUTONOMOUS_MODE_CTRL2 0x9E4 +#define PCIE_PHY_RXTERMINATION_DLY_SEL 0x9E8 +#define PCIE_PHY_LFPS_PER_TIMER_VAL 0x9EC +#define PCIE_PHY_SIGDET_STARTUP_TIMER_VAL 0x9F0 +#define PCIE_PHY_LOCK_DETECT_CONFIG4 0x9F4 #endif diff --git a/include/linux/msm_ep_pcie.h b/include/linux/msm_ep_pcie.h index 6d02bdb628bc..489020097a69 100644 --- a/include/linux/msm_ep_pcie.h +++ b/include/linux/msm_ep_pcie.h @@ -29,6 +29,25 @@ enum ep_pcie_event { EP_PCIE_EVENT_PM_RST_DEAST = 0x8, EP_PCIE_EVENT_LINKDOWN = 0x10, EP_PCIE_EVENT_LINKUP = 0x20, + EP_PCIE_EVENT_MHI_A7 = 0x40, + EP_PCIE_EVENT_MMIO_WRITE = 0x80, +}; + +enum ep_pcie_irq_event { + EP_PCIE_INT_EVT_LINK_DOWN = 1, + EP_PCIE_INT_EVT_BME, + EP_PCIE_INT_EVT_PM_TURNOFF, + EP_PCIE_INT_EVT_DEBUG, + EP_PCIE_INT_EVT_LTR, + EP_PCIE_INT_EVT_MHI_Q6, + EP_PCIE_INT_EVT_MHI_A7, + EP_PCIE_INT_EVT_DSTATE_CHANGE, + EP_PCIE_INT_EVT_L1SUB_TIMEOUT, + EP_PCIE_INT_EVT_MMIO_WRITE, + EP_PCIE_INT_EVT_CFG_WRITE, + EP_PCIE_INT_EVT_BRIDGE_FLUSH_N, + EP_PCIE_INT_EVT_LINK_UP, + EP_PCIE_INT_EVT_MAX = 13, }; enum ep_pcie_trigger { @@ -97,6 +116,8 @@ struct ep_pcie_hw { int (*disable_endpoint)(void); int (*config_db_routing)(struct ep_pcie_db_config chdb_cfg, struct ep_pcie_db_config erdb_cfg); + int (*mask_irq_event)(enum ep_pcie_irq_event event, + bool enable); }; /* @@ -251,4 +272,18 @@ int ep_pcie_disable_endpoint(struct ep_pcie_hw *phandle); int ep_pcie_config_db_routing(struct ep_pcie_hw *phandle, struct ep_pcie_db_config chdb_cfg, struct ep_pcie_db_config erdb_cfg); + +/* + * ep_pcie_mask_irq_event - enable and disable IRQ event. + * @phandle: PCIe endpoint HW driver handle + * @event: IRQ event + * @enable: true to enable that IRQ event and false to disable + * + * This function is to enable and disable IRQ event. + * + * Return: 0 on success, negative value on error + */ +int ep_pcie_mask_irq_event(struct ep_pcie_hw *phandle, + enum ep_pcie_irq_event event, + bool enable); #endif