Skip to content

Commit c056d91

Browse files
horiagherbertx
authored andcommitted
crypto: caam - fix LS1021A support on ARMv7 multiplatform kernel
When built using multi_v7_defconfig, driver does not work on LS1021A: [...] caam 1700000.crypto: can't identify CAAM ipg clk: -2 caam: probe of 1700000.crypto failed with error -2 [...] It turns out we have to detect at runtime whether driver is running on an i.MX platform or not. Cc: <stable@vger.kernel.org> Fixes: 6c3af95 ("crypto: caam - add support for LS1021A") Signed-off-by: Horia Geantă <horia.geanta@nxp.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
1 parent 3e1166b commit c056d91

3 files changed

Lines changed: 39 additions & 44 deletions

File tree

drivers/crypto/caam/Kconfig

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
config CRYPTO_DEV_FSL_CAAM
22
tristate "Freescale CAAM-Multicore driver backend"
33
depends on FSL_SOC || ARCH_MXC || ARCH_LAYERSCAPE
4+
select SOC_BUS
45
help
56
Enables the driver module for Freescale's Cryptographic Accelerator
67
and Assurance Module (CAAM), also known as the SEC version 4 (SEC4).
@@ -141,10 +142,6 @@ config CRYPTO_DEV_FSL_CAAM_RNG_API
141142
To compile this as a module, choose M here: the module
142143
will be called caamrng.
143144

144-
config CRYPTO_DEV_FSL_CAAM_IMX
145-
def_bool SOC_IMX6 || SOC_IMX7D
146-
depends on CRYPTO_DEV_FSL_CAAM
147-
148145
config CRYPTO_DEV_FSL_CAAM_DEBUG
149146
bool "Enable debug output in CAAM driver"
150147
depends on CRYPTO_DEV_FSL_CAAM

drivers/crypto/caam/ctrl.c

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include <linux/device.h>
88
#include <linux/of_address.h>
99
#include <linux/of_irq.h>
10+
#include <linux/sys_soc.h>
1011

1112
#include "compat.h"
1213
#include "regs.h"
@@ -19,6 +20,8 @@ bool caam_little_end;
1920
EXPORT_SYMBOL(caam_little_end);
2021
bool caam_dpaa2;
2122
EXPORT_SYMBOL(caam_dpaa2);
23+
bool caam_imx;
24+
EXPORT_SYMBOL(caam_imx);
2225

2326
#ifdef CONFIG_CAAM_QI
2427
#include "qi.h"
@@ -28,19 +31,11 @@ EXPORT_SYMBOL(caam_dpaa2);
2831
* i.MX targets tend to have clock control subsystems that can
2932
* enable/disable clocking to our device.
3033
*/
31-
#ifdef CONFIG_CRYPTO_DEV_FSL_CAAM_IMX
3234
static inline struct clk *caam_drv_identify_clk(struct device *dev,
3335
char *clk_name)
3436
{
35-
return devm_clk_get(dev, clk_name);
37+
return caam_imx ? devm_clk_get(dev, clk_name) : NULL;
3638
}
37-
#else
38-
static inline struct clk *caam_drv_identify_clk(struct device *dev,
39-
char *clk_name)
40-
{
41-
return NULL;
42-
}
43-
#endif
4439

4540
/*
4641
* Descriptor to instantiate RNG State Handle 0 in normal mode and
@@ -430,6 +425,10 @@ static int caam_probe(struct platform_device *pdev)
430425
{
431426
int ret, ring, gen_sk, ent_delay = RTSDCTL_ENT_DLY_MIN;
432427
u64 caam_id;
428+
static const struct soc_device_attribute imx_soc[] = {
429+
{.family = "Freescale i.MX"},
430+
{},
431+
};
433432
struct device *dev;
434433
struct device_node *nprop, *np;
435434
struct caam_ctrl __iomem *ctrl;
@@ -451,6 +450,8 @@ static int caam_probe(struct platform_device *pdev)
451450
dev_set_drvdata(dev, ctrlpriv);
452451
nprop = pdev->dev.of_node;
453452

453+
caam_imx = (bool)soc_device_match(imx_soc);
454+
454455
/* Enable clocking */
455456
clk = caam_drv_identify_clk(&pdev->dev, "ipg");
456457
if (IS_ERR(clk)) {

drivers/crypto/caam/regs.h

Lines changed: 28 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@
6767
*/
6868

6969
extern bool caam_little_end;
70+
extern bool caam_imx;
7071

7172
#define caam_to_cpu(len) \
7273
static inline u##len caam##len ## _to_cpu(u##len val) \
@@ -154,55 +155,51 @@ static inline u64 rd_reg64(void __iomem *reg)
154155
#else /* CONFIG_64BIT */
155156
static inline void wr_reg64(void __iomem *reg, u64 data)
156157
{
157-
#ifndef CONFIG_CRYPTO_DEV_FSL_CAAM_IMX
158-
if (caam_little_end) {
158+
if (!caam_imx && caam_little_end) {
159159
wr_reg32((u32 __iomem *)(reg) + 1, data >> 32);
160160
wr_reg32((u32 __iomem *)(reg), data);
161-
} else
162-
#endif
163-
{
161+
} else {
164162
wr_reg32((u32 __iomem *)(reg), data >> 32);
165163
wr_reg32((u32 __iomem *)(reg) + 1, data);
166164
}
167165
}
168166

169167
static inline u64 rd_reg64(void __iomem *reg)
170168
{
171-
#ifndef CONFIG_CRYPTO_DEV_FSL_CAAM_IMX
172-
if (caam_little_end)
169+
if (!caam_imx && caam_little_end)
173170
return ((u64)rd_reg32((u32 __iomem *)(reg) + 1) << 32 |
174171
(u64)rd_reg32((u32 __iomem *)(reg)));
175-
else
176-
#endif
177-
return ((u64)rd_reg32((u32 __iomem *)(reg)) << 32 |
178-
(u64)rd_reg32((u32 __iomem *)(reg) + 1));
172+
173+
return ((u64)rd_reg32((u32 __iomem *)(reg)) << 32 |
174+
(u64)rd_reg32((u32 __iomem *)(reg) + 1));
179175
}
180176
#endif /* CONFIG_64BIT */
181177

178+
static inline u64 cpu_to_caam_dma64(dma_addr_t value)
179+
{
180+
if (caam_imx)
181+
return (((u64)cpu_to_caam32(lower_32_bits(value)) << 32) |
182+
(u64)cpu_to_caam32(upper_32_bits(value)));
183+
184+
return cpu_to_caam64(value);
185+
}
186+
187+
static inline u64 caam_dma64_to_cpu(u64 value)
188+
{
189+
if (caam_imx)
190+
return (((u64)caam32_to_cpu(lower_32_bits(value)) << 32) |
191+
(u64)caam32_to_cpu(upper_32_bits(value)));
192+
193+
return caam64_to_cpu(value);
194+
}
195+
182196
#ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT
183-
#ifdef CONFIG_SOC_IMX7D
184-
#define cpu_to_caam_dma(value) \
185-
(((u64)cpu_to_caam32(lower_32_bits(value)) << 32) | \
186-
(u64)cpu_to_caam32(upper_32_bits(value)))
187-
#define caam_dma_to_cpu(value) \
188-
(((u64)caam32_to_cpu(lower_32_bits(value)) << 32) | \
189-
(u64)caam32_to_cpu(upper_32_bits(value)))
190-
#else
191-
#define cpu_to_caam_dma(value) cpu_to_caam64(value)
192-
#define caam_dma_to_cpu(value) caam64_to_cpu(value)
193-
#endif /* CONFIG_SOC_IMX7D */
197+
#define cpu_to_caam_dma(value) cpu_to_caam_dma64(value)
198+
#define caam_dma_to_cpu(value) caam_dma64_to_cpu(value)
194199
#else
195200
#define cpu_to_caam_dma(value) cpu_to_caam32(value)
196201
#define caam_dma_to_cpu(value) caam32_to_cpu(value)
197-
#endif /* CONFIG_ARCH_DMA_ADDR_T_64BIT */
198-
199-
#ifdef CONFIG_CRYPTO_DEV_FSL_CAAM_IMX
200-
#define cpu_to_caam_dma64(value) \
201-
(((u64)cpu_to_caam32(lower_32_bits(value)) << 32) | \
202-
(u64)cpu_to_caam32(upper_32_bits(value)))
203-
#else
204-
#define cpu_to_caam_dma64(value) cpu_to_caam64(value)
205-
#endif
202+
#endif /* CONFIG_ARCH_DMA_ADDR_T_64BIT */
206203

207204
/*
208205
* jr_outentry

0 commit comments

Comments
 (0)