drm/amd/display: filter out invalid bits in pipe_fuses
authorjsg <jsg@openbsd.org>
Tue, 13 Jun 2023 03:05:48 +0000 (03:05 +0000)
committerjsg <jsg@openbsd.org>
Tue, 13 Jun 2023 03:05:48 +0000 (03:05 +0000)
From Samson Tam
4c1e747ca61c6103bcc259ad7f2fc6d53acff291 in linux-6.1.y/6.1.29
682439fffad9fa9a38d37dd1b1318e9374232213 in mainline linux

sys/dev/pci/drm/amd/display/dc/dcn32/dcn32_resource.c
sys/dev/pci/drm/amd/display/dc/dcn321/dcn321_resource.c

index 903f80a..814620e 100644 (file)
@@ -2037,6 +2037,14 @@ static struct resource_funcs dcn32_res_pool_funcs = {
        .remove_phantom_pipes = dcn32_remove_phantom_pipes,
 };
 
+static uint32_t read_pipe_fuses(struct dc_context *ctx)
+{
+       uint32_t value = REG_READ(CC_DC_PIPE_DIS);
+       /* DCN32 support max 4 pipes */
+       value = value & 0xf;
+       return value;
+}
+
 
 static bool dcn32_resource_construct(
        uint8_t num_virtual_links,
@@ -2079,7 +2087,7 @@ static bool dcn32_resource_construct(
        pool->base.res_cap = &res_cap_dcn32;
        /* max number of pipes for ASIC before checking for pipe fuses */
        num_pipes  = pool->base.res_cap->num_timing_generator;
-       pipe_fuses = REG_READ(CC_DC_PIPE_DIS);
+       pipe_fuses = read_pipe_fuses(ctx);
 
        for (i = 0; i < pool->base.res_cap->num_timing_generator; i++)
                if (pipe_fuses & 1 << i)
index d320e21..213ff36 100644 (file)
@@ -1621,6 +1621,14 @@ static struct resource_funcs dcn321_res_pool_funcs = {
        .remove_phantom_pipes = dcn32_remove_phantom_pipes,
 };
 
+static uint32_t read_pipe_fuses(struct dc_context *ctx)
+{
+       uint32_t value = REG_READ(CC_DC_PIPE_DIS);
+       /* DCN321 support max 4 pipes */
+       value = value & 0xf;
+       return value;
+}
+
 
 static bool dcn321_resource_construct(
        uint8_t num_virtual_links,
@@ -1663,7 +1671,7 @@ static bool dcn321_resource_construct(
        pool->base.res_cap = &res_cap_dcn321;
        /* max number of pipes for ASIC before checking for pipe fuses */
        num_pipes  = pool->base.res_cap->num_timing_generator;
-       pipe_fuses = REG_READ(CC_DC_PIPE_DIS);
+       pipe_fuses = read_pipe_fuses(ctx);
 
        for (i = 0; i < pool->base.res_cap->num_timing_generator; i++)
                if (pipe_fuses & 1 << i)