diff options
author | Mark Hatle <mark.hatle@amd.com> | 2024-11-24 08:51:35 -0700 |
---|---|---|
committer | Mark Hatle <mark.hatle@amd.com> | 2024-11-24 08:56:49 -0700 |
commit | d6ba64599f6f84a33d7c106eace03dc0a24ea02f (patch) | |
tree | 1d331aa1b807f80aeca99847b1561e37d4bb7ebe | |
parent | c6d0f2cc2aed938d59b0fdf30746fac33c900f2a (diff) | |
download | meta-xilinx-d6ba64599f6f84a33d7c106eace03dc0a24ea02f.tar.gz |
meta-xilinx-core: lopper: Prevent dup/conflicting entries in gen files
Generated xparameters.h file could end up with conflicting entries between
"Canonical definitions" and regular "definitions" for various peripherals.
This would result in numerous compilation warnings, and if the conflicting
entry was used could result in the wrong value.
Signed-off-by: Mark Hatle <mark.hatle@amd.com>
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" |