drivers/gpu/drm/msm/registers/gen_header.py

Source file repositories/reference/linux-study-clean/drivers/gpu/drm/msm/registers/gen_header.py

File Facts

System
Linux kernel
Corpus path
drivers/gpu/drm/msm/registers/gen_header.py
Extension
.py
Size
42047 bytes
Lines
1221
Domain
Driver Families
Bucket
drivers/gpu
Inferred role
Driver Families: drivers/gpu
Status
atlas-only

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

print("    return (struct fd_reg_pair) {")
        print("        .reg = (uint32_t)%s," % reg.reg_offset())
        print("        .value =")
        cast = "(uint64_t)" if reg.bit_size == 64 else ""
        for f in self.fields:
            if f.type in ["address", "waddress"]:
                continue
            else:
                type, val = f.ctype("fields.%s" % field_name(reg, f))
                print("            (%s%-40s << %2d) |" % (cast, val, f.low))
        value_name = "dword"
        if reg.bit_size == 64:
            value_name = "qword"
        print("            fields.unknown | fields.%s," % (value_name,))

        address = self.get_address_field()
        if address:
            print("#ifndef TU_CS_H")
            print("        .bo = fields.bo,")
            print("        .is_address = true,")
            print("        .bo_offset = fields.bo_offset,")
            print("        .bo_shift = %d," % address.shr)
            print("        .bo_low = %d," % address.low)
            print("#else")
            print("        .is_address = true,")
            print("#endif")

        print("    };")

    def dump_pack_struct(self, has_variants, reg=None):
        if not reg:
            return

        prefix = reg.full_name

        constexpr_mark = " CONSTEXPR"

        print("struct %s {" % prefix)
        for f in self.fields:
            if f.type in ["address", "waddress"]:
                print("#ifndef TU_CS_H")
                tab_to("    __bo_type", "bo;")
                tab_to("    uint32_t", "bo_offset;")
                print("#endif\n")
                continue
            name = field_name(reg, f)

            type, val = f.ctype("var")

            tab_to("    %s" % type, "%s;" % name)

            if f.type == "float":
                # Requires using `fui()` or `_mesa_float_to_half()`
                constexpr_mark = ""
        if reg.bit_size == 64:
            tab_to("    uint64_t", "qword;")
            tab_to("    uint64_t", "unknown;")
        else:
            tab_to("    uint32_t", "dword;")
            tab_to("    uint32_t", "unknown;")
        print("};\n")

        if not has_variants:
            print("static%s inline struct fd_reg_pair" % constexpr_mark)
            if reg.array:
                print("pack_%s(uint32_t __i, struct %s fields)\n{" % (prefix, prefix))
            else:
                print("pack_%s(struct %s fields)\n{" % (prefix, prefix))

            self.dump_regpair_builder(reg)

Annotation

Implementation Notes