Skip to content

Commit ce6ec8f

Browse files
committed
platform: xuantie: Add xuantie link pmu support
Signed-off-by: Chen Pei <cp0613@linux.alibaba.com>
1 parent a917717 commit ce6ec8f

File tree

5 files changed

+100
-6
lines changed

5 files changed

+100
-6
lines changed
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/*
2+
* SPDX-License-Identifier: BSD-2-Clause
3+
*/
4+
5+
#ifndef __RISCV_XUANTIE_LINK_H__
6+
#define __RISCV_XUANTIE_LINK_H__
7+
8+
/* HPCP reg */
9+
#define XUANTIE_LINK_PMU_L3IMP 0x048
10+
#define XUANTIE_LINK_PMU_L3MAUTHCR 0x200
11+
#define XUANTIE_LINK_PMU_HPCPCOUNT0 0x500
12+
#define XUANTIE_LINK_PMU_HPCPCOUNT1 0x508
13+
#define XUANTIE_LINK_PMU_HPCPCOUNT2 0x510
14+
#define XUANTIE_LINK_PMU_HPCPCOUNT3 0x518
15+
#define XUANTIE_LINK_PMU_HPCPCOUNT4 0x520
16+
#define XUANTIE_LINK_PMU_HPCPCOUNT5 0x528
17+
#define XUANTIE_LINK_PMU_HPCPEVT0CR 0x540
18+
#define XUANTIE_LINK_PMU_HPCPEVT1CR 0x548
19+
#define XUANTIE_LINK_PMU_HPCPEVT2CR 0x550
20+
#define XUANTIE_LINK_PMU_HPCPEVT3CR 0x558
21+
#define XUANTIE_LINK_PMU_HPCPEVT4CR 0x560
22+
#define XUANTIE_LINK_PMU_HPCPEVT5CR 0x568
23+
#define XUANTIE_LINK_PMU_HPCPCNTOF 0x5c0
24+
#define XUANTIE_LINK_PMU_HPCPMAUTHCR 0x5c8
25+
#define XUANTIE_LINK_PMU_HPCPHAUTHCR 0x5d0 // XL300
26+
#define XUANTIE_LINK_PMU_HPCPSAUTHCR 0x5d8
27+
#define XUANTIE_LINK_PMU_HPCPINHIBIT 0x5e0
28+
#define XUANTIE_LINK_PMU_HPCPINTPEND 0x5e8
29+
#define XUANTIE_LINK_PMU_VENDOR_N_IMP_ID 0x600 // XL300
30+
31+
/* HPCP dev type */
32+
#define XUANTIE_LINK_DEV_TYPE_XL100 100
33+
#define XUANTIE_LINK_DEV_TYPE_XL200 200
34+
#define XUANTIE_LINK_DEV_TYPE_XL300 300
35+
36+
int xuantie_link_pmu_device_init(void);
37+
38+
#endif // __RISCV_XUANTIE_LINK_H__

platform/generic/include/xuantie/xuantie_quirk.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
#ifndef __RISCV_XUANTIE_QUIRK_H__
66
#define __RISCV_XUANTIE_QUIRK_H__
77

8-
#define QUIRK_XUANTIE_PMC BIT(0)
8+
#define QUIRK_XUANTIE_PMC BIT(0)
9+
#define QUIRK_XUANTIE_LINK BIT(1)
910

1011
struct xuantie_generic_quirks {
1112
u32 quirk;

platform/generic/xuantie/objects.mk

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@
33
#
44

55
carray-platform_override_modules-$(CONFIG_PLATFORM_XUANTIE) += xuantie_dummy
6-
platform-objs-$(CONFIG_PLATFORM_XUANTIE) += xuantie/xuantie_dummy.o xuantie/xuantie_pmc.o
6+
platform-objs-$(CONFIG_PLATFORM_XUANTIE) += xuantie/xuantie_dummy.o xuantie/xuantie_pmc.o xuantie/xuantie_link.o

platform/generic/xuantie/xuantie_dummy.c

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,17 @@
1212

1313
#include <xuantie/xuantie_quirk.h>
1414
#include <xuantie/xuantie_pmc.h>
15+
#include <xuantie/xuantie_link.h>
16+
17+
static u32 gquirk = 0;
1518

1619
int xuantie_final_init(bool cold_boot)
1720
{
1821
if (cold_boot) {
19-
xuantie_pmc_device_init();
22+
if (gquirk & QUIRK_XUANTIE_PMC)
23+
xuantie_pmc_device_init();
24+
if (gquirk & QUIRK_XUANTIE_LINK)
25+
xuantie_link_pmu_device_init();
2026
}
2127

2228
return generic_final_init(cold_boot);
@@ -27,19 +33,28 @@ static int xuantie_dummy_platform_init(const void *fdt, int nodeoff,
2733
{
2834
const struct xuantie_generic_quirks *data = match->data;
2935

30-
if (data->quirk & QUIRK_XUANTIE_PMC)
31-
generic_platform_ops.final_init = xuantie_final_init;
36+
gquirk = data->quirk;
37+
generic_platform_ops.final_init = xuantie_final_init;
3238

3339
return 0;
3440
}
3541

42+
static const struct xuantie_generic_quirks xuantie_quirks = {
43+
.quirk = QUIRK_XUANTIE_PMC | QUIRK_XUANTIE_LINK,
44+
};
45+
3646
static const struct xuantie_generic_quirks xuantie_pmc_quirks = {
3747
.quirk = QUIRK_XUANTIE_PMC,
3848
};
3949

50+
static const struct xuantie_generic_quirks xuantie_link_quirks = {
51+
.quirk = QUIRK_XUANTIE_LINK,
52+
};
53+
4054
static const struct fdt_match xuantie_dummy_match[] = {
41-
{ .compatible = "xuantie,dummy", .data = &xuantie_pmc_quirks },
55+
{ .compatible = "xuantie,dummy", .data = &xuantie_quirks },
4256
{ .compatible = "xuantie,pmc", .data = &xuantie_pmc_quirks },
57+
{ .compatible = "xuantie,link", .data = &xuantie_link_quirks },
4358
{ },
4459
};
4560

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
/*
2+
* SPDX-License-Identifier: BSD-2-Clause
3+
*/
4+
5+
#include <libfdt.h>
6+
#include <sbi/sbi_error.h>
7+
#include <sbi/riscv_io.h>
8+
#include <sbi_utils/fdt/fdt_fixup.h>
9+
#include <sbi_utils/fdt/fdt_helper.h>
10+
#include <xuantie/xuantie_link.h>
11+
12+
int xuantie_link_pmu_device_init(void)
13+
{
14+
#if __riscv_xlen == 64
15+
int nodeoffset, rc, dev_type;
16+
uint64_t addr;
17+
void *fdt = fdt_get_address_rw();
18+
19+
if ((nodeoffset = fdt_node_offset_by_compatible(fdt, -1, "xuantie,xl100-pmu")) > 0)
20+
dev_type = XUANTIE_LINK_DEV_TYPE_XL100;
21+
else if ((nodeoffset = fdt_node_offset_by_compatible(fdt, -1, "xuantie,xl200-pmu")) > 0)
22+
dev_type = XUANTIE_LINK_DEV_TYPE_XL200;
23+
else if ((nodeoffset = fdt_node_offset_by_compatible(fdt, -1, "xuantie,xl300-pmu")) > 0)
24+
dev_type = XUANTIE_LINK_DEV_TYPE_XL300;
25+
else
26+
return SBI_ENODEV;
27+
28+
rc = fdt_get_node_addr_size(fdt, nodeoffset, 0, &addr, NULL);
29+
if (rc)
30+
return SBI_ENODEV;
31+
32+
if (dev_type == XUANTIE_LINK_DEV_TYPE_XL300)
33+
writeq(BIT_ULL(40) | BIT_ULL(32) | 0x3f, (void *)addr + XUANTIE_LINK_PMU_HPCPHAUTHCR);
34+
writeq(0x3f, (void *)addr + XUANTIE_LINK_PMU_HPCPMAUTHCR);
35+
writeq(0x3f, (void *)addr + XUANTIE_LINK_PMU_HPCPSAUTHCR);
36+
writeq(0x1, (void *)addr + XUANTIE_LINK_PMU_L3MAUTHCR);
37+
writeq(0x0, (void *)addr + XUANTIE_LINK_PMU_HPCPINHIBIT);
38+
#endif
39+
return SBI_OK;
40+
}

0 commit comments

Comments
 (0)