]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
powerpc: mpc8xxx: Extend find_law() to find_law_by_addr_id()
authorPali Rohár <pali@kernel.org>
Thu, 6 Jun 2024 16:33:23 +0000 (18:33 +0200)
committerTom Rini <trini@konsulko.com>
Fri, 12 Jul 2024 19:07:43 +0000 (13:07 -0600)
The find_law() function searches for LAW just by physical address. This
is unsuitable for cases with overlapping LAWs. Extend it to
find_law_by_addr_id(), which searches for LAW by physical address and
target id.

Add a static inline definition of the original find_law() into fsl_law.h
header.

Signed-off-by: Pali Rohár <pali@kernel.org>
Signed-off-by: Marek Mojík <marek.mojik@nic.cz>
Reviewed-by: Marek Behún <kabel@kernel.org>
arch/powerpc/cpu/mpc8xxx/law.c
arch/powerpc/include/asm/fsl_law.h

index f16bc1996639d79ee67a195c45209de6594f3f99..f3a9749625c9655014ff1e4c19dfae6609619af9 100644 (file)
@@ -130,7 +130,7 @@ int set_last_law(phys_addr_t addr, enum law_size sz, enum law_trgt_if id)
        return idx;
 }
 
-struct law_entry find_law(phys_addr_t addr)
+struct law_entry find_law_by_addr_id(phys_addr_t addr, enum law_trgt_if id)
 {
        struct law_entry entry;
        int i;
@@ -146,6 +146,9 @@ struct law_entry find_law(phys_addr_t addr)
                if (!get_law_entry(i, &entry))
                        continue;
 
+               if (id != -1 && id != entry.trgt_id)
+                       continue;
+
                upper = entry.addr + (2ull << entry.size);
                if ((addr >= entry.addr) && (addr < upper)) {
                        entry.index = i;
index 9e2f2d5370d9fb33534c13a26cb2e6f79ba63c3a..d1cd7283971cc94162fdd7019a69b4072d1ae137 100644 (file)
@@ -130,7 +130,13 @@ extern void set_law(u8 idx, phys_addr_t addr, enum law_size sz, enum law_trgt_if
 extern int set_next_law(phys_addr_t addr, enum law_size sz, enum law_trgt_if id);
 extern int set_last_law(phys_addr_t addr, enum law_size sz, enum law_trgt_if id);
 extern int set_ddr_laws(u64 start, u64 sz, enum law_trgt_if id);
-extern struct law_entry find_law(phys_addr_t addr);
+extern struct law_entry find_law_by_addr_id(phys_addr_t addr, enum law_trgt_if id);
+
+static inline struct law_entry find_law(phys_addr_t addr)
+{
+       return find_law_by_addr_id(addr, -1);
+}
+
 extern void disable_law(u8 idx);
 extern void init_laws(void);
 extern void print_laws(void);