summaryrefslogtreecommitdiff
path: root/drivers/mtd/nand/raw/octeontx_bch.h
blob: 3aaa52c2643328e9cf43b7d746b8f1a0cd91ea6e (plain)
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/* SPDX-License-Identifier:    GPL-2.0
 *
 * Copyright (C) 2018 Marvell International Ltd.
 */

#ifndef __OCTEONTX_BCH_H__
#define __OCTEONTX_BCH_H__

#include "octeontx_bch_regs.h"

/* flags to indicate the features supported */
#define BCH_FLAG_SRIOV_ENABLED		BIT(1)

/*
 * BCH Registers map for 81xx
 */

/* PF registers */
#define BCH_CTL				0x0ull
#define BCH_ERR_CFG			0x10ull
#define BCH_BIST_RESULT			0x80ull
#define BCH_ERR_INT			0x88ull
#define BCH_ERR_INT_W1S			0x90ull
#define BCH_ERR_INT_ENA_W1C		0xA0ull
#define BCH_ERR_INT_ENA_W1S		0xA8ull

/* VF registers */
#define BCH_VQX_CTL(z)			0x0ull
#define BCH_VQX_CMD_BUF(z)		0x8ull
#define BCH_VQX_CMD_PTR(z)		0x20ull
#define BCH_VQX_DOORBELL(z)		0x800ull

#define BCHPF_DRIVER_NAME	"octeontx-bchpf"
#define BCHVF_DRIVER_NAME	"octeontx-bchvf"

struct bch_device {
	struct list_head list;
	u8 max_vfs;
	u8 vfs_enabled;
	u8 vfs_in_use;
	u32 flags;
	void __iomem *reg_base;
	struct udevice *dev;
};

struct bch_vf {
	u16 flags;
	u8 vfid;
	u8 node;
	u8 priority;
	struct udevice *dev;
	void __iomem *reg_base;
};

struct buf_ptr {
	u8 *vptr;
	dma_addr_t dma_addr;
	u16 size;
};

void *octeontx_bch_getv(void);
void octeontx_bch_putv(void *token);
void *octeontx_bch_getp(void);
void octeontx_bch_putp(void *token);
int octeontx_bch_wait(struct bch_vf *vf, union bch_resp *resp,
		      dma_addr_t handle);
/**
 * Given a data block calculate the ecc data and fill in the response
 *
 * @param[in] block	8-byte aligned pointer to data block to calculate ECC
 * @param block_size	Size of block in bytes, must be a multiple of two.
 * @param bch_level	Number of errors that must be corrected.  The number of
 *			parity bytes is equal to ((15 * bch_level) + 7) / 8.
 *			Must be 4, 8, 16, 24, 32, 40, 48, 56, 60 or 64.
 * @param[out] ecc	8-byte aligned pointer to where ecc data should go
 * @param[in] resp	pointer to where responses will be written.
 *
 * @return Zero on success, negative on failure.
 */
int octeontx_bch_encode(struct bch_vf *vf, dma_addr_t block, u16 block_size,
			u8 bch_level, dma_addr_t ecc, dma_addr_t resp);

/**
 * Given a data block and ecc data correct the data block
 *
 * @param[in] block_ecc_in	8-byte aligned pointer to data block with ECC
 *				data concatenated to the end to correct
 * @param block_size		Size of block in bytes, must be a multiple of
 *				two.
 * @param bch_level		Number of errors that must be corrected.  The
 *				number of parity bytes is equal to
 *				((15 * bch_level) + 7) / 8.
 *				Must be 4, 8, 16, 24, 32, 40, 48, 56, 60 or 64.
 * @param[out] block_out	8-byte aligned pointer to corrected data buffer.
 *				This should not be the same as block_ecc_in.
 * @param[in] resp		pointer to where responses will be written.
 *
 * @return Zero on success, negative on failure.
 */

int octeontx_bch_decode(struct bch_vf *vf, dma_addr_t block_ecc_in,
			u16 block_size, u8 bch_level,
			dma_addr_t block_out, dma_addr_t resp);

/**
 * Ring the BCH doorbell telling it that new commands are
 * available.
 *
 * @param num_commands	Number of new commands
 * @param vf		virtual function handle
 */
static inline void octeontx_bch_write_doorbell(u64 num_commands,
					       struct bch_vf *vf)
{
	u64 num_words = num_commands * sizeof(union bch_cmd) / sizeof(uint64_t);

	writeq(num_words, vf->reg_base + BCH_VQX_DOORBELL(0));
}

/**
 * Since it's possible (and even likely) that the NAND device will be probed
 * before the BCH device has been probed, we may need to defer the probing.
 *
 * In this case, the initial probe returns success but the actual probing
 * is deferred until the BCH VF has been probed.
 *
 * @return	0 for success, otherwise error
 */
int octeontx_pci_nand_deferred_probe(void);

#endif /* __OCTEONTX_BCH_H__ */