Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1608515 > unrolled thread
| Started by | Doug Berger <opendmb@gmail.com> |
|---|---|
| First post | 2017-03-24 16:00 +0100 |
| Last post | 2017-03-24 17:10 +0100 |
| Articles | 6 — 3 participants |
Back to article view | Back to linux.kernel
[PATCH 0/9] bus: brcmstb_gisb: add support for GISBv7 arbiter Doug Berger <opendmb@gmail.com> - 2017-03-24 16:00 +0100
[PATCH 2/9] arm64: mm: mark fault_info __ro_after_init Doug Berger <opendmb@gmail.com> - 2017-03-24 16:00 +0100
[PATCH 6/9] bus: brcmstb_gisb: correct support for 64-bit address output Doug Berger <opendmb@gmail.com> - 2017-03-24 16:00 +0100
Re: [PATCH 6/9] bus: brcmstb_gisb: correct support for 64-bit address output Gregory Fong <gregory.0xf0@gmail.com> - 2017-03-25 06:40 +0100
Re: [PATCH 0/9] bus: brcmstb_gisb: add support for GISBv7 arbiter Mark Rutland <mark.rutland@arm.com> - 2017-03-24 16:10 +0100
Re: [PATCH 0/9] bus: brcmstb_gisb: add support for GISBv7 arbiter Doug Berger <opendmb@gmail.com> - 2017-03-24 17:10 +0100
| From | Doug Berger <opendmb@gmail.com> |
|---|---|
| Date | 2017-03-24 16:00 +0100 |
| Subject | [PATCH 0/9] bus: brcmstb_gisb: add support for GISBv7 arbiter |
| Message-ID | <toyHo-2WH-5@gated-at.bofh.it> |
This patch set contains changes to enable the GISB arbiter driver on the latest ARM64 architecture Set-Top Box chips from Broadcom. This driver relies on being able to hook the abort handlers of the processor core that are triggered by bus error signals generated by the GISB bus arbiter hardware found in BCM7XXX chips. The first three patches are based on the arm64/for-next/core branch to enable this functionality for the arm64 architecture. The remaining patches correct some issues with the existing driver, add the ARM64 architecture specific support to the driver, and finally add the new register map for the GISBv7 hardware first appearing in the BCM7278 device. Doug Berger (7): arm64: mm: mark fault_info __ro_after_init arm64: mm: install SError abort handler bus: brcmstb_gisb: Use register offsets with writes too bus: brcmstb_gisb: Correct hooking of ARM aborts bus: brcmstb_gisb: correct support for 64-bit address output bus: brcmstb_gisb: add ARM64 SError support bus: brcmstb_gisb: update to support new revision Florian Fainelli (2): arm64: mm: Allow installation of memory abort handlers bus: brcmstb_gisb: Add ARM64 support .../devicetree/bindings/bus/brcm,gisb-arb.txt | 3 +- arch/arm64/include/asm/system_misc.h | 5 + arch/arm64/kernel/entry.S | 69 ++++++++++++-- arch/arm64/mm/fault.c | 48 +++++++++- drivers/bus/Kconfig | 2 +- drivers/bus/brcmstb_gisb.c | 106 ++++++++++++++++----- 6 files changed, 197 insertions(+), 36 deletions(-) -- 2.12.0
[toc] | [next] | [standalone]
| From | Doug Berger <opendmb@gmail.com> |
|---|---|
| Date | 2017-03-24 16:00 +0100 |
| Subject | [PATCH 2/9] arm64: mm: mark fault_info __ro_after_init |
| Message-ID | <toyR3-34l-13@gated-at.bofh.it> |
| In reply to | #1608515 |
The fault_info table must be made writeable to allow installation
of custom memory abort handlers, but it can be made read-only
after initialization to provide some protection.
Signed-off-by: Doug Berger <opendmb@gmail.com>
---
arch/arm64/mm/fault.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/arch/arm64/mm/fault.c b/arch/arm64/mm/fault.c
index cdf1260f1005..43319ed58a47 100644
--- a/arch/arm64/mm/fault.c
+++ b/arch/arm64/mm/fault.c
@@ -493,7 +493,7 @@ static struct fault_info {
int sig;
int code;
const char *name;
-} fault_info[] = {
+} fault_info[] __ro_after_init = {
{ do_bad, SIGBUS, 0, "ttbr address size fault" },
{ do_bad, SIGBUS, 0, "level 1 address size fault" },
{ do_bad, SIGBUS, 0, "level 2 address size fault" },
--
2.12.0
[toc] | [prev] | [next] | [standalone]
| From | Doug Berger <opendmb@gmail.com> |
|---|---|
| Date | 2017-03-24 16:00 +0100 |
| Subject | [PATCH 6/9] bus: brcmstb_gisb: correct support for 64-bit address output |
| Message-ID | <toyR4-34l-23@gated-at.bofh.it> |
| In reply to | #1608515 |
The GISB bus can support addresses beyond 32-bits. So this commit
corrects support for reading a captured 64-bit address into a 64-bit
variable by obtaining the high bits from the ARB_ERR_CAP_HI_ADDR
register (when present) and then outputting the full 64-bit value.
It also removes unused definitions.
Fixes: 44127b771d9c ("bus: add Broadcom GISB bus arbiter timeout/error handler")
Signed-off-by: Doug Berger <opendmb@gmail.com>
---
drivers/bus/brcmstb_gisb.c | 36 ++++++++++++++++++++----------------
1 file changed, 20 insertions(+), 16 deletions(-)
diff --git a/drivers/bus/brcmstb_gisb.c b/drivers/bus/brcmstb_gisb.c
index 9eba0143f1a4..c8d2a61d21ed 100644
--- a/drivers/bus/brcmstb_gisb.c
+++ b/drivers/bus/brcmstb_gisb.c
@@ -37,8 +37,6 @@
#define ARB_ERR_CAP_CLEAR (1 << 0)
#define ARB_ERR_CAP_STATUS_TIMEOUT (1 << 12)
#define ARB_ERR_CAP_STATUS_TEA (1 << 11)
-#define ARB_ERR_CAP_STATUS_BS_SHIFT (1 << 2)
-#define ARB_ERR_CAP_STATUS_BS_MASK 0x3c
#define ARB_ERR_CAP_STATUS_WRITE (1 << 1)
#define ARB_ERR_CAP_STATUS_VALID (1 << 0)
@@ -47,7 +45,6 @@ enum {
ARB_ERR_CAP_CLR,
ARB_ERR_CAP_HI_ADDR,
ARB_ERR_CAP_ADDR,
- ARB_ERR_CAP_DATA,
ARB_ERR_CAP_STATUS,
ARB_ERR_CAP_MASTER,
};
@@ -57,7 +54,6 @@ static const int gisb_offsets_bcm7038[] = {
[ARB_ERR_CAP_CLR] = 0x0c4,
[ARB_ERR_CAP_HI_ADDR] = -1,
[ARB_ERR_CAP_ADDR] = 0x0c8,
- [ARB_ERR_CAP_DATA] = 0x0cc,
[ARB_ERR_CAP_STATUS] = 0x0d0,
[ARB_ERR_CAP_MASTER] = -1,
};
@@ -67,7 +63,6 @@ static const int gisb_offsets_bcm7400[] = {
[ARB_ERR_CAP_CLR] = 0x0c8,
[ARB_ERR_CAP_HI_ADDR] = -1,
[ARB_ERR_CAP_ADDR] = 0x0cc,
- [ARB_ERR_CAP_DATA] = 0x0d0,
[ARB_ERR_CAP_STATUS] = 0x0d4,
[ARB_ERR_CAP_MASTER] = 0x0d8,
};
@@ -77,7 +72,6 @@ static const int gisb_offsets_bcm7435[] = {
[ARB_ERR_CAP_CLR] = 0x168,
[ARB_ERR_CAP_HI_ADDR] = -1,
[ARB_ERR_CAP_ADDR] = 0x16c,
- [ARB_ERR_CAP_DATA] = 0x170,
[ARB_ERR_CAP_STATUS] = 0x174,
[ARB_ERR_CAP_MASTER] = 0x178,
};
@@ -87,7 +81,6 @@ static const int gisb_offsets_bcm7445[] = {
[ARB_ERR_CAP_CLR] = 0x7e4,
[ARB_ERR_CAP_HI_ADDR] = 0x7e8,
[ARB_ERR_CAP_ADDR] = 0x7ec,
- [ARB_ERR_CAP_DATA] = 0x7f0,
[ARB_ERR_CAP_STATUS] = 0x7f4,
[ARB_ERR_CAP_MASTER] = 0x7f8,
};
@@ -109,9 +102,13 @@ static u32 gisb_read(struct brcmstb_gisb_arb_device *gdev, int reg)
{
int offset = gdev->gisb_offsets[reg];
- /* return 1 if the hardware doesn't have ARB_ERR_CAP_MASTER */
- if (offset == -1)
- return 1;
+ if (offset < 0) {
+ /* return 1 if the hardware doesn't have ARB_ERR_CAP_MASTER */
+ if (reg == ARB_ERR_CAP_MASTER)
+ return 1;
+ else
+ return 0;
+ }
if (gdev->big_endian)
return ioread32be(gdev->base + offset);
@@ -119,6 +116,16 @@ static u32 gisb_read(struct brcmstb_gisb_arb_device *gdev, int reg)
return ioread32(gdev->base + offset);
}
+static u64 gisb_read_address(struct brcmstb_gisb_arb_device *gdev)
+{
+ u64 value;
+
+ value = (u64)gisb_read(gdev, ARB_ERR_CAP_ADDR);
+ value |= (u64)gisb_read(gdev, ARB_ERR_CAP_HI_ADDR) << 32;
+
+ return value;
+}
+
static void gisb_write(struct brcmstb_gisb_arb_device *gdev, u32 val, int reg)
{
int offset = gdev->gisb_offsets[reg];
@@ -185,7 +192,7 @@ static int brcmstb_gisb_arb_decode_addr(struct brcmstb_gisb_arb_device *gdev,
const char *reason)
{
u32 cap_status;
- unsigned long arb_addr;
+ u64 arb_addr;
u32 master;
const char *m_name;
char m_fmt[11];
@@ -197,10 +204,7 @@ static int brcmstb_gisb_arb_decode_addr(struct brcmstb_gisb_arb_device *gdev,
return 1;
/* Read the address and master */
- arb_addr = gisb_read(gdev, ARB_ERR_CAP_ADDR) & 0xffffffff;
-#if (IS_ENABLED(CONFIG_PHYS_ADDR_T_64BIT))
- arb_addr |= (u64)gisb_read(gdev, ARB_ERR_CAP_HI_ADDR) << 32;
-#endif
+ arb_addr = gisb_read_address(gdev);
master = gisb_read(gdev, ARB_ERR_CAP_MASTER);
m_name = brcmstb_gisb_master_to_str(gdev, master);
@@ -209,7 +213,7 @@ static int brcmstb_gisb_arb_decode_addr(struct brcmstb_gisb_arb_device *gdev,
m_name = m_fmt;
}
- pr_crit("%s: %s at 0x%lx [%c %s], core: %s\n",
+ pr_crit("%s: %s at 0x%llx [%c %s], core: %s\n",
__func__, reason, arb_addr,
cap_status & ARB_ERR_CAP_STATUS_WRITE ? 'W' : 'R',
cap_status & ARB_ERR_CAP_STATUS_TIMEOUT ? "timeout" : "",
--
2.12.0
[toc] | [prev] | [next] | [standalone]
| From | Gregory Fong <gregory.0xf0@gmail.com> |
|---|---|
| Date | 2017-03-25 06:40 +0100 |
| Subject | Re: [PATCH 6/9] bus: brcmstb_gisb: correct support for 64-bit address output |
| Message-ID | <toMAF-4Hq-9@gated-at.bofh.it> |
| In reply to | #1608521 |
On Fri, Mar 24, 2017 at 7:46 AM, Doug Berger <opendmb@gmail.com> wrote:
> The GISB bus can support addresses beyond 32-bits. So this commit
> corrects support for reading a captured 64-bit address into a 64-bit
> variable by obtaining the high bits from the ARB_ERR_CAP_HI_ADDR
> register (when present) and then outputting the full 64-bit value.
>
> It also removes unused definitions.
>
> Fixes: 44127b771d9c ("bus: add Broadcom GISB bus arbiter timeout/error handler")
> Signed-off-by: Doug Berger <opendmb@gmail.com>
> ---
> drivers/bus/brcmstb_gisb.c | 36 ++++++++++++++++++++----------------
> 1 file changed, 20 insertions(+), 16 deletions(-)
>
> diff --git a/drivers/bus/brcmstb_gisb.c b/drivers/bus/brcmstb_gisb.c
> [snip]
> @@ -119,6 +116,16 @@ static u32 gisb_read(struct brcmstb_gisb_arb_device *gdev, int reg)
> return ioread32(gdev->base + offset);
> }
>
> +static u64 gisb_read_address(struct brcmstb_gisb_arb_device *gdev)
> +{
> + u64 value;
> +
> + value = (u64)gisb_read(gdev, ARB_ERR_CAP_ADDR);
Unlike the one on the next line, this cast can be omitted.
> + value |= (u64)gisb_read(gdev, ARB_ERR_CAP_HI_ADDR) << 32;
> +
> + return value;
> +}
> [snip]
Acked-by: Gregory Fong <gregory.0xf0@gmail.com>
[toc] | [prev] | [next] | [standalone]
| From | Mark Rutland <mark.rutland@arm.com> |
|---|---|
| Date | 2017-03-24 16:10 +0100 |
| Message-ID | <toz0J-3mO-5@gated-at.bofh.it> |
| In reply to | #1608515 |
On Fri, Mar 24, 2017 at 07:46:23AM -0700, Doug Berger wrote: > This patch set contains changes to enable the GISB arbiter driver > on the latest ARM64 architecture Set-Top Box chips from Broadcom. > > This driver relies on being able to hook the abort handlers of > the processor core that are triggered by bus error signals > generated by the GISB bus arbiter hardware found in BCM7XXX chips. Ugh; hardware generating asynchonous exceptions is hideous. I had hoped that such hardware was a thing of the past. Under what circumstances does the GISB bus arbiter generate these aborts? Mark. > The first three patches are based on the arm64/for-next/core > branch to enable this functionality for the arm64 architecture. > > The remaining patches correct some issues with the existing driver, > add the ARM64 architecture specific support to the driver, and > finally add the new register map for the GISBv7 hardware first > appearing in the BCM7278 device. > > Doug Berger (7): > arm64: mm: mark fault_info __ro_after_init > arm64: mm: install SError abort handler > bus: brcmstb_gisb: Use register offsets with writes too > bus: brcmstb_gisb: Correct hooking of ARM aborts > bus: brcmstb_gisb: correct support for 64-bit address output > bus: brcmstb_gisb: add ARM64 SError support > bus: brcmstb_gisb: update to support new revision > > Florian Fainelli (2): > arm64: mm: Allow installation of memory abort handlers > bus: brcmstb_gisb: Add ARM64 support > > .../devicetree/bindings/bus/brcm,gisb-arb.txt | 3 +- > arch/arm64/include/asm/system_misc.h | 5 + > arch/arm64/kernel/entry.S | 69 ++++++++++++-- > arch/arm64/mm/fault.c | 48 +++++++++- > drivers/bus/Kconfig | 2 +- > drivers/bus/brcmstb_gisb.c | 106 ++++++++++++++++----- > 6 files changed, 197 insertions(+), 36 deletions(-) > > -- > 2.12.0 >
[toc] | [prev] | [next] | [standalone]
| From | Doug Berger <opendmb@gmail.com> |
|---|---|
| Date | 2017-03-24 17:10 +0100 |
| Message-ID | <tozWO-44H-33@gated-at.bofh.it> |
| In reply to | #1608523 |
On 03/24/2017 08:03 AM, Mark Rutland wrote: > On Fri, Mar 24, 2017 at 07:46:23AM -0700, Doug Berger wrote: >> This patch set contains changes to enable the GISB arbiter driver >> on the latest ARM64 architecture Set-Top Box chips from Broadcom. >> >> This driver relies on being able to hook the abort handlers of >> the processor core that are triggered by bus error signals >> generated by the GISB bus arbiter hardware found in BCM7XXX chips. > > Ugh; hardware generating asynchonous exceptions is hideous. I had hoped > that such hardware was a thing of the past. Yes, hope springs eternal :) > > Under what circumstances does the GISB bus arbiter generate these > aborts? Since the GISB bus generally uses buffered writes it can early ack the CPU bus master before the arbitration error is detected. This causes the bus error to be seen as an asynchronous abort by the CPU. > > Mark. >
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web