diff options
author | Gustavo Pimentel <gustavo.pimentel@synopsys.com> | 2018-07-19 04:32:15 -0400 |
---|---|---|
committer | Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> | 2018-07-19 06:38:05 -0400 |
commit | 3920a5d7b24dc5229abe6fb8409e4c9de2c8c7a0 (patch) | |
tree | f92ac019581bc56bff0725b4d0d094368fa9f98c /drivers/pci/controller/dwc | |
parent | beb4641a787df79a1423a8789d185b6b78fcbfea (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.c | 49 | ||||
-rw-r--r-- | drivers/pci/controller/dwc/pcie-designware.h | 11 |
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 | ||
247 | static int dw_pcie_ep_get_msi(struct pci_epc *epc, u8 func_no) | 247 | static 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 | ||
261 | static int dw_pcie_ep_set_msi(struct pci_epc *epc, u8 func_no, u8 encode_int) | 266 | static 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) |