Patch "bus: brcmstb_gisb: correct support for 64-bit address output" has been added to the 4.4-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
bus: brcmstb_gisb: correct support for 64-bit address output
to the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
bus-brcmstb_gisb-correct-support-for-64-bit-address-output.patch
and it can be found in the queue-4.4 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From foo@baz Tue Apr 10 10:31:53 CEST 2018
From: Doug Berger <[email protected]>
Date: Wed, 29 Mar 2017 17:29:10 -0700
Subject: bus: brcmstb_gisb: correct support for 64-bit address output
From: Doug Berger <[email protected]>
[ Upstream commit 0c2aa0e4b308815e877601845c1a89913f9bd2b9 ]
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.
--- drivers/bus/brcmstb_gisb.c | 36 ++++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-)
drivers/bus/brcmstb_gisb.c +20 -16
@@ -33,8 +33,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)
@@ -43,7 +41,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, };
@@ -53,7 +50,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, };
@@ -63,7 +59,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, };
@@ -73,7 +68,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, };
@@ -83,7 +77,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, };
@@ -105,9 +98,13 @@ static u32 gisb_read(struct brcmstb_gisb {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);
@@ -115,6 +112,16 @@ static u32 gisb_read(struct brcmstb_gisbreturn ioread32 (gdev->base + offset); } +static u64 gisb_read_address (struct brcmstb_gisb_arb_device *gdev) +{ +u64 value; + + value =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];
@@ -181,7 +188,7 @@ static int brcmstb_gisb_arb_decode_addr( const char *reason) {u32 cap_status; -unsigned long arb_addr; +u64 arb_addr;u32 master;const char *m_name;char m_fmt[11 ];
@@ -193,10 +200,7 @@ static int brcmstb_gisb_arb_decode_addr(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);
@@ -205,7 +209,7 @@ static int brcmstb_gisb_arb_decode_addr( 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" : "",
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/bus-brcmstb_gisb-correct-support-for-64-bit-address-output.patch queue-4.4/bus-brcmstb_gisb-use-register-offsets-with-writes-too.patch