bus: brcmstb_gisb: correct support for 64-bit address output
[ 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.
Fixes: 44127b771d
("bus: add Broadcom GISB bus arbiter timeout/error handler")
Signed-off-by: Doug Berger <opendmb@gmail.com>
Acked-by: Gregory Fong <gregory.0xf0@gmail.com>
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
48564f6983
commit
0abaff3c28
1 changed files with 20 additions and 16 deletions
|
@ -33,8 +33,6 @@
|
||||||
#define ARB_ERR_CAP_CLEAR (1 << 0)
|
#define ARB_ERR_CAP_CLEAR (1 << 0)
|
||||||
#define ARB_ERR_CAP_STATUS_TIMEOUT (1 << 12)
|
#define ARB_ERR_CAP_STATUS_TIMEOUT (1 << 12)
|
||||||
#define ARB_ERR_CAP_STATUS_TEA (1 << 11)
|
#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_WRITE (1 << 1)
|
||||||
#define ARB_ERR_CAP_STATUS_VALID (1 << 0)
|
#define ARB_ERR_CAP_STATUS_VALID (1 << 0)
|
||||||
|
|
||||||
|
@ -43,7 +41,6 @@ enum {
|
||||||
ARB_ERR_CAP_CLR,
|
ARB_ERR_CAP_CLR,
|
||||||
ARB_ERR_CAP_HI_ADDR,
|
ARB_ERR_CAP_HI_ADDR,
|
||||||
ARB_ERR_CAP_ADDR,
|
ARB_ERR_CAP_ADDR,
|
||||||
ARB_ERR_CAP_DATA,
|
|
||||||
ARB_ERR_CAP_STATUS,
|
ARB_ERR_CAP_STATUS,
|
||||||
ARB_ERR_CAP_MASTER,
|
ARB_ERR_CAP_MASTER,
|
||||||
};
|
};
|
||||||
|
@ -53,7 +50,6 @@ static const int gisb_offsets_bcm7038[] = {
|
||||||
[ARB_ERR_CAP_CLR] = 0x0c4,
|
[ARB_ERR_CAP_CLR] = 0x0c4,
|
||||||
[ARB_ERR_CAP_HI_ADDR] = -1,
|
[ARB_ERR_CAP_HI_ADDR] = -1,
|
||||||
[ARB_ERR_CAP_ADDR] = 0x0c8,
|
[ARB_ERR_CAP_ADDR] = 0x0c8,
|
||||||
[ARB_ERR_CAP_DATA] = 0x0cc,
|
|
||||||
[ARB_ERR_CAP_STATUS] = 0x0d0,
|
[ARB_ERR_CAP_STATUS] = 0x0d0,
|
||||||
[ARB_ERR_CAP_MASTER] = -1,
|
[ARB_ERR_CAP_MASTER] = -1,
|
||||||
};
|
};
|
||||||
|
@ -63,7 +59,6 @@ static const int gisb_offsets_bcm7400[] = {
|
||||||
[ARB_ERR_CAP_CLR] = 0x0c8,
|
[ARB_ERR_CAP_CLR] = 0x0c8,
|
||||||
[ARB_ERR_CAP_HI_ADDR] = -1,
|
[ARB_ERR_CAP_HI_ADDR] = -1,
|
||||||
[ARB_ERR_CAP_ADDR] = 0x0cc,
|
[ARB_ERR_CAP_ADDR] = 0x0cc,
|
||||||
[ARB_ERR_CAP_DATA] = 0x0d0,
|
|
||||||
[ARB_ERR_CAP_STATUS] = 0x0d4,
|
[ARB_ERR_CAP_STATUS] = 0x0d4,
|
||||||
[ARB_ERR_CAP_MASTER] = 0x0d8,
|
[ARB_ERR_CAP_MASTER] = 0x0d8,
|
||||||
};
|
};
|
||||||
|
@ -73,7 +68,6 @@ static const int gisb_offsets_bcm7435[] = {
|
||||||
[ARB_ERR_CAP_CLR] = 0x168,
|
[ARB_ERR_CAP_CLR] = 0x168,
|
||||||
[ARB_ERR_CAP_HI_ADDR] = -1,
|
[ARB_ERR_CAP_HI_ADDR] = -1,
|
||||||
[ARB_ERR_CAP_ADDR] = 0x16c,
|
[ARB_ERR_CAP_ADDR] = 0x16c,
|
||||||
[ARB_ERR_CAP_DATA] = 0x170,
|
|
||||||
[ARB_ERR_CAP_STATUS] = 0x174,
|
[ARB_ERR_CAP_STATUS] = 0x174,
|
||||||
[ARB_ERR_CAP_MASTER] = 0x178,
|
[ARB_ERR_CAP_MASTER] = 0x178,
|
||||||
};
|
};
|
||||||
|
@ -83,7 +77,6 @@ static const int gisb_offsets_bcm7445[] = {
|
||||||
[ARB_ERR_CAP_CLR] = 0x7e4,
|
[ARB_ERR_CAP_CLR] = 0x7e4,
|
||||||
[ARB_ERR_CAP_HI_ADDR] = 0x7e8,
|
[ARB_ERR_CAP_HI_ADDR] = 0x7e8,
|
||||||
[ARB_ERR_CAP_ADDR] = 0x7ec,
|
[ARB_ERR_CAP_ADDR] = 0x7ec,
|
||||||
[ARB_ERR_CAP_DATA] = 0x7f0,
|
|
||||||
[ARB_ERR_CAP_STATUS] = 0x7f4,
|
[ARB_ERR_CAP_STATUS] = 0x7f4,
|
||||||
[ARB_ERR_CAP_MASTER] = 0x7f8,
|
[ARB_ERR_CAP_MASTER] = 0x7f8,
|
||||||
};
|
};
|
||||||
|
@ -105,9 +98,13 @@ static u32 gisb_read(struct brcmstb_gisb_arb_device *gdev, int reg)
|
||||||
{
|
{
|
||||||
int offset = gdev->gisb_offsets[reg];
|
int offset = gdev->gisb_offsets[reg];
|
||||||
|
|
||||||
/* return 1 if the hardware doesn't have ARB_ERR_CAP_MASTER */
|
if (offset < 0) {
|
||||||
if (offset == -1)
|
/* return 1 if the hardware doesn't have ARB_ERR_CAP_MASTER */
|
||||||
return 1;
|
if (reg == ARB_ERR_CAP_MASTER)
|
||||||
|
return 1;
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (gdev->big_endian)
|
if (gdev->big_endian)
|
||||||
return ioread32be(gdev->base + offset);
|
return ioread32be(gdev->base + offset);
|
||||||
|
@ -115,6 +112,16 @@ static u32 gisb_read(struct brcmstb_gisb_arb_device *gdev, int reg)
|
||||||
return ioread32(gdev->base + offset);
|
return 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)
|
static void gisb_write(struct brcmstb_gisb_arb_device *gdev, u32 val, int reg)
|
||||||
{
|
{
|
||||||
int offset = gdev->gisb_offsets[reg];
|
int offset = gdev->gisb_offsets[reg];
|
||||||
|
@ -181,7 +188,7 @@ static int brcmstb_gisb_arb_decode_addr(struct brcmstb_gisb_arb_device *gdev,
|
||||||
const char *reason)
|
const char *reason)
|
||||||
{
|
{
|
||||||
u32 cap_status;
|
u32 cap_status;
|
||||||
unsigned long arb_addr;
|
u64 arb_addr;
|
||||||
u32 master;
|
u32 master;
|
||||||
const char *m_name;
|
const char *m_name;
|
||||||
char m_fmt[11];
|
char m_fmt[11];
|
||||||
|
@ -193,10 +200,7 @@ static int brcmstb_gisb_arb_decode_addr(struct brcmstb_gisb_arb_device *gdev,
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
/* Read the address and master */
|
/* Read the address and master */
|
||||||
arb_addr = gisb_read(gdev, ARB_ERR_CAP_ADDR) & 0xffffffff;
|
arb_addr = gisb_read_address(gdev);
|
||||||
#if (IS_ENABLED(CONFIG_PHYS_ADDR_T_64BIT))
|
|
||||||
arb_addr |= (u64)gisb_read(gdev, ARB_ERR_CAP_HI_ADDR) << 32;
|
|
||||||
#endif
|
|
||||||
master = gisb_read(gdev, ARB_ERR_CAP_MASTER);
|
master = gisb_read(gdev, ARB_ERR_CAP_MASTER);
|
||||||
|
|
||||||
m_name = brcmstb_gisb_master_to_str(gdev, master);
|
m_name = brcmstb_gisb_master_to_str(gdev, master);
|
||||||
|
@ -205,7 +209,7 @@ static int brcmstb_gisb_arb_decode_addr(struct brcmstb_gisb_arb_device *gdev,
|
||||||
m_name = m_fmt;
|
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,
|
__func__, reason, arb_addr,
|
||||||
cap_status & ARB_ERR_CAP_STATUS_WRITE ? 'W' : 'R',
|
cap_status & ARB_ERR_CAP_STATUS_WRITE ? 'W' : 'R',
|
||||||
cap_status & ARB_ERR_CAP_STATUS_TIMEOUT ? "timeout" : "",
|
cap_status & ARB_ERR_CAP_STATUS_TIMEOUT ? "timeout" : "",
|
||||||
|
|
Loading…
Add table
Reference in a new issue