diff options
2 files changed, 87 insertions, 0 deletions
diff --git a/meta-xilinx-core/dynamic-layers/virtualization-layer/recipes-kernel/lopper/lopper/0001-fixup-duplicates.patch b/meta-xilinx-core/dynamic-layers/virtualization-layer/recipes-kernel/lopper/lopper/0001-fixup-duplicates.patch new file mode 100644 index 00000000..41815392 --- /dev/null +++ b/meta-xilinx-core/dynamic-layers/virtualization-layer/recipes-kernel/lopper/lopper/0001-fixup-duplicates.patch | |||
@@ -0,0 +1,85 @@ | |||
1 | Prevent duplicate and conflicting entries in generated files | ||
2 | |||
3 | Generated xparameters.h file could end up with conflicting entries between | ||
4 | "Canonical definitions" and regular "definitions" for various peripherals. | ||
5 | |||
6 | This would result in numerous compilation warnings, and if the conflicting | ||
7 | entry was used could result in the wrong value. | ||
8 | |||
9 | Also fix the comments to match the generated defines, the wrong entry name | ||
10 | could have previously been used. | ||
11 | |||
12 | Upstream-Status: Pending | ||
13 | |||
14 | Signed-off-by: Mark Hatle <mark.hatle@amd.com> | ||
15 | |||
16 | diff --git a/lopper/assists/baremetal_xparameters_xlnx.py b/lopper/assists/baremetal_xparameters_xlnx.py | ||
17 | index 661979d..2b84a64 100644 | ||
18 | --- a/lopper/assists/baremetal_xparameters_xlnx.py | ||
19 | +++ b/lopper/assists/baremetal_xparameters_xlnx.py | ||
20 | @@ -340,7 +340,7 @@ def xlnx_generate_xparams(tgt_node, sdt, options): | ||
21 | canondef_dict.update({prop:hex(prop_val[0])}) | ||
22 | plat.buf(f'\n#define XPAR_{label_name}_{prop.upper()} {hex(prop_val[0])}') | ||
23 | |||
24 | - plat.buf(f'\n\n/* Canonical definitions for peripheral {label_name} */') | ||
25 | + plat.buf(f'\n\n/* Canonical definitions for peripheral {canonical_name}_{index} */') | ||
26 | for prop,val in sorted(canondef_dict.items(), key=lambda e: e[0][0], reverse=False): | ||
27 | if prop == "FABRIC": | ||
28 | plat.buf(f'\n#define XPAR_FABRIC_{canonical_name}_{index}_INTR {val}') | ||
29 | @@ -359,7 +359,9 @@ def xlnx_generate_xparams(tgt_node, sdt, options): | ||
30 | node_list = bm_config.get_mapped_nodes(sdt, node_list, options) | ||
31 | |||
32 | node_ip_count_dict = {} | ||
33 | + label_dict = {} | ||
34 | for node in node_list: | ||
35 | + canonical_dict = {} | ||
36 | try: | ||
37 | label_name = bm_config.get_label(sdt, symbol_node, node) | ||
38 | if label_name != None: | ||
39 | @@ -367,6 +369,14 @@ def xlnx_generate_xparams(tgt_node, sdt, options): | ||
40 | else: | ||
41 | continue | ||
42 | val = bm_config.scan_reg_size(node, node['reg'].value, 0) | ||
43 | + | ||
44 | + if label_name in label_dict: | ||
45 | + if label_dict[label_name]['BASEADDR'] != val[0] or \ | ||
46 | + label_dict[label_name]['HIGHADDR'] != val[0] + val[1] - 1: | ||
47 | + raise KeyError("Duplicate definition for {label_name}") | ||
48 | + else: | ||
49 | + label_dict[label_name] = { 'BASEADDR' : val[0] , 'HIGHADDR' : val[0] + val[1] - 1 } | ||
50 | + | ||
51 | plat.buf(f'\n/* Definitions for peripheral {label_name} */') | ||
52 | plat.buf(f'\n#define XPAR_{label_name}_BASEADDR {hex(val[0])}\n') | ||
53 | plat.buf(f'#define XPAR_{label_name}_HIGHADDR {hex(val[0] + val[1] - 1)}\n') | ||
54 | @@ -379,12 +389,28 @@ def xlnx_generate_xparams(tgt_node, sdt, options): | ||
55 | |||
56 | canonical_name = node_ip_name.upper().replace("-", "_") | ||
57 | |||
58 | - plat.buf(f'\n/* Canonical definitions for peripheral {label_name} */') | ||
59 | - plat.buf(f'\n#define XPAR_{canonical_name}_{node_ip_count_dict[node_ip_name]}_BASEADDR {hex(val[0])}\n') | ||
60 | - plat.buf(f'#define XPAR_{canonical_name}_{node_ip_count_dict[node_ip_name]}_HIGHADDR {hex(val[0] + val[1] - 1)}\n') | ||
61 | + if (f'{canonical_name}_{node_ip_count_dict[node_ip_name]}') in canonical_dict: | ||
62 | + if canonical_dict[(f'{canonical_name}_{node_ip_count_dict[node_ip_name]}')]['BASEADDR'] != val[0] or \ | ||
63 | + canonical_dict[(f'{canonical_name}_{node_ip_count_dict[node_ip_name]}')]['HIGHADDR'] != val[0] + val[1] - 1: | ||
64 | + raise KeyError("Duplicate definition for {canonical_name}") | ||
65 | + else: | ||
66 | + canonical_dict[(f'{canonical_name}_{node_ip_count_dict[node_ip_name]}')] = { 'BASEADDR' : val[0] , 'HIGHADDR' : val[0] + val[1] - 1 } | ||
67 | except KeyError: | ||
68 | pass | ||
69 | |||
70 | + # Filter out anything already defined | ||
71 | + for canonical_name in canonical_dict: | ||
72 | + baseaddr = canonical_dict[canonical_name]['BASEADDR'] | ||
73 | + highaddr = canonical_dict[canonical_name]['HIGHADDR'] | ||
74 | + | ||
75 | + if canonical_name in label_dict: | ||
76 | + # Already defined ... skip | ||
77 | + continue | ||
78 | + | ||
79 | + plat.buf(f'\n/* Canonical definitions for peripheral {canonical_name} */') | ||
80 | + plat.buf(f'\n#define XPAR_{canonical_name}_BASEADDR {hex(baseaddr)}\n') | ||
81 | + plat.buf(f'#define XPAR_{canonical_name}_HIGHADDR {hex(highaddr)}\n') | ||
82 | + | ||
83 | # Define for Board | ||
84 | if sdt.tree[tgt_node].propval('board') != ['']: | ||
85 | board = sdt.tree[tgt_node].propval('board', list)[0] | ||
diff --git a/meta-xilinx-core/dynamic-layers/virtualization-layer/recipes-kernel/lopper/lopper_git.bbappend b/meta-xilinx-core/dynamic-layers/virtualization-layer/recipes-kernel/lopper/lopper_git.bbappend index 6de745a5..26eda3fe 100644 --- a/meta-xilinx-core/dynamic-layers/virtualization-layer/recipes-kernel/lopper/lopper_git.bbappend +++ b/meta-xilinx-core/dynamic-layers/virtualization-layer/recipes-kernel/lopper/lopper_git.bbappend | |||
@@ -1,6 +1,8 @@ | |||
1 | SRC_URI = "git://github.com/devicetree-org/lopper.git;branch=master;protocol=https" | 1 | SRC_URI = "git://github.com/devicetree-org/lopper.git;branch=master;protocol=https" |
2 | SRCREV = "c0facd087263a24a83f7fad917884348db03175d" | 2 | SRCREV = "c0facd087263a24a83f7fad917884348db03175d" |
3 | 3 | ||
4 | SRC_URI += "file://0001-fixup-duplicates.patch" | ||
5 | |||
4 | FILESEXTRAPATHS:prepend := "${THISDIR}/lopper:" | 6 | FILESEXTRAPATHS:prepend := "${THISDIR}/lopper:" |
5 | 7 | ||
6 | BASEVERSION = "1.2.0" | 8 | BASEVERSION = "1.2.0" |