[PATCH 01/31] drm/amd/display: Refactor LTTPR mode selection
Jasdeep Dhillon
jdhillon at amd.com
Thu Sep 22 00:17:51 UTC 2022
From: Michael Strauss <michael.strauss at amd.com>
[WHY]
Previously, LTTPR mode was decided during detection which makes
link training inflexible as mode can't be dynamically changed.
[HOW]
-Remove lttpr_mode from link struct, and move to link training settings
-Defer choosing LTTPR mode until link training
Other DP changes included:
-Only use fixed vs/pe link training sequence for 8b/10b encoding
-Restrict fixed vs aux timeout workaround to Yellow Carp family
Reviewed-by: Wenjing Liu <Wenjing.Liu at amd.com>
Acked-by: Jasdeep Dhillon <jdhillon at amd.com>
Signed-off-by: Michael Strauss <michael.strauss at amd.com>
---
.../gpu/drm/amd/display/dc/core/dc_link_ddc.c | 19 ++
.../gpu/drm/amd/display/dc/core/dc_link_dp.c | 301 ++++++++++--------
.../drm/amd/display/dc/core/dc_link_dpia.c | 34 +-
drivers/gpu/drm/amd/display/dc/dc_link.h | 1 -
.../gpu/drm/amd/display/dc/inc/dc_link_dp.h | 5 +
.../amd/display/include/link_service_types.h | 1 +
scripts/extract-cert | Bin 0 -> 18320 bytes
7 files changed, 208 insertions(+), 153 deletions(-)
create mode 100755 scripts/extract-cert
diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link_ddc.c b/drivers/gpu/drm/amd/display/dc/core/dc_link_ddc.c
index d01d2eeed813..3d01965b533a 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc_link_ddc.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_link_ddc.c
@@ -35,6 +35,8 @@
#include "dc_link_ddc.h"
#include "dce/dce_aux.h"
#include "dmub/inc/dmub_cmd.h"
+#include "link_dpcd.h"
+#include "include/dal_asic_id.h"
#define DC_LOGGER_INIT(logger)
@@ -683,6 +685,22 @@ bool dc_link_aux_try_to_configure_timeout(struct ddc_service *ddc,
bool result = false;
struct ddc *ddc_pin = ddc->ddc_pin;
+ if ((ddc->link->chip_caps & EXT_DISPLAY_PATH_CAPS__DP_FIXED_VS_EN) &&
+ !ddc->link->dc->debug.disable_fixed_vs_aux_timeout_wa &&
+ ASICREV_IS_YELLOW_CARP(ddc->ctx->asic_id.hw_internal_rev)) {
+ /* Fixed VS workaround for AUX timeout */
+ const uint32_t fixed_vs_address = 0xF004F;
+ const uint8_t fixed_vs_data[4] = {0x1, 0x22, 0x63, 0xc};
+
+ core_link_write_dpcd(
+ ddc->link,
+ fixed_vs_address,
+ fixed_vs_data,
+ sizeof(fixed_vs_data));
+
+ timeout = 3072;
+ }
+
/* Do not try to access nonexistent DDC pin. */
if (ddc->link->ep_type != DISPLAY_ENDPOINT_PHY)
return true;
@@ -691,6 +709,7 @@ bool dc_link_aux_try_to_configure_timeout(struct ddc_service *ddc,
ddc->ctx->dc->res_pool->engines[ddc_pin->pin_data->en]->funcs->configure_timeout(ddc, timeout);
result = true;
}
+
return result;
}
diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c b/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c
index 7842df9f62de..b3a77a16dd0c 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c
@@ -526,9 +526,9 @@ uint8_t dc_dp_initialize_scrambling_data_symbols(
return disable_scrabled_data_symbols;
}
-static inline bool is_repeater(struct dc_link *link, uint32_t offset)
+static inline bool is_repeater(const struct link_training_settings *lt_settings, uint32_t offset)
{
- return (link->lttpr_mode == LTTPR_MODE_NON_TRANSPARENT) && (offset != 0);
+ return (lt_settings->lttpr_mode == LTTPR_MODE_NON_TRANSPARENT) && (offset != 0);
}
static void dpcd_set_lt_pattern_and_lane_settings(
@@ -545,7 +545,7 @@ static void dpcd_set_lt_pattern_and_lane_settings(
bool edp_workaround = false; /* TODO link_prop.INTERNAL */
dpcd_base_lt_offset = DP_TRAINING_PATTERN_SET;
- if (is_repeater(link, offset))
+ if (is_repeater(lt_settings, offset))
dpcd_base_lt_offset = DP_TRAINING_PATTERN_SET_PHY_REPEATER1 +
((DP_REPEATER_CONFIGURATION_AND_STATUS_SIZE) * (offset - 1));
@@ -561,7 +561,7 @@ static void dpcd_set_lt_pattern_and_lane_settings(
dpcd_lt_buffer[DP_TRAINING_PATTERN_SET - DP_TRAINING_PATTERN_SET]
= dpcd_pattern.raw;
- if (is_repeater(link, offset)) {
+ if (is_repeater(lt_settings, offset)) {
DC_LOG_HW_LINK_TRAINING("%s\n LTTPR Repeater ID: %d\n 0x%X pattern = %x\n",
__func__,
offset,
@@ -584,7 +584,7 @@ static void dpcd_set_lt_pattern_and_lane_settings(
lt_settings->dpcd_lane_settings,
size_in_bytes);
- if (is_repeater(link, offset)) {
+ if (is_repeater(lt_settings, offset)) {
if (dp_get_link_encoding_format(<_settings->link_settings) ==
DP_128b_132b_ENCODING)
DC_LOG_HW_LINK_TRAINING("%s:\n LTTPR Repeater ID: %d\n"
@@ -873,7 +873,7 @@ enum dc_status dp_get_lane_status_and_lane_adjust(
uint32_t lane;
enum dc_status status;
- if (is_repeater(link, offset)) {
+ if (is_repeater(link_training_setting, offset)) {
lane01_status_address =
DP_LANE0_1_STATUS_PHY_REPEATER1 +
((DP_REPEATER_CONFIGURATION_AND_STATUS_SIZE) * (offset - 1));
@@ -906,7 +906,7 @@ enum dc_status dp_get_lane_status_and_lane_adjust(
ln_align->raw = dpcd_buf[2];
- if (is_repeater(link, offset)) {
+ if (is_repeater(link_training_setting, offset)) {
DC_LOG_HW_LINK_TRAINING("%s:\n LTTPR Repeater ID: %d\n"
" 0x%X Lane01Status = %x\n 0x%X Lane23Status = %x\n ",
__func__,
@@ -954,7 +954,7 @@ enum dc_status dpcd_set_lane_settings(
lane0_set_address = DP_TRAINING_LANE0_SET;
- if (is_repeater(link, offset))
+ if (is_repeater(link_training_setting, offset))
lane0_set_address = DP_TRAINING_LANE0_SET_PHY_REPEATER1 +
((DP_REPEATER_CONFIGURATION_AND_STATUS_SIZE) * (offset - 1));
@@ -963,7 +963,7 @@ enum dc_status dpcd_set_lane_settings(
(uint8_t *)(link_training_setting->dpcd_lane_settings),
link_training_setting->link_settings.lane_count);
- if (is_repeater(link, offset)) {
+ if (is_repeater(link_training_setting, offset)) {
if (dp_get_link_encoding_format(&link_training_setting->link_settings) ==
DP_128b_132b_ENCODING)
DC_LOG_HW_LINK_TRAINING("%s:\n LTTPR Repeater ID: %d\n"
@@ -1172,7 +1172,7 @@ static enum link_training_result perform_channel_equalization_sequence(
/* Note: also check that TPS4 is a supported feature*/
tr_pattern = lt_settings->pattern_for_eq;
- if (is_repeater(link, offset) && dp_get_link_encoding_format(<_settings->link_settings) == DP_8b_10b_ENCODING)
+ if (is_repeater(lt_settings, offset) && dp_get_link_encoding_format(<_settings->link_settings) == DP_8b_10b_ENCODING)
tr_pattern = DP_TRAINING_PATTERN_SEQUENCE_4;
dp_set_hw_training_pattern(link, link_res, tr_pattern, offset);
@@ -1198,7 +1198,7 @@ static enum link_training_result perform_channel_equalization_sequence(
/* 3. wait for receiver to lock-on*/
wait_time_microsec = lt_settings->eq_pattern_time;
- if (is_repeater(link, offset))
+ if (is_repeater(lt_settings, offset))
wait_time_microsec =
dp_translate_training_aux_read_interval(
link->dpcd_caps.lttpr_caps.aux_rd_interval[offset - 1]);
@@ -1469,7 +1469,6 @@ static inline void decide_8b_10b_training_settings(
*/
lt_settings->link_settings.link_spread = link->dp_ss_off ?
LINK_SPREAD_DISABLED : LINK_SPREAD_05_DOWNSPREAD_30KHZ;
- lt_settings->lttpr_mode = link->lttpr_mode;
lt_settings->cr_pattern_time = get_cr_training_aux_rd_interval(link, link_setting);
lt_settings->eq_pattern_time = get_eq_training_aux_rd_interval(link, link_setting);
lt_settings->pattern_for_cr = decide_cr_training_pattern(link_setting);
@@ -1478,6 +1477,7 @@ static inline void decide_8b_10b_training_settings(
lt_settings->should_set_fec_ready = true;
lt_settings->disallow_per_lane_settings = true;
lt_settings->always_match_dpcd_with_hw_lane_settings = true;
+ lt_settings->lttpr_mode = dp_decide_8b_10b_lttpr_mode(link);
dp_hw_to_dpcd_lane_settings(lt_settings, lt_settings->hw_lane_settings, lt_settings->dpcd_lane_settings);
}
@@ -1501,9 +1501,8 @@ static inline void decide_128b_132b_training_settings(struct dc_link *link,
lt_settings->cds_pattern_time = 2500;
lt_settings->cds_wait_time_limit = (dp_convert_to_count(
link->dpcd_caps.lttpr_caps.phy_repeater_cnt) + 1) * 20000;
- lt_settings->lttpr_mode = dp_convert_to_count(link->dpcd_caps.lttpr_caps.phy_repeater_cnt) ?
- LTTPR_MODE_NON_TRANSPARENT : LTTPR_MODE_TRANSPARENT;
lt_settings->disallow_per_lane_settings = true;
+ lt_settings->lttpr_mode = dp_decide_128b_132b_lttpr_mode(link);
dp_hw_to_dpcd_lane_settings(lt_settings,
lt_settings->hw_lane_settings, lt_settings->dpcd_lane_settings);
}
@@ -1543,7 +1542,7 @@ static void override_training_settings(
lt_settings->ffe_preset = overrides->ffe_preset;
/* Override HW lane settings with BIOS forced values if present */
if (link->chip_caps & EXT_DISPLAY_PATH_CAPS__DP_FIXED_VS_EN &&
- link->lttpr_mode == LTTPR_MODE_TRANSPARENT) {
+ lt_settings->lttpr_mode == LTTPR_MODE_TRANSPARENT) {
lt_settings->voltage_swing = &link->bios_forced_drive_settings.VOLTAGE_SWING;
lt_settings->pre_emphasis = &link->bios_forced_drive_settings.PRE_EMPHASIS;
lt_settings->always_match_dpcd_with_hw_lane_settings = false;
@@ -1584,6 +1583,15 @@ static void override_training_settings(
if (link->preferred_training_settings.fec_enable != NULL)
lt_settings->should_set_fec_ready = *link->preferred_training_settings.fec_enable;
+
+ #if defined(CONFIG_DRM_AMD_DC_DCN)
+ /* Check DP tunnel LTTPR mode debug option. */
+ if (link->ep_type == DISPLAY_ENDPOINT_USB4_DPIA && link->dc->debug.dpia_debug.bits.force_non_lttpr)
+ lt_settings->lttpr_mode = LTTPR_MODE_NON_LTTPR;
+
+#endif
+ dp_get_lttpr_mode_override(link, <_settings->lttpr_mode);
+
}
uint8_t dp_convert_to_count(uint8_t lttpr_repeater_count)
@@ -1649,7 +1657,7 @@ static enum dc_status configure_lttpr_mode_non_transparent(
link->dpcd_caps.lttpr_caps.mode = repeater_mode;
}
- if (link->lttpr_mode == LTTPR_MODE_NON_TRANSPARENT) {
+ if (lt_settings->lttpr_mode == LTTPR_MODE_NON_TRANSPARENT) {
DC_LOG_HW_LINK_TRAINING("%s\n Set LTTPR to Non Transparent Mode\n", __func__);
@@ -2099,7 +2107,7 @@ static enum link_training_result dp_perform_8b_10b_link_training(
/* 1. set link rate, lane count and spread. */
dpcd_set_link_settings(link, lt_settings);
- if (link->lttpr_mode == LTTPR_MODE_NON_TRANSPARENT) {
+ if (lt_settings->lttpr_mode == LTTPR_MODE_NON_TRANSPARENT) {
/* 2. perform link training (set link training done
* to false is done as well)
@@ -2216,7 +2224,7 @@ static enum link_training_result perform_fixed_vs_pe_nontransparent_training_seq
link->vendor_specific_lttpr_link_rate_wa = target_rate;
- if (link->lttpr_mode == LTTPR_MODE_NON_TRANSPARENT) {
+ if (lt_settings->lttpr_mode == LTTPR_MODE_NON_TRANSPARENT) {
/* 2. perform link training (set link training done
* to false is done as well)
@@ -2288,7 +2296,7 @@ static enum link_training_result dp_perform_fixed_vs_pe_training_sequence(
ASSERT(dp_get_link_encoding_format(<_settings->link_settings) ==
DP_8b_10b_ENCODING);
- if (link->lttpr_mode == LTTPR_MODE_NON_TRANSPARENT) {
+ if (lt_settings->lttpr_mode == LTTPR_MODE_NON_TRANSPARENT) {
status = perform_fixed_vs_pe_nontransparent_training_sequence(link, link_res, lt_settings);
return status;
}
@@ -2635,6 +2643,7 @@ enum link_training_result dc_link_dp_perform_link_training(
link,
link_settings,
<_settings);
+
override_training_settings(
link,
&link->preferred_training_settings,
@@ -2652,7 +2661,7 @@ enum link_training_result dc_link_dp_perform_link_training(
* Per DP specs starting from here, DPTX device shall not issue
* Non-LT AUX transactions inside training mode.
*/
- if (link->chip_caps & EXT_DISPLAY_PATH_CAPS__DP_FIXED_VS_EN)
+ if (link->chip_caps & EXT_DISPLAY_PATH_CAPS__DP_FIXED_VS_EN && encoding == DP_8b_10b_ENCODING)
status = dp_perform_fixed_vs_pe_training_sequence(link, link_res, <_settings);
else if (encoding == DP_8b_10b_ENCODING)
status = dp_perform_8b_10b_link_training(link, link_res, <_settings);
@@ -3086,7 +3095,7 @@ struct dc_link_settings dp_get_max_link_cap(struct dc_link *link)
* account for lttpr repeaters cap
* notes: repeaters do not snoop in the DPRX Capabilities addresses (3.6.3).
*/
- if (link->lttpr_mode != LTTPR_MODE_NON_LTTPR) {
+ if (dp_is_lttpr_present(link)) {
if (link->dpcd_caps.lttpr_caps.max_lane_count < max_link_cap.lane_count)
max_link_cap.lane_count = link->dpcd_caps.lttpr_caps.max_lane_count;
lttpr_max_link_rate = get_lttpr_max_link_rate(link);
@@ -3240,7 +3249,7 @@ static bool dp_verify_link_cap(
cur_link_settings = max_link_settings;
/* Grant extended timeout request */
- if ((link->lttpr_mode == LTTPR_MODE_NON_TRANSPARENT) && (link->dpcd_caps.lttpr_caps.max_ext_timeout > 0)) {
+ if (dp_is_lttpr_present(link) && link->dpcd_caps.lttpr_caps.max_ext_timeout > 0) {
uint8_t grant = link->dpcd_caps.lttpr_caps.max_ext_timeout & 0x80;
core_link_write_dpcd(link, DP_PHY_REPEATER_EXTENDED_WAIT_TIMEOUT, &grant, sizeof(grant));
@@ -4101,8 +4110,13 @@ static void dp_test_send_phy_test_pattern(struct dc_link *link)
&dpcd_lane_adjustment[0].raw,
sizeof(dpcd_lane_adjustment));
+ /* prepare link training settings */
+ link_training_settings.link_settings = link->cur_link_settings;
+
+ link_training_settings.lttpr_mode = dp_decide_lttpr_mode(link, &link->cur_link_settings);
+
if ((link->chip_caps & EXT_DISPLAY_PATH_CAPS__DP_FIXED_VS_EN) &&
- link->lttpr_mode == LTTPR_MODE_TRANSPARENT)
+ link_training_settings.lttpr_mode == LTTPR_MODE_TRANSPARENT)
dp_fixed_vs_pe_read_lane_adjust(
link,
link_training_settings.dpcd_lane_settings);
@@ -4209,9 +4223,6 @@ static void dp_test_send_phy_test_pattern(struct dc_link *link)
test_pattern_size);
}
- /* prepare link training settings */
- link_training_settings.link_settings = link->cur_link_settings;
-
for (lane = 0; lane <
(unsigned int)(link->cur_link_settings.lane_count);
lane++) {
@@ -5021,133 +5032,136 @@ static bool dpcd_read_sink_ext_caps(struct dc_link *link)
return true;
}
-/* Logic to determine LTTPR mode */
-static void determine_lttpr_mode(struct dc_link *link)
+bool dp_retrieve_lttpr_cap(struct dc_link *link)
{
- bool allow_lttpr_non_transparent_mode = 0;
- bool vbios_lttpr_enable = link->dc->caps.vbios_lttpr_enable;
+ uint8_t lttpr_dpcd_data[8];
+ enum dc_status status = DC_ERROR_UNEXPECTED;
+ bool is_lttpr_present = false;
+
+ /* Logic to determine LTTPR support*/
bool vbios_lttpr_interop = link->dc->caps.vbios_lttpr_aware;
- if (link->ctx->dc->debug.lttpr_mode_override != 0) {
- link->lttpr_mode = link->ctx->dc->debug.lttpr_mode_override;
- return;
- }
+ if (!vbios_lttpr_interop || !link->dc->caps.extended_aux_timeout_support)
+ return false;
- if ((link->dc->config.allow_lttpr_non_transparent_mode.bits.DP2_0 &&
- link->dpcd_caps.channel_coding_cap.bits.DP_128b_132b_SUPPORTED)) {
- allow_lttpr_non_transparent_mode = 1;
- } else if (link->dc->config.allow_lttpr_non_transparent_mode.bits.DP1_4A &&
- !link->dpcd_caps.channel_coding_cap.bits.DP_128b_132b_SUPPORTED) {
- allow_lttpr_non_transparent_mode = 1;
+ /* By reading LTTPR capability, RX assumes that we will enable
+ * LTTPR extended aux timeout if LTTPR is present.
+ */
+ status = core_link_read_dpcd(
+ link,
+ DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV,
+ lttpr_dpcd_data,
+ sizeof(lttpr_dpcd_data));
+
+ link->dpcd_caps.lttpr_caps.revision.raw =
+ lttpr_dpcd_data[DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV -
+ DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV];
+
+ link->dpcd_caps.lttpr_caps.max_link_rate =
+ lttpr_dpcd_data[DP_MAX_LINK_RATE_PHY_REPEATER -
+ DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV];
+
+ link->dpcd_caps.lttpr_caps.phy_repeater_cnt =
+ lttpr_dpcd_data[DP_PHY_REPEATER_CNT -
+ DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV];
+
+ link->dpcd_caps.lttpr_caps.max_lane_count =
+ lttpr_dpcd_data[DP_MAX_LANE_COUNT_PHY_REPEATER -
+ DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV];
+
+ link->dpcd_caps.lttpr_caps.mode =
+ lttpr_dpcd_data[DP_PHY_REPEATER_MODE -
+ DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV];
+
+ link->dpcd_caps.lttpr_caps.max_ext_timeout =
+ lttpr_dpcd_data[DP_PHY_REPEATER_EXTENDED_WAIT_TIMEOUT -
+ DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV];
+ link->dpcd_caps.lttpr_caps.main_link_channel_coding.raw =
+ lttpr_dpcd_data[DP_MAIN_LINK_CHANNEL_CODING_PHY_REPEATER -
+ DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV];
+
+ link->dpcd_caps.lttpr_caps.supported_128b_132b_rates.raw =
+ lttpr_dpcd_data[DP_PHY_REPEATER_128B132B_RATES -
+ DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV];
+
+ /* If this chip cap is set, at least one retimer must exist in the chain
+ * Override count to 1 if we receive a known bad count (0 or an invalid value) */
+ if (link->chip_caps & EXT_DISPLAY_PATH_CAPS__DP_FIXED_VS_EN &&
+ (dp_convert_to_count(link->dpcd_caps.lttpr_caps.phy_repeater_cnt) == 0)) {
+ ASSERT(0);
+ link->dpcd_caps.lttpr_caps.phy_repeater_cnt = 0x80;
}
- link->lttpr_mode = LTTPR_MODE_NON_LTTPR;
- if (vbios_lttpr_enable && vbios_lttpr_interop)
- link->lttpr_mode = LTTPR_MODE_NON_TRANSPARENT;
- else if (!vbios_lttpr_enable && vbios_lttpr_interop) {
- if (allow_lttpr_non_transparent_mode)
- link->lttpr_mode = LTTPR_MODE_NON_TRANSPARENT;
- else
- link->lttpr_mode = LTTPR_MODE_TRANSPARENT;
- } else if (!vbios_lttpr_enable && !vbios_lttpr_interop) {
- if (!allow_lttpr_non_transparent_mode || !link->dc->caps.extended_aux_timeout_support)
- link->lttpr_mode = LTTPR_MODE_NON_LTTPR;
- else
- link->lttpr_mode = LTTPR_MODE_NON_TRANSPARENT;
- }
+ /* Attempt to train in LTTPR transparent mode if repeater count exceeds 8. */
+ is_lttpr_present = dp_is_lttpr_present(link);
-#if defined(CONFIG_DRM_AMD_DC_DCN)
- /* Check DP tunnel LTTPR mode debug option. */
- if (link->ep_type == DISPLAY_ENDPOINT_USB4_DPIA &&
- link->dc->debug.dpia_debug.bits.force_non_lttpr)
- link->lttpr_mode = LTTPR_MODE_NON_LTTPR;
-#endif
+ if (is_lttpr_present)
+ CONN_DATA_DETECT(link, lttpr_dpcd_data, sizeof(lttpr_dpcd_data), "LTTPR Caps: ");
+
+ return is_lttpr_present;
}
-bool dp_retrieve_lttpr_cap(struct dc_link *link)
+bool dp_is_lttpr_present(struct dc_link *link)
{
- uint8_t lttpr_dpcd_data[8];
- enum dc_status status = DC_ERROR_UNEXPECTED;
- bool is_lttpr_present = false;
+ return (dp_convert_to_count(link->dpcd_caps.lttpr_caps.phy_repeater_cnt) != 0 &&
+ link->dpcd_caps.lttpr_caps.max_lane_count > 0 &&
+ link->dpcd_caps.lttpr_caps.max_lane_count <= 4 &&
+ link->dpcd_caps.lttpr_caps.revision.raw >= 0x14);
+}
- memset(lttpr_dpcd_data, '\0', sizeof(lttpr_dpcd_data));
+enum lttpr_mode dp_decide_lttpr_mode(struct dc_link *link, struct dc_link_settings *link_setting)
+{
+ enum dp_link_encoding encoding = dp_get_link_encoding_format(link_setting);
- /* Logic to determine LTTPR mode*/
- determine_lttpr_mode(link);
+ if (encoding == DP_8b_10b_ENCODING)
+ return dp_decide_8b_10b_lttpr_mode(link);
+ else if (encoding == DP_128b_132b_ENCODING)
+ return dp_decide_128b_132b_lttpr_mode(link);
- if (link->lttpr_mode == LTTPR_MODE_NON_TRANSPARENT || link->lttpr_mode == LTTPR_MODE_TRANSPARENT) {
- if ((link->chip_caps & EXT_DISPLAY_PATH_CAPS__DP_FIXED_VS_EN) &&
- !link->dc->debug.disable_fixed_vs_aux_timeout_wa) {
- /* Fixed VS workaround for AUX timeout */
- const uint32_t fixed_vs_address = 0xF004F;
- const uint8_t fixed_vs_data[4] = {0x1, 0x22, 0x63, 0xc};
+ ASSERT(0);
+ return LTTPR_MODE_NON_LTTPR;
+}
- core_link_write_dpcd(
- link,
- fixed_vs_address,
- fixed_vs_data,
- sizeof(fixed_vs_data));
- }
+void dp_get_lttpr_mode_override(struct dc_link *link, enum lttpr_mode *override)
+{
+ if (!dp_is_lttpr_present(link))
+ return;
- /* By reading LTTPR capability, RX assumes that we will enable
- * LTTPR extended aux timeout if LTTPR is present.
- */
- status = core_link_read_dpcd(
- link,
- DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV,
- lttpr_dpcd_data,
- sizeof(lttpr_dpcd_data));
-
- link->dpcd_caps.lttpr_caps.revision.raw =
- lttpr_dpcd_data[DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV -
- DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV];
-
- link->dpcd_caps.lttpr_caps.max_link_rate =
- lttpr_dpcd_data[DP_MAX_LINK_RATE_PHY_REPEATER -
- DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV];
-
- link->dpcd_caps.lttpr_caps.phy_repeater_cnt =
- lttpr_dpcd_data[DP_PHY_REPEATER_CNT -
- DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV];
-
- link->dpcd_caps.lttpr_caps.max_lane_count =
- lttpr_dpcd_data[DP_MAX_LANE_COUNT_PHY_REPEATER -
- DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV];
-
- link->dpcd_caps.lttpr_caps.mode =
- lttpr_dpcd_data[DP_PHY_REPEATER_MODE -
- DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV];
-
- link->dpcd_caps.lttpr_caps.max_ext_timeout =
- lttpr_dpcd_data[DP_PHY_REPEATER_EXTENDED_WAIT_TIMEOUT -
- DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV];
- link->dpcd_caps.lttpr_caps.main_link_channel_coding.raw =
- lttpr_dpcd_data[DP_MAIN_LINK_CHANNEL_CODING_PHY_REPEATER -
- DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV];
-
- link->dpcd_caps.lttpr_caps.supported_128b_132b_rates.raw =
- lttpr_dpcd_data[DP_PHY_REPEATER_128B132B_RATES -
- DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV];
-
- /* If this chip cap is set, at least one retimer must exist in the chain
- * Override count to 1 if we receive a known bad count (0 or an invalid value) */
- if (link->chip_caps & EXT_DISPLAY_PATH_CAPS__DP_FIXED_VS_EN &&
- (dp_convert_to_count(link->dpcd_caps.lttpr_caps.phy_repeater_cnt) == 0)) {
- ASSERT(0);
- link->dpcd_caps.lttpr_caps.phy_repeater_cnt = 0x80;
- }
+ if (link->dc->debug.lttpr_mode_override == LTTPR_MODE_TRANSPARENT) {
+ *override = LTTPR_MODE_TRANSPARENT;
+ } else if (link->dc->debug.lttpr_mode_override == LTTPR_MODE_NON_TRANSPARENT) {
+ *override = LTTPR_MODE_NON_TRANSPARENT;
+ } else if (link->dc->debug.lttpr_mode_override == LTTPR_MODE_NON_LTTPR) {
+ *override = LTTPR_MODE_NON_LTTPR;
+ }
+}
- /* Attempt to train in LTTPR transparent mode if repeater count exceeds 8. */
- is_lttpr_present = (link->dpcd_caps.lttpr_caps.max_lane_count > 0 &&
- link->dpcd_caps.lttpr_caps.max_lane_count <= 4 &&
- link->dpcd_caps.lttpr_caps.revision.raw >= 0x14);
- if (is_lttpr_present) {
- CONN_DATA_DETECT(link, lttpr_dpcd_data, sizeof(lttpr_dpcd_data), "LTTPR Caps: ");
- configure_lttpr_mode_transparent(link);
- } else
- link->lttpr_mode = LTTPR_MODE_NON_LTTPR;
+enum lttpr_mode dp_decide_8b_10b_lttpr_mode(struct dc_link *link)
+{
+ bool is_lttpr_present = dp_is_lttpr_present(link);
+ bool vbios_lttpr_force_non_transparent = link->dc->caps.vbios_lttpr_enable;
+ bool vbios_lttpr_aware = link->dc->caps.vbios_lttpr_aware;
+
+ if (!is_lttpr_present)
+ return LTTPR_MODE_NON_LTTPR;
+
+ if (vbios_lttpr_aware) {
+ if (vbios_lttpr_force_non_transparent)
+ return LTTPR_MODE_NON_TRANSPARENT;
+ else
+ return LTTPR_MODE_TRANSPARENT;
}
- return is_lttpr_present;
+
+ if (link->dc->config.allow_lttpr_non_transparent_mode.bits.DP1_4A &&
+ link->dc->caps.extended_aux_timeout_support)
+ return LTTPR_MODE_NON_TRANSPARENT;
+
+ return LTTPR_MODE_NON_LTTPR;
+}
+
+enum lttpr_mode dp_decide_128b_132b_lttpr_mode(struct dc_link *link)
+{
+ return dp_is_lttpr_present(link) ? LTTPR_MODE_NON_TRANSPARENT : LTTPR_MODE_NON_LTTPR;
}
static bool get_usbc_cable_id(struct dc_link *link, union dp_cable_id *cable_id)
@@ -5209,13 +5223,16 @@ static enum dc_status wa_try_to_wake_dprx(struct dc_link *link, uint64_t timeout
uint64_t current_ts = 0;
uint64_t time_taken_ms = 0;
enum dc_connection_type type = dc_connection_none;
+ bool lttpr_present;
+ bool vbios_lttpr_interop = link->dc->caps.vbios_lttpr_aware;
- determine_lttpr_mode(link);
+ lttpr_present = dp_is_lttpr_present(link) ||
+ (!vbios_lttpr_interop || !link->dc->caps.extended_aux_timeout_support);
/* Issue an AUX read to test DPRX responsiveness. If LTTPR is supported the first read is expected to
* be to determine LTTPR capabilities. Otherwise trying to read power state should be an innocuous AUX read.
*/
- if (link->lttpr_mode == LTTPR_MODE_NON_TRANSPARENT || link->lttpr_mode == LTTPR_MODE_TRANSPARENT)
+ if (lttpr_present)
status = core_link_read_dpcd(
link,
DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV,
@@ -5345,6 +5362,10 @@ static bool retrieve_link_cap(struct dc_link *link)
}
is_lttpr_present = dp_retrieve_lttpr_cap(link);
+
+ if (is_lttpr_present)
+ configure_lttpr_mode_transparent(link);
+
/* Read DP tunneling information. */
status = dpcd_get_tunneling_device_data(link);
@@ -6096,7 +6117,7 @@ bool dc_link_dp_set_test_pattern(
/* Set DPCD Lane Settings before running test pattern */
if (p_link_settings != NULL) {
if ((link->chip_caps & EXT_DISPLAY_PATH_CAPS__DP_FIXED_VS_EN) &&
- link->lttpr_mode == LTTPR_MODE_TRANSPARENT) {
+ p_link_settings->lttpr_mode == LTTPR_MODE_TRANSPARENT) {
dp_fixed_vs_pe_set_retimer_lane_settings(
link,
p_link_settings->dpcd_lane_settings,
@@ -7218,7 +7239,7 @@ void dp_set_hw_lane_settings(
{
const struct link_hwss *link_hwss = get_link_hwss(link, link_res);
- if ((link->lttpr_mode == LTTPR_MODE_NON_TRANSPARENT) && !is_immediate_downstream(link, offset))
+ if ((link_settings->lttpr_mode == LTTPR_MODE_NON_TRANSPARENT) && !is_immediate_downstream(link, offset))
return;
if (link_hwss->ext.set_dp_lane_settings)
diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link_dpia.c b/drivers/gpu/drm/amd/display/dc/core/dc_link_dpia.c
index 468e39589ed8..ab2d0a33dea9 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc_link_dpia.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_link_dpia.c
@@ -115,12 +115,14 @@ static enum link_training_result dpia_configure_link(
DC_LOG_HW_LINK_TRAINING("%s\n DPIA(%d) configuring\n - LTTPR mode(%d)\n",
__func__,
link->link_id.enum_id - ENUM_ID_1,
- link->lttpr_mode);
+ lt_settings->lttpr_mode);
dp_decide_training_settings(link,
link_setting,
lt_settings);
+ dp_get_lttpr_mode_override(link, <_settings->lttpr_mode);
+
status = dpcd_configure_channel_coding(link, lt_settings);
if (status != DC_OK && link->is_hpd_pending)
return LINK_TRAINING_ABORT;
@@ -178,7 +180,7 @@ static uint8_t dpia_build_set_config_data(enum dpia_set_config_type type,
switch (type) {
case DPIA_SET_CFG_SET_LINK:
- data.set_link.mode = link->lttpr_mode == LTTPR_MODE_NON_TRANSPARENT ? 1 : 0;
+ data.set_link.mode = lt_settings->lttpr_mode == LTTPR_MODE_NON_TRANSPARENT ? 1 : 0;
break;
case DPIA_SET_CFG_SET_PHY_TEST_MODE:
break;
@@ -553,7 +555,7 @@ static enum link_training_result dpia_training_cr_phase(
{
enum link_training_result result = LINK_TRAINING_CR_FAIL_LANE0;
- if (link->lttpr_mode == LTTPR_MODE_NON_TRANSPARENT)
+ if (lt_settings->lttpr_mode == LTTPR_MODE_NON_TRANSPARENT)
result = dpia_training_cr_non_transparent(link, link_res, lt_settings, hop);
else
result = dpia_training_cr_transparent(link, link_res, lt_settings);
@@ -830,7 +832,7 @@ static enum link_training_result dpia_training_eq_phase(
{
enum link_training_result result;
- if (link->lttpr_mode == LTTPR_MODE_NON_TRANSPARENT)
+ if (lt_settings->lttpr_mode == LTTPR_MODE_NON_TRANSPARENT)
result = dpia_training_eq_non_transparent(link, link_res, lt_settings, hop);
else
result = dpia_training_eq_transparent(link, link_res, lt_settings);
@@ -870,13 +872,14 @@ static enum dc_status dpcd_clear_lt_pattern(struct dc_link *link, uint32_t hop)
* @param hop The Hop in display path. DPRX = 0.
*/
static enum link_training_result dpia_training_end(struct dc_link *link,
+ struct link_training_settings *lt_settings,
uint32_t hop)
{
enum link_training_result result = LINK_TRAINING_SUCCESS;
uint8_t repeater_cnt = 0; /* Number of hops/repeaters in display path. */
enum dc_status status;
- if (link->lttpr_mode == LTTPR_MODE_NON_TRANSPARENT) {
+ if (lt_settings->lttpr_mode == LTTPR_MODE_NON_TRANSPARENT) {
repeater_cnt = dp_convert_to_count(link->dpcd_caps.lttpr_caps.phy_repeater_cnt);
if (hop == repeater_cnt) { /* DPTX-to-DPIA */
@@ -916,7 +919,7 @@ static enum link_training_result dpia_training_end(struct dc_link *link,
link->link_id.enum_id - ENUM_ID_1,
hop,
result,
- link->lttpr_mode);
+ lt_settings->lttpr_mode);
return result;
}
@@ -928,7 +931,10 @@ static enum link_training_result dpia_training_end(struct dc_link *link,
* @param link DPIA link being trained.
* @param hop The Hop in display path. DPRX = 0.
*/
-static void dpia_training_abort(struct dc_link *link, uint32_t hop)
+static void dpia_training_abort(
+ struct dc_link *link,
+ struct link_training_settings *lt_settings,
+ uint32_t hop)
{
uint8_t data = 0;
uint32_t dpcd_tps_offset = DP_TRAINING_PATTERN_SET;
@@ -936,7 +942,7 @@ static void dpia_training_abort(struct dc_link *link, uint32_t hop)
DC_LOG_HW_LINK_TRAINING("%s\n DPIA(%d) aborting\n - LTTPR mode(%d)\n - HPD(%d)\n",
__func__,
link->link_id.enum_id - ENUM_ID_1,
- link->lttpr_mode,
+ lt_settings->lttpr_mode,
link->is_hpd_pending);
/* Abandon clean-up if sink unplugged. */
@@ -964,12 +970,16 @@ enum link_training_result dc_link_dpia_perform_link_training(
uint8_t repeater_cnt = 0; /* Number of hops/repeaters in display path. */
int8_t repeater_id; /* Current hop. */
+ struct dc_link_settings link_settings = *link_setting; // non-const copy to pass in
+
+ lt_settings.lttpr_mode = dp_decide_lttpr_mode(link, &link_settings);
+
/* Configure link as prescribed in link_setting and set LTTPR mode. */
result = dpia_configure_link(link, link_res, link_setting, <_settings);
if (result != LINK_TRAINING_SUCCESS)
return result;
- if (link->lttpr_mode == LTTPR_MODE_NON_TRANSPARENT)
+ if (lt_settings.lttpr_mode == LTTPR_MODE_NON_TRANSPARENT)
repeater_cnt = dp_convert_to_count(link->dpcd_caps.lttpr_caps.phy_repeater_cnt);
/* Train each hop in turn starting with the one closest to DPTX.
@@ -987,7 +997,7 @@ enum link_training_result dc_link_dpia_perform_link_training(
break;
/* Stop training hop. */
- result = dpia_training_end(link, repeater_id);
+ result = dpia_training_end(link, <_settings, repeater_id);
if (result != LINK_TRAINING_SUCCESS)
break;
}
@@ -1001,9 +1011,9 @@ enum link_training_result dc_link_dpia_perform_link_training(
msleep(5);
result = dp_check_link_loss_status(link, <_settings);
} else if (result == LINK_TRAINING_ABORT) {
- dpia_training_abort(link, repeater_id);
+ dpia_training_abort(link, <_settings, repeater_id);
} else {
- dpia_training_end(link, repeater_id);
+ dpia_training_end(link, <_settings, repeater_id);
}
return result;
}
diff --git a/drivers/gpu/drm/amd/display/dc/dc_link.h b/drivers/gpu/drm/amd/display/dc/dc_link.h
index d890a03910c7..6e49ec262487 100644
--- a/drivers/gpu/drm/amd/display/dc/dc_link.h
+++ b/drivers/gpu/drm/amd/display/dc/dc_link.h
@@ -151,7 +151,6 @@ struct dc_link {
bool link_state_valid;
bool aux_access_disabled;
bool sync_lt_in_progress;
- enum lttpr_mode lttpr_mode;
bool is_internal_display;
/* TODO: Rename. Flag an endpoint as having a programmable mapping to a
diff --git a/drivers/gpu/drm/amd/display/dc/inc/dc_link_dp.h b/drivers/gpu/drm/amd/display/dc/inc/dc_link_dp.h
index b44c7b43f7db..99c2ce2e7b9e 100644
--- a/drivers/gpu/drm/amd/display/dc/inc/dc_link_dp.h
+++ b/drivers/gpu/drm/amd/display/dc/inc/dc_link_dp.h
@@ -194,6 +194,11 @@ enum dc_status dpcd_configure_lttpr_mode(
enum dp_link_encoding dp_get_link_encoding_format(const struct dc_link_settings *link_settings);
bool dp_retrieve_lttpr_cap(struct dc_link *link);
+bool dp_is_lttpr_present(struct dc_link *link);
+enum lttpr_mode dp_decide_lttpr_mode(struct dc_link *link, struct dc_link_settings *link_setting);
+void dp_get_lttpr_mode_override(struct dc_link *link, enum lttpr_mode *override);
+enum lttpr_mode dp_decide_8b_10b_lttpr_mode(struct dc_link *link);
+enum lttpr_mode dp_decide_128b_132b_lttpr_mode(struct dc_link *link);
bool dpcd_write_128b_132b_sst_payload_allocation_table(
const struct dc_stream_state *stream,
struct dc_link *link,
diff --git a/drivers/gpu/drm/amd/display/include/link_service_types.h b/drivers/gpu/drm/amd/display/include/link_service_types.h
index 79fabc51c991..120f6bf409c0 100644
--- a/drivers/gpu/drm/amd/display/include/link_service_types.h
+++ b/drivers/gpu/drm/amd/display/include/link_service_types.h
@@ -83,6 +83,7 @@ enum link_training_result {
};
enum lttpr_mode {
+ LTTPR_MODE_UNKNOWN,
LTTPR_MODE_NON_LTTPR,
LTTPR_MODE_TRANSPARENT,
LTTPR_MODE_NON_TRANSPARENT,
diff --git a/scripts/extract-cert b/scripts/extract-cert
new file mode 100755
index 0000000000000000000000000000000000000000..2d399cf2845e298627bc07190ae3db5347769ae4
GIT binary patch
literal 18320
zcmV;BM{l@)MNCEl0RaF2000000000306qW#0000m7XSbN0000$000000002cKL7v#
z000000000$05|{*06+jA03HAa000040000$000000000$000000000$000000002k
z0ssI20002k0ssI2000080000000003000040000O0{{R30000O0{{R30000O0{{R3
z0000S000000000S00000000010000000001000040000000000000000000000000
z000000002+3;+NC0002+3;+NC000005C8xG0000100005000005C8xG000005C8xG
z000005C8xG0002x3IG5A0002x3IG5A000005C8xG000010000400000AOHXW00000
zAOHXW00000AOHXW000000{{R3000000{{R3000005C8xG00001000060002sEC2ui
z0002sJOBUy0002sJOBUy0000m0{{R30001R0{{R3000005C8xG00002000060002+
zEC2ui0002+JOBUy0002+JOBUy000000ssI2000000ssI200008000000000400004
z0000u0{{R30000u0{{R30000u0{{R30000W000000000W00000000080000000004
z00004000130{{R3000130{{R3000130{{R30000)000000000)000000000400000
z0000}<#c2O0000u0{{R30000u0{{R30000u0{{R30000W000000000W0000000008
z000000000`<#c2O0002^AOHXW0002^AOHXW0002^AOHXW00017000000001700000
z00004000000000{<#c2Q000000000000000000000000000000000000000000000
z000000000G000000000|<#c2O0002sEC2ui0002sJOBUy0002sJOBUy0000W0{{R3
z0000W0{{R300001000000000lY-wUPG%svqEo^CSb$Bg!I5sUdG%j;*E;0ZB00004
z0000G000050000-PE`N`006)Q0000300000000040000K000030000-PE`PK$d{!$
zaal<F#dc2J(cH(g<c$Ud0000G000010000-PE`N^0000300002000000000000002
z0000V0000100006000000f7Jj0006X0000W0002dWzKCm@{1e*000000000000000
z00000000000001}0RR9J000000000000000000000000I0000W000000000000000
z000000001m0RR9J000000000000000000000000h0RR9J00000000000000000000
z0001r0RR9J000000000000000000000002t0RR9J000000000000000000000001M
z0RR9J000000000000000000000000x0RR9J000000000000000000000000X0000W
z000000000000000000000002D0000I000000000000000000000000z0000W00000
z0000000000000000000P0RR9J000000000000000000000001t0000I0000000000
z00000000000001?0RR9J000000000000000000000002T0RR9J000000000000000
z000000000^0RR9J000000000000000000000002J0RR9J00000000000000000000
z000120000I000000000000000000000001}0000I000000000000000000000001x
z0RR9J000000000000000000000001A0RR9J000000000000000000000001M0000I
z000000000000000000000002Q0000I000000000000000000000002C0RR9J00000
z0000000000000000000C0RR9J000000000000000000000002`0000I0000000000
z00000000000002m0000I000000000000000000000002-0000I000000000000000
z000000002X0RR9J000000000000000000000001Z0000I00000000000000000000
z0002e0RR9Z000000000000000000000002Q0RR9I02%-wKmY&$000080000000000
zY-wU+a(QrcZ!U9hE-@}K0AF8cZEtR0b97;HbYEWpUrAI=Uu0!+WoKz~bY*f>O+##N
zZe>(qVr*pqUrAI=Uvgz<X>)XCa#T%2Y;SI5RAFLlWdKD|QeSXoWout-VRLj}WpZ+F
zasX*EWM5b{FgaghX>R~eP(@BtQ%qlJZfSI1V{&<LbZ-DfPDe>jMPF=hVPs!ob!lvL
zX>MO-Zf9w3Wpe;UQc_=VWo2t$WpZ+FasWa}PhW0jcVA{{Y-IpgH843}XJvF>b9G{B
zWn*+-ZeeX at 07XtmNlryyV{~$CUt?`#UvqSFX>Ml#LP<|wW^!d^08m9uUvgz(WM5)w
zZ(mq7FgXB4PDe>jMPFihUuk3jST!&?Urs?yMPF}jWo&6~WdKD|QeR_iWnpq(WpZ+F
zasWkAQeS6fbYEq1a&K~9Y-w&~07X(#UuAM~Z*pIAbaH8KX8=V`M at ddaUukY>bO1$8
zM at ddaUt@G~Y+qw-WB_bwVq-3IZ!R_fWq4_H0A_D+Wo`gpUvqR}V{2byXlq|)VQFjt
zb98caZ)^ZxUuJM}X>N38Ut?%%0A^!sZ*ye;XJvF{Zgv23bYx|6asXy`a%psB0AF8Y
zcwt{=X>MU`X?kS<Uter#Vq;%(bYXIIUu|J&ZU9eEMNU&wOkXiyF<&qMM@&gVLtip3
zGyq3TNkT(kGA=SMH2_CUNkT(kGA=VNGynhq00IC200RI700RI600aO80000400004
z00aO700RI700RI700aO900aO800aO700aO800aO800RI700RI600001009620000G
z0000W0000GA8iHz00aQ at 0RR910000100RJf0RR9H000000000KX=x1r00jU60ssII
z0001W8fggt00RIE0ssII0001V8EFXs00ICP0ssI20002sJOBUy00008000000000G
z7ytkO0002!JOBUy00008000000002c7XSbN00008KmY&$000080000000008KmY&$
z0002kKL7v#000060000200000000000002sKL7v#000060000600000000000002!
zKL7v#000060000900000000000002+KL7v#000060000B00000000000002^KL7v#
z000060000V00000000000000WKmY&$000050000W000000000000008KL7v#00007
z0000100000000000000GKL7v#000070000300000000000000OKL7v#0000700004
z00000000000000WKL7v#000070000500000000000000eKL7v#000070000700000
z000000000mKL7v#000070000800000000000000uKL7v#000070000A0000000000
z0000$KL7v#000070000C00000000000000;KL7v#000070000D00000000000000`
zKL7v#000070000E000000000000013KL7v#000070000F00000000000001BKL7v#
z000070000G00000000000001JKL7v#000070000H00000000000001RKL7v#00007
z0000I00000000000001ZKL7v#000070000J00000000000001hKL7v#000070000K
z00000000000001pKL7v#000070000L00000000000001xKL7v#000070000M00000
z000000001(KL7v#000070000N00000000000001>KL7v#000070000O0000000000
z0001}KL7v#000070000P000000000000026KL7v#000070000Q00000000000002E
zKL7v#000070000R00000000000002MKL7v#000070000S00000000000002UKL7v#
z000070000T00000000000002cKL7v#000070000U0000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000002<4<7nR
zgX{=Miv`Iq002mZz;put&`5*C2*UsX00030HPS8s0P_DO(=Gr24<7*Y4<7nx00000
z^6BCK|NoHl4<7nx0RR91^6An4|NoHl4<7nx0ssI2^6A0<|NoHl4<7nx0{{R3^69bv
z|NoHl4<7nx1ONa4^68=f|NoHl4<7nx1poj5^68QP|NoHl4<7nx1^@s6^67#9|NoHl
z4<7nx2LJ#7^67E^|NoHl4<7nx2mk;8^66p!|NoHl4<7nx2><{9^663k|NoHl4<7nx
z3IG5A^65eU|NoHl4<7nx3jhEB^64 at E|NoHl4<7nx3;+NC^64S}|NoHl4<7nx4FCWD
z^63%(|NoHl4<7nx4gdfE^63Hp|NoHl4<7nx4*&oF^6ByZ|NoHl4<7nx5C8xG^6BCJ
z|NoHl4<7nx5dZ)H^6An3|NoHl4<7nx5&!@I^6A0;|NoHl4<7nx6951J^69bu|NoHl
z4<7nx6aWAK^68=e|NoHl4<7nx6#xJL^68QO|NoHl4<7nx761SM^67#8|NoHl4<7nx
z7XSbN^67E@|NoHl4<7nx7ytkO^66pz|NoHl4<7nx82|tP^663j|NoHl4<7pR|0NwR
z000jkL;wKu4<7pR|0NwQ000jkL;wKu4<7pR|0NYI000jkL;wKu4<7pR|0NAA000jk
zL;wKu4<7pR|0M-2000jkL;wKu4<7pR|0Vq_000jkL;wKu4<7pR|0VS-000jkL;wKu
z4<7pR|0V4#000jkL;wKu4<7pR|0U%t000jkL;wKu4<7pR|0Ufl000jkL;wKu4<7pR
z|0UHd000jkL;wKu4<7pR|0T^V000jkL;wKu4<7pR|0TsN000jkL;wKu4<7pR|0TUF
z000jkL;wKu4<7pR|0T67000jkL;wKu4<7pR|0S&~000jkL;wKu4<7pR|0Sg?000jk
zL;wKu4<7pR|0SI)000jkL;wKu4<7pR|0R_y000jkL;wKu4<7pR|0Rtq000jkL;wKu
z4<7pR|0RVi000jkL;wKu4<7pR|0R7a000jkL;wKu4<7pR|0Q)S000jkL;wKu4<7pR
z|0QiK000jkL;wKu4<7pR|0QKC000jkL;wKu4<7pR|0P{4000jkL;wKu4<7pR|0Pu{
z000jkL;wKu4<7nKR8@)nzYG8X08>bb^D*{FgX|z=NQ(p|C;$KeNQp!w7%{-;!~g&P
zG4{U#0002!xBvhD=tBPg|45BJdkg>o=+^%K|GEkQ002mZz(|S5NR0(z3;+N~4 at CGe
z_UMWJ|NlshJz)$00Eq=WEC2xLr~d!{NQnhVEC2w5{R0n$ngRd-Op9X(NQ-+AL4Z6Y
z07!{F8!P|-4}|dn006lM0000;jXf|7002yh=JTcxm%tnVguoAl2>}2AOo=2UNXJAZ
z2mk;80O$?=|NrP{{{R0-g}`(L=)MC007#8J{tEyA=(7I*|450&=t}<o|44<v4~5+U
z002mZ?GJ=n0ssI=iSOu8{{R1lzz>970ssK$BmV#YNQJ<31?YJL002mf6`Csm07!+>
zbSW{(NR2h#3jhE}iSOuq{{R1p!|3(>|NlsZzz>C{0RRAn+Yf|50ssI-F~Bj>NQvP=
zxd8wG07#8BtqTAENQv+0C;k8bNQ+z~2<W~2|NlsZzz>B%0RR9<h1(B=wE+MCNQ-<V
z2<Q<6002mfJsK+j0O%$D|NlsfL?jqwNHYW_C;$Ke4~3oq002mX#2_)iTU|k1!$^%a
za|-|fOo`{{=luWwNQuMfU;Y38NQJ-;g#iHo07!+~bua614<CR40000;g}`)6=sx}b
z|44<vbPvCp0002!-vR&tNQLcmOGt_D=#m2f05Qoi(lPc(iQnji{r~?+gFTEY0000;
ziN$rl=mP!!|44<vbk6I-4<7*N<NW{siNe9^7=!u=bSdcM{Qv(*g}`;DOo`%1jWs+9
z006%M0000n!03tm|NmwWAA|q^0000b{|^8FgZON9&FJy_|NrR=|Ns9;jWr1h008Ll
z`~Uw)iN)xc{Qv(*g}`+bNQLcmS4fHP=+^xI|1tmQulxW1zi$8l0O%zG008UYzlQ(-
z0O%P4008N*{{R2Ke*gdg=n4V=0O=I||Np;^0002!`vCv|>G1yl|G$L*008Lh0RRB$
zOaA}=NQ)JyDF6USjWv)7006%M0000n!06rk|Nlsf4R$F20J<yy006!L0000;jXezt
z008Kq{Qv*I0ssI2=qCIB|45BB+z9{xzX1RM05QPmqx=8==<fUf|45BBg$V!vzX1RM
z05QPmi~Ilo=*Ij1|44<vbPB(N0002!X8`~JNR2ge2><}U0RR91F~I0#`~Uw)jWuft
z006%M0000n!01u?|NoHl4<7n4?MaEzUPy`JNQ30?P*hBf1%?9v07#7u4+8)INR2%x
z{Qv*|6 at n-L0Q8VZjXkL-002mh1)?Yb07yCbbQMU81#Tz+07!+vbP5094<CR40002P
z4<CR40000;jXilN002mhHF78b07xnRNQv-B!R|ju!T1A60mewt{&W;biv=|(002mZ
zz;p=z;ARgWL;wK84<CR40002<4<7n}JxwS8004C>RY-$95-0!w07!}DbPPy~Jr*bc
z0O;BI|NrP@|NsBS1tll|00CXY4<7)-4<CR40002<4<7pIcmMzY4<CR400010Q%HmC
zC}c>B1SKc{002mdL?jq7z(|d3Bn(K6TqF=kiS9^=-{|G}|NlsZz;*CQi$o+CWJogv
zB`5#@0CfjQgTyFXUBl>P`v3nAA3y*>REhaWjTMOp006!L00010Q%HgAkN^MxNQ*s?
zCjbCsNQ(p|C;$KeNQs0bhyVZpF~CfXWF!Pgjcg<cNR3=15a=oS|NrYb4<CR40000;
zWB5pk-sr{o|NlgbOe6$IiP<s0Op8P$2uO=PKPLbHz5xIL07#7$CI<ij=<fLc|4fPI
zNQv+0Gx`7jg}`;cNQ;CdhyVZpWJogvB`5#@0CfyVfy9si003KEL0rS=tNH)`W at auA
zAA|q^0000%R8>fc{YZiA*Z=?kWJrqyB`5#@07!|1B**{&05QNwgFWab0000FgpvRN
z07!}NNr~j>m-+wyy2t<k08EMINQuYj*ZBYcNQ*tdCIA3PiSFoV`Tzfk#pp5l|NlsZ
zz;p_~RR910=+gfG|Ap;zev1W&CIA41z;z@@i-aV|0001FNHYW_C;$Ke4~3Ed002mV
z#Ml4;09`>`!)B03i#<su002yh;l2R?001$-NR1Uj1^@u)^Y{P%>%EXji#<Um002mh
zH6{iC0O&pV|Nlsd1vVxC07;3&=&tzx|44<vbtz4S<PU{D|Ns9;ixm+j002mhHTeYq
z0KWkM001$-=tlVe|7H&#L;wK4QUCw|=qCRE|4oJD4}}Z=|NraD=yv%3|7H&#L;wKu
z4<7nKS4 at pPb0Po$K~_nL)<IQCiS<ELL5ciTNR2IIA^-qWOey_HgX{?CZ}tEGNWuLB
zbRRL>4<CR40000?iSkT|?nH^_LH`urNQ1)xNIBhg>PUmc2wPo2TtQtyUO`{OW at auA
zAA|q^0002<4<7o%0002<4<7nRgX{=MgTx5K000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000100IC(bRcbEX>KlKIwfQ}
z3IHu2Q&UVJC389;C389 at WC{RxVgMy`07ZCoa$#e1Wn>^@WpZ>nASH7O05AYcLRCpj
zL|;}#QbJEtMF2}eRY^=lUsFj(PG3+-P5^LgV{<VvIskBMV{<Vv08DRTWFSyWLsKI$
zF(5 at wM@dda07XtmNlryyX>MtB08?djAW%y~QzJ1kAW%t808CFoL|;QiQdD0<R8mX;
zM`d&%SS~d%IUr_oZ*3q at OG8s5F);vgVgLYDb75y?Iv{gna%pgMb1!9hbaG*1bS-0L
za&#a(b8mHWV`V-dJY;2abUq3I000018v{FB0000A0000e at Bjah0002k@c;j~0002!
z at c;kN0001p^8f#I0RR9v_W%EQ0000e_y7Os0001Z_y7MC0RR9v`2YV%0RRAK`Tzf@
z0RRBl`Tzg$0RR910000K0000000001dQt!Zcn|>_3<n610RR9L0000S0002E_5c4b
z00000L<bN60000a0000q0001x?*IR=0RR914iH8T7)lQdcL;z0KN>nJGbADa0000K
z000170000O at c;i100000000000000K0001V0000G at c;jy0RR91000000000e0001t
z0000u_W%D(00000K at Jdx0znQKg9AhkKz<4i7(osYK at JE(3jhEx0002E00017_W%F2
z00000LJkm&0#6PYh66zkAcF))4zK|Nk_rwWK at J!}4iG{P2tf-d0002&0002!_W%DX
z0RR91LJkm&0znQKh673t at Bspi3Jw@S4iG{P2tx}n0000O0RR9D@&Es?0{{R3Mh*~+
z0znQKh66|rAcF)+4nPB|0SXQvLk<{04iG{P2tf-(0000?0RRBF_y7N800000Mh*~<
z0!a=SjsrywAdLh?4k(NTL=G^921pJ#g9k?rKyD5=K at KoM4k$tnAVLlpLJkl at 4hR4c
z0001#0RRBt_y7L|00000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z0000G7ytkO0002c7XSbN0000100000000010000000001000000001c0RR910000C
z00000000005C8xG0000D000000002k8UO$Q0000P000000002sJOBUy0000R00000
z00008000000000Q000000002!JOBUy0000S0000000008000000002>{{L?P0001>
z0{{R300005000000002s1^@s600006000000002U0{{R30000A000000000Z0ssI2
z0000B000000000O000000000L00000000000000000003000000002+J^%m!00002
z000000001R0ssI20000K0000000007000000000N000000001h3IG5A0000700000
z0001}2><{900008000000002k0000000009000000000O000000000U0000000008
z000000002{|Nn0Q00001000O80002~|Nn0Q0000;2><{900030|Nn0Q0000200000
z0002+|Nn0Q000042><{90002_|Nn0Q00003000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000002+JOBUy000000000000000000000000m5C8xG0000$5C8xG0000`
z5C8xG0001B5C8xG0001R5C8xG0001h5C8xG0001x5C8xG0001>5C8xG000265C8xG
z0002M5C8xG0002c5C8xG0002s5C8xG0002+5C8xG000005dZ)H0000G5dZ)H0000W
z5dZ)H0000m5dZ)H0000$5dZ)H0000`5dZ)H0001B5dZ)H0001R5dZ)H0001h5dZ)H
z0001x5dZ)H0001>5dZ)H000265dZ)H0002M5dZ)H0000000000000000000000000
z0000000000000000000000000000000000000008KmY&$0000-Lqj?sC{<#0Zgh1Z
zIW9CVFfB24Vs&nGbuoT2FfK4OE-@(}IW9CVFaQ7m0000000000000000000000000
z0000000000000030096P0{{R30000000000000000000300ICw0{{R30000000000
z000000000300RJ60{{R30000000000000000000300aPh0{{R3000000000000000
z0000300jV`0{{R30000000000000000000300sca0{{R300000000000000000003
z00#iz1^@s60000000000000000000300;mC2><{90000000000000000000300{s{
z2><{900000000000000000003015!82><{90000000000000000000301E(s3IG5A
z0000000000000000000301N;C5C8xG0000000000000000000301W^j5C8xG00000
z00000000000000301g1q5dZ)H0000000000000000000301p7*5dZ)H0000000000
z000000000301yCx6951J0000000000000000000301*J#8UO$Q000000000000000
z0000301^NIAOHXW00000000000000000003022WCAOHXW00000000000000000003
z02BaNApigX0000000000000000000302Kh>JOBUy0000000000000000000302Tn~
zJOBUy0000000000000000000302cu8JOBUy0000000000000000000302l!9J^%m!
z0000000000000000000302u%PKmY&$0000000000000000000302%-wKmY&$00000
z00000000000000302=@R00000000000000000001000040P+6-000000000000000
z0000G0000201yBm7ytkO0000?000000000i0000201yCh7ytkO0002B000000000=
z0000201yB$82|tP0000g0RR91000100000102%;5KmY&$00008000000001300001
z02%-=KmY&$00004000000001I0000102%-|KmY&$00008000000001R0000102%;D
zKmY&$00008000000001a000040P+6-0000000000000000001l0000201yCR7XSbN
z00000000000001n0000201yC>7XSbN00000000000001)0000201yDs7XSbN00000
z00000000250000102%-&KmY&$00001000000002K0000102Tn~JOBUy0000000000
z0002x0000201yBW7ytkO00000000000002-0000102Kh>JOBUy00000000000001a
z000040P+6-0000000000000000000G0RR9202BcHA^-pY00000000000000000004
z0P+6-0000000000000000000U0RR91022WCAOHXW00000000000000n0RR9202l!9
zJ^%m!00000000000000-0RR9102Kh}JOBUy0000000000000130RR9102Kh>JOBUy
z00000000000001M0RR9202cu8JOBUy00000000000001A0{{R501N;C5C8xG00000
z000000002B0ssIY02u%PKmY&$00000000000001V0RR9J01yDs8UO$Q0000500000
z0002F0ssIK01yB$7XSbN0000l000000001l0RR9J000000000000000000000001=
z0RR9X00000000000000000000000240RR9J000000000000000000000002M0RR9J
z000000000000000000000001f0RR9J0ucb%8UO$Q00000000000002r0RR9J00000
z0000000000000000002;0RR9J000000000000000000000000H0ssIK0000000000
z00000000000000m0ssIK000000000000000000000000|0ssIY000000000000000
z000000001P0ssIJ01^NIAOHXW00004000000001e0ssIK00000000000000000000
z0001)0ssIY00000000000000000000000290ssII02u%PKmY&$00000000000002M
z0ssIa000000000000000000000002o0ssIJ0vP}hKmY&$00000000000002!0ssIK
z00000000000000000000000090{{RK0vP}ZKmY&$00000000000000M0{{RL00000
z0000000000000000000%0{{RL00000000000000000000000100{{RL01yCR8UO$Q
z0001G000000002k1ONaM000000000000000000000001G0{{RL000000000000000
z000000001m0{{RL000000000000000000000001)0{{RL00000000000000000000
z0002I0{{RL000000000000000000000002m0{{RJ02%-gKmY&$00000000000002y
z0{{RL00000000000000000000000021ONaM000000000000000000000000T1ONaM
z000000000000000000000000v1ONaM000000000000000000000000}0RR9H02%;L
zKmY&$0000000000000191ONaM000000000000000000000001T1ONaM0000000000
z00000000000001v1ONaM00000000000000000000000251ONaM000000000000000
z000000002h1ONaL02%-wKmY&$00008000000002#1ONaM00000000000000000000
z000011pojN000000000000000000000000L1pojN000000000000000000000000u
z1pojL02u%fKmY&$00000000000000#1pojN01yCx6951J000250{{R300000Wq5RQ
zVPkYHV`Xx5E at J>>a$#w1UvF?_ZgX>NUuAM~Z*p at kaA9(EE-(OOX>)LFVR>I~aAj_D
zb8KH_a&m8Sb1raUa&#^*0C#d}bY)*-WpZ=?cVYl*Vs&Y3WM6h=a$;|DWdLJka&%v0
zb94Y}WqDt4VRLf;V{&wJbaiHCE at J>>WpZU_X>)XCa$j_9Ut?@<Ze?=-UteTzUuSG@
zVqt7wWOQ$Gb6;U~cmQK>ZE$R5bY)~NI50Lb0AF8ZZ(nC at Z(?C=Uu1M|a&uo{b$DN9
zX>Ms>VRCX|d0%C2baHtBW^!R|WnW}<ZEbk~UteZ&VQpn!WOZ$Ad0%O6X>?y<a&lpL
zUuAA|a(Mt>Uq(_vO+{ZtPDEc{0AF86PE}t;NMA-$K}|(pNJLTqUq?(&LP1PlPew*l
zMO0r at K|)MLUjScUX>MtBUtw}`VR>I=Ze##oUukY>bYEd|a$$L2b97;HbO2vOSx!Ms
zNkaf%Uu<b&V_#!)bzf#_ZfO8tUuJM}X>N38Ut?%%KtM-KNkT(kGA=VNGyq>;XKin8
zUvqR}a&%u`0A+Y-bU;8yOi4mRUotK-E;Rr}Qc_=IY-M3`UuAM~Z*o9DPf$fpQ&UV|
zF<&uXFaTz6aAj^lKu1hTLPK9NE;24P0AF8hX<}nvb97;HbYE>@X>LG3M@&gVLtip3
zGA=a$MNUUaPDNj1baHH8V{K$WKu=IbPE%7%Uol at XUoZegQc_=MWprO<a&m8SUu<b^
zWk5hrP(@BtQ%qkmUol at W0AEQ|O<!bXa%E>}b97~LR82!{Z*FB&VPb4$0AEQ at UvqS1
zX>MP2b7f=zLP<|wZe at 30W@&6?KtNAWMNU&wOkXiyF<&qMUrAI=Uvgz<X>)XCa#T%2
zY;SI5RAFLlWdL7aWMOn+UvqR}a&!P+Ut at S-UuJ1;VQgu7Wk5hjOi4mRUotK-E;RsO
zUsO#)UqwztUta)NH843}PC-pYUvF+ at Y-w&~KtNAWMNU&wOkXiyF<&qMUteT%Z(nF(
zZe(m_07XtmNlryyY;R#?Ut)D>Y;<XEUuAA*X>Mh6KtNAWMNU&wOkXiyF<&qMb98ca
zZ)`w7M@&gVLtip3GA=a$Uter#Vq;%pb9G;7ZfSG?MN(2<WpZ+Fa$j?Fa%pa7KtNAW
zMNU&wOkXiyF<&qMXJvF{ZgxOGM@&gVLtip3GA=a$MN(2<aAjp{Uu<D>bYEq1a&K}#
zKu=IbPE%7%Uol at XUoZegQc_=VWo2t$WpZ+FazH>&P(@BtQ%qkmUol at W0AF8Xb8}yF
zbYXII0AF8obYWv_Ut?%%UuI!xY(PLqOi4mRUotK<07XtmNlryyX>MtBKtNAWMNU&w
zOkXiyF<&qMX)<JAST!&?Ut(!*KtNAWMNU&wOkXiyF<&qMST!&?UuR`>UvqV0YGq?|
zUv6P-Wk5hrP(@BtQ%qkmUol at W0A^!sZ*yfpKu1hTLPK9NE;24P07XtmNlryyVtHR_
zWI#YqP(@BtQ%qkmUol at W08m9uUvgz(WM5)wZ(mq7FgZX#Pf$fpQ&UV|F<&uXFaSkP
zM at ddaUt@G~Y+qw-WM6Z1a%pa7KtNAWMNU&wOkXiyF<&qMb97{7a&kaGM@&gVLtip3
zGA=a$LP<|wW^!d^KtNAWMNU&wOkXiyF<&qMW_NOFbY(z5M@&gVLtip3GA=a$Pf$fp
zQ&UV|X>MtBUt at B4aCC1#Ku=IbPE%7%Uol at XUoZe)Wn^J=VE}DmX>I at jE^~QpbYWru
zE^~BpbYWruE^}yebaHfIVgN2_ZggdGZ~!iDZ**lYXKr;aaB^>OWpZ?R04{ECbY(7Q
zZgnnVb!lv5Eoo!`E^cphWiCNNNiB3?X8<l|ZgnnbVRL8zE at XLbb9rq5E@XLbb98b5
zE at y6aE_P*db7^mG04`^4buM;ga&u{KZeMZ$E^=jTVJ>8OZU8QFWo%(CaBOq{E@^IQ
zbO0`JY;-PXZ*%}IaBOrgb7f-yE_7vhbO0`9X>Mr%E^=>VVRT^tE at fz6W^!R|WnXAy
zasV!6XkTV>VQpmqE@^IQbYEd|a$$J at E@o+NX<uP-a$$J at E@XLbVQpz+04`)<bYTE4
zVsmo<E at N+PZDnqB00000000000000000000000000000000000000000000000000
z0000000000000000000000000000000000R0000100002000000000O0{{R30000O
z0{{R30000S000000000000000000010000000000000000000Z000070000200000
z0000u0{{R30000u0{{R30000W000000000000000000080000000000000000000s
z000070000200000000130{{R3000130{{R30000a0000000000000000000400000
z00000000000000<0000700002000000001d0{{R30001d0{{R30000W0000000000
z0000000004000000000000000000120002?|Nn0S000000001>0{{R30001>0{{R3
z0000e000000000600000000080000000000000000001C0000B00002000000002U
z0{{R30002U0{{R30000O0{{R3000070000100008000000000O000000001K00003
z00002000000002s1^@s60002s1^@s60000Z0ssI20000000000000010000000000
z000000001S00030|Nn0S00000000042><{9000042><{90000&000000000600000
z000020000000002000000001f0002~|Nn0S000000000;2><{90000;2><{90001B
z000000000700002000080000000000000000001u0000400002000000001}2><{9
z0001}2><{90002k00000000060000000008000000000O000000001&000040000&
z000000001h3IG5A0001h3IG5A0001R0ssI2000060000O00008000000000O00000
z0001?000010000600000000005C8xG000005C8xG0000R00000000000000000004
z0000000000000000001-0000100006000000000W5C8xG0000W5C8xG000260RR91
z00000000000000G000000000G000000001|0000100006000000002c5dZ)H0002c
z5dZ)H0000G0000000000000000000G000000000G0000000026000010000600000
z0002s5dZ)H0002s5dZ)H0001>0RR9100000000000000G000000000G000000002F
z0000100006000000001h6951J0001h6951J000102LJ#700000000000000G00000
z00000000000002L0000100006000000002k8UO$Q0002k8UO$Q0000D0000000000
z00000000040000000000000000002R00001000020000000000AOHXW00000AOHXW
z0002>000000000000000000080000000000000000002Z0000100002000000002^
zAOHXW0002^AOHXW00017000000000000000000040000000000000000002n00001
z000020000000013ApigX00013ApigX0001}0RR910000000000000080000000000
z000000002x0000E00003000000002sJOBUy0002sEC2ui00008000000000000000
z000080000000008000000002-0000F00003000000002!JOBUy0002!EC2ui00008
z000000000000000000080000000008000000002}0000600003000000002+JOBUy
z0002+EC2ui000000ssI2000070000000008000000000G00000000210000100003
z000000002+J^%m!0002+E&u=k0000G0RR91000000000000008000000000800000
z000060RR92000030000000000KmY&$00000FaQ7m0000G00000000000000000008
z0000000000000000000C0RR9900003000000000WKmY&$0000GFaQ7m0000m00000
z00000000000000W0000000000000000000H0RR920000m0000000000000000000G
zFaQ7m0000h0000000000000000000100000000010000000001000020000000000
z00000000000000$FaQ7m0000m2><{90000T0000r00008000000000O0000000009
z00003000000000000000000000001RIRF3v0000)1poj500000000000000100000
z00000000000000H00003000000000000000000000002AJ^%m!0000Q0RR9100000
a00000000010000000000000000000YHG`f2
literal 0
KcmV+b0RR6000031
--
2.25.1
More information about the amd-gfx
mailing list