[PATCH v10] PCI: tango: Add MSI controller support

STALE3280d

5 messages, 5 authors, 2017-08-24 · open the first message on its own page

[PATCH v10] PCI: tango: Add MSI controller support

From: Marc Zyngier <hidden>
Date: 2017-08-22 20:03:41

On Tue, Aug 22 2017 at  8:02:18 pm BST, Marc Gonzalez [off-list ref] wrote:
On 22/08/2017 18:29, Marc Zyngier wrote:
quoted
On 22/08/17 15:56, Marc Gonzalez wrote:
quoted
 #define SMP8759_MUX		0x48
 #define SMP8759_TEST_OUT	0x74
+#define SMP8759_STATUS		0x80
+#define SMP8759_ENABLE		0xa0
+#define SMP8759_DOORBELL	0xa002e07c
Why is this hardcoded and not coming from the device-tree, just like any
other address property?
Since this bus address is software-configurable, I didn't think
it belonged in the DT. Also, I didn't see anything similar in
other binding docs, especially

Documentation/devicetree/bindings/interrupt-controller/msi.txt
If that's software configurable, how on Earth did you pick the address?
How do you ensure that it doesn't conflict with DMA? How is it
configured into the RC?

	M.
-- 
Jazz is not dead. It just smells funny.

[PATCH v10] PCI: tango: Add MSI controller support

From: helgaas@kernel.org (Bjorn Helgaas)
Date: 2017-08-24 17:04:45

On Tue, Aug 22, 2017 at 09:03:41PM +0100, Marc Zyngier wrote:
On Tue, Aug 22 2017 at  8:02:18 pm BST, Marc Gonzalez [off-list ref] wrote:
quoted
On 22/08/2017 18:29, Marc Zyngier wrote:
quoted
On 22/08/17 15:56, Marc Gonzalez wrote:
quoted
 #define SMP8759_MUX		0x48
 #define SMP8759_TEST_OUT	0x74
+#define SMP8759_STATUS		0x80
+#define SMP8759_ENABLE		0xa0
+#define SMP8759_DOORBELL	0xa002e07c
Why is this hardcoded and not coming from the device-tree, just like any
other address property?
Since this bus address is software-configurable, I didn't think
it belonged in the DT. Also, I didn't see anything similar in
other binding docs, especially

Documentation/devicetree/bindings/interrupt-controller/msi.txt
If that's software configurable, how on Earth did you pick the address?
How do you ensure that it doesn't conflict with DMA? How is it
configured into the RC?
But we *do* need to resolve this.  This does seem like an address that
shouldn't be hard-coded into the driver.  Since this driver is
programming the address into an MSI message, but not into the receiver
of that message, there's a coordination issue between this driver and
whatever other software does that receiver configuration.

Bjorn

[PATCH v10] PCI: tango: Add MSI controller support

From: Marc Gonzalez <hidden>
Date: 2017-08-24 17:51:16

On 24/08/2017 19:04, Bjorn Helgaas wrote:
On Tue, Aug 22, 2017 at 09:03:41PM +0100, Marc Zyngier wrote:
quoted
Marc Gonzalez wrote:
quoted
On 22/08/2017 18:29, Marc Zyngier wrote:
quoted
On 22/08/17 15:56, Marc Gonzalez wrote:
quoted
 #define SMP8759_MUX		0x48
 #define SMP8759_TEST_OUT	0x74
+#define SMP8759_STATUS		0x80
+#define SMP8759_ENABLE		0xa0
+#define SMP8759_DOORBELL	0xa002e07c
Why is this hardcoded and not coming from the device-tree, just like any
other address property?
Since this bus address is software-configurable, I didn't think
it belonged in the DT. Also, I didn't see anything similar in
other binding docs, especially

Documentation/devicetree/bindings/interrupt-controller/msi.txt
If that's software configurable, how on Earth did you pick the address?
How do you ensure that it doesn't conflict with DMA? How is it
configured into the RC?
But we *do* need to resolve this.  This does seem like an address that
shouldn't be hard-coded into the driver.  Since this driver is
programming the address into an MSI message, but not into the receiver
of that message, there's a coordination issue between this driver and
whatever other software does that receiver configuration.
OK. I'll move the doorbell address to the DT for v11.

What property should be used for this address?

sigma,doorbell ?

Or maybe I can put it in reg, since I have a 1:1 mapping
between bus and cpu addresses?

git grep -i doorbell arch/arm/boot/dts/ arch/arm64/boot/dts/
returns nothing.

Regards.

[PATCH v10] PCI: tango: Add MSI controller support

From: Ard Biesheuvel <hidden>
Date: 2017-08-24 18:35:20

On 24 August 2017 at 18:51, Marc Gonzalez
[off-list ref] wrote:
On 24/08/2017 19:04, Bjorn Helgaas wrote:
quoted
On Tue, Aug 22, 2017 at 09:03:41PM +0100, Marc Zyngier wrote:
quoted
Marc Gonzalez wrote:
quoted
On 22/08/2017 18:29, Marc Zyngier wrote:
quoted
On 22/08/17 15:56, Marc Gonzalez wrote:
quoted
 #define SMP8759_MUX              0x48
 #define SMP8759_TEST_OUT 0x74
+#define SMP8759_STATUS           0x80
+#define SMP8759_ENABLE           0xa0
+#define SMP8759_DOORBELL 0xa002e07c
Why is this hardcoded and not coming from the device-tree, just like any
other address property?
Since this bus address is software-configurable, I didn't think
it belonged in the DT. Also, I didn't see anything similar in
other binding docs, especially

Documentation/devicetree/bindings/interrupt-controller/msi.txt
If that's software configurable, how on Earth did you pick the address?
How do you ensure that it doesn't conflict with DMA? How is it
configured into the RC?
But we *do* need to resolve this.  This does seem like an address that
shouldn't be hard-coded into the driver.  Since this driver is
programming the address into an MSI message, but not into the receiver
of that message, there's a coordination issue between this driver and
whatever other software does that receiver configuration.
OK. I'll move the doorbell address to the DT for v11.

What property should be used for this address?

sigma,doorbell ?

Or maybe I can put it in reg, since I have a 1:1 mapping
between bus and cpu addresses?

git grep -i doorbell arch/arm/boot/dts/ arch/arm64/boot/dts/
returns nothing.
You haven't answered the question yet: you stated that the doorbell
address is software configurable, yet your code does not seem to
configure it. It only returns the doorbell address so that it gets
communicated to the downstream devices.

So how does the RC know which address is special, so it can trigger on
inbound writes hitting that address and assert the SPI ?

[PATCH v10] PCI: tango: Add MSI controller support

From: Mason <hidden>
Date: 2017-08-24 20:53:16

On 24/08/2017 20:35, Ard Biesheuvel wrote:
On 24 August 2017 at 18:51, Marc Gonzalez wrote:
quoted
On 24/08/2017 19:04, Bjorn Helgaas wrote:
quoted
On Tue, Aug 22, 2017 Marc Zyngier wrote:
quoted
Marc Gonzalez wrote:
quoted
On 22/08/2017 18:29, Marc Zyngier wrote:
quoted
On 22/08/17 15:56, Marc Gonzalez wrote:
quoted
 #define SMP8759_MUX              0x48
 #define SMP8759_TEST_OUT 0x74
+#define SMP8759_STATUS           0x80
+#define SMP8759_ENABLE           0xa0
+#define SMP8759_DOORBELL 0xa002e07c
Why is this hardcoded and not coming from the device-tree, just like any
other address property?
Since this bus address is software-configurable, I didn't think
it belonged in the DT. Also, I didn't see anything similar in
other binding docs, especially

Documentation/devicetree/bindings/interrupt-controller/msi.txt
If that's software configurable, how on Earth did you pick the address?
How do you ensure that it doesn't conflict with DMA? How is it
configured into the RC?
But we *do* need to resolve this.  This does seem like an address that
shouldn't be hard-coded into the driver.  Since this driver is
programming the address into an MSI message, but not into the receiver
of that message, there's a coordination issue between this driver and
whatever other software does that receiver configuration.
OK. I'll move the doorbell address to the DT for v11.

What property should be used for this address?

sigma,doorbell ?

Or maybe I can put it in reg, since I have a 1:1 mapping
between bus and cpu addresses?

git grep -i doorbell arch/arm/boot/dts/ arch/arm64/boot/dts/
returns nothing.
You haven't answered the question yet: you stated that the doorbell
address is software configurable, yet your code does not seem to
configure it. It only returns the doorbell address so that it gets
communicated to the downstream devices.

So how does the RC know which address is special, so it can trigger on
inbound writes hitting that address and assert the SPI ?
The CPU address of the MSI doorbell address is 0x2e07c
i.e. within the reg space of the PCIe controller block.

As I discussed back in March, the RC implements an odd
bus-to-system mapping.

RC BAR0 defines a window in PCI address space (max 1GB).
Accesses outside this window are silently ignored.
The window is divided into 8 "regions" and there are 8
registers defining the offset into CPU space.

In pseudo code, assuming pci_address is within the
window defined by BAR0:

cpu_address map_bus_to_system(pci_address)
{
    temp = pci_address - BAR0.base
    region = temp / region_size
    offset = temp % region_size
    cpu_address = region_reg[region] + offset
    return cpu_address
}

The current setup is:

DRAM at 0x80000000-0xa0000000
BAR0.base = 0x80000000
REGION[0] = 0x80000000
REGION[1] = 0x88000000
REGION[2] = 0x90000000
REGION[3] = 0x98000000
REGION[4] = 0x0

(This map means 1:1 identity for DRAM addresses.)

Thus when a device writes to 0xa002e07c (region 4)
the write is forwarded to 0x2e07c.

Regards.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help