aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pci/controller/dwc
diff options
context:
space:
mode:
authorGustavo Pimentel <gustavo.pimentel@synopsys.com>2018-07-19 04:32:15 -0400
committerLorenzo Pieralisi <lorenzo.pieralisi@arm.com>2018-07-19 06:38:05 -0400
commit3920a5d7b24dc5229abe6fb8409e4c9de2c8c7a0 (patch)
treef92ac019581bc56bff0725b4d0d094368fa9f98c /drivers/pci/controller/dwc
parentbeb4641a787df79a1423a8789d185b6b78fcbfea (diff)
PCI: dwc: Rework MSI callbacks handler
Remove duplicate defines located on pcie-designware.h file already available on /include/uapi/linux/pci-regs.h file. Signed-off-by: Gustavo Pimentel <gustavo.pimentel@synopsys.com> Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> Acked-by: Kishon Vijay Abraham I <kishon@ti.com>
Diffstat (limited to 'drivers/pci/controller/dwc')
-rw-r--r--drivers/pci/controller/dwc/pcie-designware-ep.c49
-rw-r--r--drivers/pci/controller/dwc/pcie-designware.h11
2 files changed, 33 insertions, 27 deletions
diff --git a/drivers/pci/controller/dwc/pcie-designware-ep.c b/drivers/pci/controller/dwc/pcie-designware-ep.c
index 23be2c0249ee..dd9c36678cba 100644
--- a/drivers/pci/controller/dwc/pcie-designware-ep.c
+++ b/drivers/pci/controller/dwc/pcie-designware-ep.c
@@ -246,29 +246,38 @@ static int dw_pcie_ep_map_addr(struct pci_epc *epc, u8 func_no,
246 246
247static int dw_pcie_ep_get_msi(struct pci_epc *epc, u8 func_no) 247static int dw_pcie_ep_get_msi(struct pci_epc *epc, u8 func_no)
248{ 248{
249 int val;
250 struct dw_pcie_ep *ep = epc_get_drvdata(epc); 249 struct dw_pcie_ep *ep = epc_get_drvdata(epc);
251 struct dw_pcie *pci = to_dw_pcie_from_ep(ep); 250 struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
251 u32 val, reg;
252
253 if (!ep->msi_cap)
254 return -EINVAL;
252 255
253 val = dw_pcie_readw_dbi(pci, MSI_MESSAGE_CONTROL); 256 reg = ep->msi_cap + PCI_MSI_FLAGS;
254 if (!(val & MSI_CAP_MSI_EN_MASK)) 257 val = dw_pcie_readw_dbi(pci, reg);
258 if (!(val & PCI_MSI_FLAGS_ENABLE))
255 return -EINVAL; 259 return -EINVAL;
256 260
257 val = (val & MSI_CAP_MME_MASK) >> MSI_CAP_MME_SHIFT; 261 val = (val & PCI_MSI_FLAGS_QSIZE) >> 4;
262
258 return val; 263 return val;
259} 264}
260 265
261static int dw_pcie_ep_set_msi(struct pci_epc *epc, u8 func_no, u8 encode_int) 266static int dw_pcie_ep_set_msi(struct pci_epc *epc, u8 func_no, u8 interrupts)
262{ 267{
263 int val;
264 struct dw_pcie_ep *ep = epc_get_drvdata(epc); 268 struct dw_pcie_ep *ep = epc_get_drvdata(epc);
265 struct dw_pcie *pci = to_dw_pcie_from_ep(ep); 269 struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
270 u32 val, reg;
266 271
267 val = dw_pcie_readw_dbi(pci, MSI_MESSAGE_CONTROL); 272 if (!ep->msi_cap)
268 val &= ~MSI_CAP_MMC_MASK; 273 return -EINVAL;
269 val |= (encode_int << MSI_CAP_MMC_SHIFT) & MSI_CAP_MMC_MASK; 274
275 reg = ep->msi_cap + PCI_MSI_FLAGS;
276 val = dw_pcie_readw_dbi(pci, reg);
277 val &= ~PCI_MSI_FLAGS_QMASK;
278 val |= (interrupts << 1) & PCI_MSI_FLAGS_QMASK;
270 dw_pcie_dbi_ro_wr_en(pci); 279 dw_pcie_dbi_ro_wr_en(pci);
271 dw_pcie_writew_dbi(pci, MSI_MESSAGE_CONTROL, val); 280 dw_pcie_writew_dbi(pci, reg, val);
272 dw_pcie_dbi_ro_wr_dis(pci); 281 dw_pcie_dbi_ro_wr_dis(pci);
273 282
274 return 0; 283 return 0;
@@ -367,21 +376,29 @@ int dw_pcie_ep_raise_msi_irq(struct dw_pcie_ep *ep, u8 func_no,
367 struct dw_pcie *pci = to_dw_pcie_from_ep(ep); 376 struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
368 struct pci_epc *epc = ep->epc; 377 struct pci_epc *epc = ep->epc;
369 u16 msg_ctrl, msg_data; 378 u16 msg_ctrl, msg_data;
370 u32 msg_addr_lower, msg_addr_upper; 379 u32 msg_addr_lower, msg_addr_upper, reg;
371 u64 msg_addr; 380 u64 msg_addr;
372 bool has_upper; 381 bool has_upper;
373 int ret; 382 int ret;
374 383
384 if (!ep->msi_cap)
385 return -EINVAL;
386
375 /* Raise MSI per the PCI Local Bus Specification Revision 3.0, 6.8.1. */ 387 /* Raise MSI per the PCI Local Bus Specification Revision 3.0, 6.8.1. */
376 msg_ctrl = dw_pcie_readw_dbi(pci, MSI_MESSAGE_CONTROL); 388 reg = ep->msi_cap + PCI_MSI_FLAGS;
389 msg_ctrl = dw_pcie_readw_dbi(pci, reg);
377 has_upper = !!(msg_ctrl & PCI_MSI_FLAGS_64BIT); 390 has_upper = !!(msg_ctrl & PCI_MSI_FLAGS_64BIT);
378 msg_addr_lower = dw_pcie_readl_dbi(pci, MSI_MESSAGE_ADDR_L32); 391 reg = ep->msi_cap + PCI_MSI_ADDRESS_LO;
392 msg_addr_lower = dw_pcie_readl_dbi(pci, reg);
379 if (has_upper) { 393 if (has_upper) {
380 msg_addr_upper = dw_pcie_readl_dbi(pci, MSI_MESSAGE_ADDR_U32); 394 reg = ep->msi_cap + PCI_MSI_ADDRESS_HI;
381 msg_data = dw_pcie_readw_dbi(pci, MSI_MESSAGE_DATA_64); 395 msg_addr_upper = dw_pcie_readl_dbi(pci, reg);
396 reg = ep->msi_cap + PCI_MSI_DATA_64;
397 msg_data = dw_pcie_readw_dbi(pci, reg);
382 } else { 398 } else {
383 msg_addr_upper = 0; 399 msg_addr_upper = 0;
384 msg_data = dw_pcie_readw_dbi(pci, MSI_MESSAGE_DATA_32); 400 reg = ep->msi_cap + PCI_MSI_DATA_32;
401 msg_data = dw_pcie_readw_dbi(pci, reg);
385 } 402 }
386 msg_addr = ((u64) msg_addr_upper) << 32 | msg_addr_lower; 403 msg_addr = ((u64) msg_addr_upper) << 32 | msg_addr_lower;
387 ret = dw_pcie_ep_map_addr(epc, func_no, ep->msi_mem_phys, msg_addr, 404 ret = dw_pcie_ep_map_addr(epc, func_no, ep->msi_mem_phys, msg_addr,
diff --git a/drivers/pci/controller/dwc/pcie-designware.h b/drivers/pci/controller/dwc/pcie-designware.h
index 00ac4197c457..e8b97f5a64be 100644
--- a/drivers/pci/controller/dwc/pcie-designware.h
+++ b/drivers/pci/controller/dwc/pcie-designware.h
@@ -96,17 +96,6 @@
96#define PCIE_GET_ATU_INB_UNR_REG_OFFSET(region) \ 96#define PCIE_GET_ATU_INB_UNR_REG_OFFSET(region) \
97 ((0x3 << 20) | ((region) << 9) | (0x1 << 8)) 97 ((0x3 << 20) | ((region) << 9) | (0x1 << 8))
98 98
99#define MSI_MESSAGE_CONTROL 0x52
100#define MSI_CAP_MMC_SHIFT 1
101#define MSI_CAP_MMC_MASK (7 << MSI_CAP_MMC_SHIFT)
102#define MSI_CAP_MME_SHIFT 4
103#define MSI_CAP_MSI_EN_MASK 0x1
104#define MSI_CAP_MME_MASK (7 << MSI_CAP_MME_SHIFT)
105#define MSI_MESSAGE_ADDR_L32 0x54
106#define MSI_MESSAGE_ADDR_U32 0x58
107#define MSI_MESSAGE_DATA_32 0x58
108#define MSI_MESSAGE_DATA_64 0x5C
109
110#define MAX_MSI_IRQS 256 99#define MAX_MSI_IRQS 256
111#define MAX_MSI_IRQS_PER_CTRL 32 100#define MAX_MSI_IRQS_PER_CTRL 32
112#define MAX_MSI_CTRLS (MAX_MSI_IRQS / MAX_MSI_IRQS_PER_CTRL) 101#define MAX_MSI_CTRLS (MAX_MSI_IRQS / MAX_MSI_IRQS_PER_CTRL)