]>
git.ipfire.org Git - people/ms/u-boot.git/blob - arch/powerpc/cpu/mpc83xx/law.c
2 * Copyright 2011 Freescale Semiconductor, Inc.
4 * SPDX-License-Identifier: GPL-2.0
8 #include <asm/fsl_law.h>
10 #include <linux/log2.h>
12 int set_ddr_laws(u64 start
, u64 sz
, enum law_trgt_if id
)
14 immap_t
*immap
= (immap_t
*)CONFIG_SYS_IMMR
;
15 law83xx_t
*ecm
= &immap
->sysconf
.ddrlaw
[0];
16 u64 start_align
, law_sz
;
20 start_align
= 1ull << (LAW_SIZE_2G
+ 1);
22 start_align
= 1ull << (__ffs64(start
) - 1);
23 law_sz
= min(start_align
, sz
);
24 law_sz_enc
= __ilog2_u64(law_sz
) - 1;
27 * Set up LAWBAR for all of DDR.
29 ecm
->bar
= start
& 0xfffff000;
30 ecm
->ar
= (LAWAR_EN
| (id
<< 20) | (LAWAR_SIZE
& law_sz_enc
));
31 debug("DDR:bar=0x%08x\n", ecm
->bar
);
32 debug("DDR:ar=0x%08x\n", ecm
->ar
);
34 /* recalculate size based on what was actually covered by the law */
35 law_sz
= 1ull << __ilog2_u64(law_sz
);
37 /* do we still have anything to map */
42 start_align
= 1ull << (__ffs64(start
) - 1);
43 law_sz
= min(start_align
, sz
);
44 law_sz_enc
= __ilog2_u64(law_sz
) - 1;
45 ecm
= &immap
->sysconf
.ddrlaw
[1];
46 ecm
->bar
= start
& 0xfffff000;
47 ecm
->ar
= (LAWAR_EN
| (id
<< 20) | (LAWAR_SIZE
& law_sz_enc
));
48 debug("DDR:bar=0x%08x\n", ecm
->bar
);
49 debug("DDR:ar=0x%08x\n", ecm
->ar
);
54 /* do we still have anything to map */