summaryrefslogtreecommitdiffstats
path: root/include/linux/platform/tegra/denver_mca.h
blob: 9262015cd614949f55d39d43cc6695caf83e55a6 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
/*
 * Copyright (c) 2015, NVIDIA CORPORATION.  All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms and conditions of the GNU General Public License,
 * version 2, as published by the Free Software Foundation.
 *
 * This program is distributed in the hope it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 * more details.
 */

/* Template for MCA bank register accessors */
#define DENVER_MCA_OP(bank, reg, crm, op2)				\
static u64 denver_mca_ ##reg##_##bank(void)				\
{									\
	u64 ret;							\
	asm volatile ("mrs %0, s3_0_c15_c" #crm "_" #op2 : "=r"(ret));	\
	return ret;							\
}

/* A macro to instanciate all of the register accessors in the bank */
#define DEFINE_DENVER_MCA_OPS(bank,					\
        crm_ctrl, op2_ctrl,						\
        crm_stat, op2_stat,						\
        crm_addr, op2_addr,						\
        crm_msc1, op2_msc1,						\
        crm_msc2, op2_msc2)						\
        DENVER_MCA_OP(bank, ctrl, crm_ctrl, op2_ctrl)			\
        DENVER_MCA_OP(bank, stat, crm_stat, op2_stat)			\
        DENVER_MCA_OP(bank, addr, crm_addr, op2_addr)			\
        DENVER_MCA_OP(bank, msc1, crm_msc1, op2_msc1)			\
        DENVER_MCA_OP(bank, msc2, crm_msc2, op2_msc2)

struct denver_mca_error {
	char *name;
	u16 error_code;
};

struct denver_mca_bank {
	struct list_head node;
	char *name;
	u64 bank;
	struct denver_mca_error *errors;
	u64 (*ctrl)(void);
	u64 (*stat)(void);
	u64 (*addr)(void);
	u64 (*msc1)(void);
	u64 (*msc2)(void);
	u8 processed;
};

/* Helper macro for filling in struct denver_mca_bank */
#define DENVER_MCA_OP_ENTRY(_bank)					\
	.bank = _bank,							\
	.ctrl = denver_mca_ctrl_ ## _bank,				\
	.stat = denver_mca_stat_ ## _bank,				\
	.addr = denver_mca_addr_ ## _bank,				\
	.msc1 = denver_mca_msc1_ ## _bank,				\
	.msc2 = denver_mca_msc2_ ## _bank

/* Helper macro for a denver_mca_bank without a denver_mca_error */
#define SIMPLE_DENVER_MCA_OP_ENTRY(_name, _bank)			\
	.name = _name,							\
	DENVER_MCA_OP_ENTRY(_bank)

void register_denver_mca_bank(struct denver_mca_bank *bank);
void unregister_denver_mca_bank(struct denver_mca_bank *bank);