drm/i915/display: Fixed the main link lost in MST (rev6)
Please Ignore the last message. Hi, may I know the status of this change? What is the next steps? Thanks, Gareth
[PATCH v2 12/21] drm/i915/dp: Use check link state work in the detect handler
A bad link in MST is not retrained. Please also consider MST. The issue ticket is https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/10902. if (intel_dp->is_mst) { /* * If we are in MST mode then this connector * won't appear connected or have anything * with EDID on it */ status = connector_status_disconnected; goto out; } /* * Some external monitors do not signal loss of link synchronization * with an IRQ_HPD, so force a link status check. */ if (!intel_dp_is_edp(intel_dp)) { ret = intel_dp_retrain_link(encoder, ctx); if (ret) return ret; }
[PATCH v2 12/21] drm/i915/dp: Use check link state work in the detect handler
A bad link in MST is not retrained. Please also consider MST. The issue ticket is https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/10902. if (intel_dp->is_mst) { /* * If we are in MST mode then this connector * won't appear connected or have anything * with EDID on it */ status = connector_status_disconnected; goto out; } /* * Some external monitors do not signal loss of link synchronization * with an IRQ_HPD, so force a link status check. */ if (!intel_dp_is_edp(intel_dp)) { ret = intel_dp_retrain_link(encoder, ctx); if (ret) return ret; }
[PATCH] drm/i915/display: Fixed the main link lost in MST
From: Gareth Yu Re-train the main link for the main link lost in MST. The previous version doesn't cover MST mode. v5: Move link status check to the location which covers MST mode v6: Correct Tejas' email address in cc Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/10902 Cc: Tejas Upadhyay Cc: Matt Roper Cc: Ville Syrjälä Signed-off-by: Gareth Yu --- drivers/gpu/drm/i915/display/intel_dp.c | 20 ++-- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c index e05e25cd4a94..8043740b4233 100644 --- a/drivers/gpu/drm/i915/display/intel_dp.c +++ b/drivers/gpu/drm/i915/display/intel_dp.c @@ -5891,16 +5891,6 @@ intel_dp_detect(struct drm_connector *connector, intel_dp_print_rates(intel_dp); - if (intel_dp->is_mst) { - /* -* If we are in MST mode then this connector -* won't appear connected or have anything -* with EDID on it -*/ - status = connector_status_disconnected; - goto out; - } - /* * Some external monitors do not signal loss of link synchronization * with an IRQ_HPD, so force a link status check. @@ -5911,6 +5901,16 @@ intel_dp_detect(struct drm_connector *connector, return ret; } + if (intel_dp->is_mst) { + /* +* If we are in MST mode then this connector +* won't appear connected or have anything +* with EDID on it +*/ + status = connector_status_disconnected; + goto out; + } + /* * Clearing NACK and defer counts to get their exact values * while reading EDID which are required by Compliance tests -- 2.25.1
[PATCH] drm/i915/display: Fixed the main link lost in MST
From: Gareth Yu Re-train the main link for the main link lost in MST. The previous version doesn't cover MST mode. v5: Move link status check to the location which covers MST mode Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/10902 Cc: Tejas Upadhyay Cc: Matt Roper Cc: Ville Syrjälä Signed-off-by: Gareth Yu --- drivers/gpu/drm/i915/display/intel_dp.c | 20 ++-- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c index e05e25cd4a94..8043740b4233 100644 --- a/drivers/gpu/drm/i915/display/intel_dp.c +++ b/drivers/gpu/drm/i915/display/intel_dp.c @@ -5891,16 +5891,6 @@ intel_dp_detect(struct drm_connector *connector, intel_dp_print_rates(intel_dp); - if (intel_dp->is_mst) { - /* -* If we are in MST mode then this connector -* won't appear connected or have anything -* with EDID on it -*/ - status = connector_status_disconnected; - goto out; - } - /* * Some external monitors do not signal loss of link synchronization * with an IRQ_HPD, so force a link status check. @@ -5911,6 +5901,16 @@ intel_dp_detect(struct drm_connector *connector, return ret; } + if (intel_dp->is_mst) { + /* +* If we are in MST mode then this connector +* won't appear connected or have anything +* with EDID on it +*/ + status = connector_status_disconnected; + goto out; + } + /* * Clearing NACK and defer counts to get their exact values * while reading EDID which are required by Compliance tests -- 2.25.1
[PATCH] drm/i915/display: Fixed the main link lost in MST
From: Gareth Yu Re-train the main link when the sink asserts a HPD for the main lnk lost. v4: detect the main link state by intel_dp_needs_link_retrain instead of intel_dp_mst_link_status because the main link state can't detect correctly sometimes by intel_dp_mst_link_status Cc : Tejas Upadhyay Cc : Matt Roper Cc : Ville Syrjälä Signed-off-by: Gareth Yu --- drivers/gpu/drm/i915/display/intel_dp.c | 8 +++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c index e05e25cd4a94..e1b60303b256 100644 --- a/drivers/gpu/drm/i915/display/intel_dp.c +++ b/drivers/gpu/drm/i915/display/intel_dp.c @@ -5849,8 +5849,14 @@ intel_dp_detect(struct drm_connector *connector, /* Can't disconnect eDP */ if (intel_dp_is_edp(intel_dp)) status = edp_detect(intel_dp); - else if (intel_digital_port_connected(encoder)) + else if (intel_digital_port_connected(encoder)) { status = intel_dp_detect_dpcd(intel_dp); + if (status == connector_status_connected && intel_dp->is_mst && + intel_dp_needs_link_retrain(intel_dp)) { + if (intel_dp_retrain_link(encoder, ctx)) + status = connector_status_disconnected; + } + } else status = connector_status_disconnected; -- 2.25.1
[PATCH] drm/i915/display: Fixed HDMI can't show up behind a USB-C dock station
From: Gareth Yu Re-train the main link once HPD happens without link status Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/10902 Cc : Tejas Upadhyay Cc : Matt Roper Cc : Ville Syrjälä Signed-off-by: Gareth Yu --- drivers/gpu/drm/i915/display/intel_dp.c | 7 ++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c index e05e25cd4a94..52ab549e6d08 100644 --- a/drivers/gpu/drm/i915/display/intel_dp.c +++ b/drivers/gpu/drm/i915/display/intel_dp.c @@ -5849,8 +5849,13 @@ intel_dp_detect(struct drm_connector *connector, /* Can't disconnect eDP */ if (intel_dp_is_edp(intel_dp)) status = edp_detect(intel_dp); - else if (intel_digital_port_connected(encoder)) + else if (intel_digital_port_connected(encoder)) { status = intel_dp_detect_dpcd(intel_dp); + if (status == connector_status_connected && intel_dp->is_mst && + !intel_dp_mst_link_status(intel_dp)) + if (intel_dp_retrain_link(encoder, ctx)) + status = connector_status_disconnected; + } else status = connector_status_disconnected; -- 2.25.1
[PATCH] drm/i915/display: Fixed the main link lost in MST
From: Gareth Yu Re-train the main link when the sink asserts a HPD for the main lnk lost. Cc : Tejas Upadhyay Cc : Matt Roper Cc : Ville Syrjälä Signed-off-by: Gareth Yu --- drivers/gpu/drm/i915/display/intel_dp.c | 7 ++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c index e05e25cd4a94..db5d4fa8340b 100644 --- a/drivers/gpu/drm/i915/display/intel_dp.c +++ b/drivers/gpu/drm/i915/display/intel_dp.c @@ -5849,8 +5849,13 @@ intel_dp_detect(struct drm_connector *connector, /* Can't disconnect eDP */ if (intel_dp_is_edp(intel_dp)) status = edp_detect(intel_dp); - else if (intel_digital_port_connected(encoder)) + else if (intel_digital_port_connected(encoder)) { status = intel_dp_detect_dpcd(intel_dp); + if (status == connector_status_connected && intel_dp->is_mst && + !intel_dp_mst_link_status(intel_dp)) + if (intel_dp_retrain_link(encoder, ctx)) + status = connector_status_disconnected; + } else status = connector_status_disconnected; -- 2.25.1
[PATCH] drm/i915/display: Fixed the main link lost in MST
From: Gareth Yu Re-train the main link when the sink asserts a HPD for the main lnk lost. Cc : Tejas Upadhyay Cc : Matt Roper Cc : Ville Syrjälä Signed-off-by: Gareth Yu --- drivers/gpu/drm/i915/display/intel_dp.c | 7 ++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c index e05e25cd4a94..db5d4fa8340b 100644 --- a/drivers/gpu/drm/i915/display/intel_dp.c +++ b/drivers/gpu/drm/i915/display/intel_dp.c @@ -5849,8 +5849,13 @@ intel_dp_detect(struct drm_connector *connector, /* Can't disconnect eDP */ if (intel_dp_is_edp(intel_dp)) status = edp_detect(intel_dp); - else if (intel_digital_port_connected(encoder)) + else if (intel_digital_port_connected(encoder)) { status = intel_dp_detect_dpcd(intel_dp); + if (status == connector_status_connected && intel_dp->is_mst && + !intel_dp_mst_link_status(intel_dp)) + if (intel_dp_retrain_link(encoder, ctx)) + status = connector_status_disconnected; + } else status = connector_status_disconnected; -- 2.25.1
[PATCH] drm/i915/display: Fixed a screen flickering when turning on display from off
From: Gareth Yu Turn on the panel from zero brightness of the last state, the panel was set a maximum PWM in the flow. Once the panel initialization is completed, the backlight is restored to xero brightness. There is a flckering generated. This flicker happens in "Screen dimming and power off" of Google's design and resume from sleep. The sample of DMESG is below. (suspend) [53949.248875] i915 :00:02.0: [drm:intel_edp_backlight_off] [53949.452046] i915 :00:02.0: [drm:intel_backlight_set_pwm_level] set backlight PWM = 0 (wakeup) [53986.067356] i915 :00:02.0: [drm:intel_edp_backlight_on] [53986.067367] i915 :00:02.0: [drm:intel_backlight_enable] pipe A [53986.067476] i915 :00:02.0: [drm:intel_backlight_set_pwm_level] set backlight PWM = 96000 [53986.119766] backlight intel_backlight: PM: calling backlight_resume+0x0/0x7a @ 4916, parent: card0-eDP-1 [53986.119781] backlight intel_backlight: PM: backlight_resume+0x0/0x7a returned 0 after 0 usecs [53986.220068] [drm:intel_backlight_device_update_status] updating intel_backlight, brightness=26321/96000 [53986.220086] i915 :00:02.0: [drm:intel_panel_actually_set_backlight] set backlight level = 27961 Set the brightness to the minimum value when the new brightness is less or equal to the minimum value to mitigate this flickering. Cc : Tejas Upadhyay Cc : Matt Roper Cc : Ville Syrjälä Signed-off-by: Gareth Yu --- drivers/gpu/drm/i915/display/intel_backlight.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_backlight.c b/drivers/gpu/drm/i915/display/intel_backlight.c index 3f3cd944a1c5..23fd011b6bfb 100644 --- a/drivers/gpu/drm/i915/display/intel_backlight.c +++ b/drivers/gpu/drm/i915/display/intel_backlight.c @@ -761,8 +761,8 @@ static void __intel_backlight_enable(const struct intel_crtc_state *crtc_state, WARN_ON(panel->backlight.max == 0); - if (panel->backlight.level <= panel->backlight.min) { - panel->backlight.level = panel->backlight.max; + if (panel->backlight.level < panel->backlight.min) { + panel->backlight.level = panel->backlight.min; if (panel->backlight.device) panel->backlight.device->props.brightness = scale_hw_to_user(connector, -- 2.25.1
[PATCH] drm/i915/display: Fixed a screen flickering when turning on display from off
From: Gareth Yu Turn on the panel from zero brightness of the last state, the panel was set a maximum PWM in the flow. Once the panel initialization is completed, the backlight is restored to xero brightness. There is a flckering generated. This flicker happens in "Screen dimming and power off" of Google's design and resume from sleep. The sample of DMESG is below. (suspend) [53949.248875] i915 :00:02.0: [drm:intel_edp_backlight_off] [53949.452046] i915 :00:02.0: [drm:intel_backlight_set_pwm_level] set backlight PWM = 0 (wakeup) [53986.067356] i915 :00:02.0: [drm:intel_edp_backlight_on] [53986.067367] i915 :00:02.0: [drm:intel_backlight_enable] pipe A [53986.067476] i915 :00:02.0: [drm:intel_backlight_set_pwm_level] set backlight PWM = 96000 [53986.119766] backlight intel_backlight: PM: calling backlight_resume+0x0/0x7a @ 4916, parent: card0-eDP-1 [53986.119781] backlight intel_backlight: PM: backlight_resume+0x0/0x7a returned 0 after 0 usecs [53986.220068] [drm:intel_backlight_device_update_status] updating intel_backlight, brightness=26321/96000 [53986.220086] i915 :00:02.0: [drm:intel_panel_actually_set_backlight] set backlight level = 27961 Set the brightness to the minimum value when the brightness is less or equal to the minimum value to mitigate this flickering. Cc : Tejas Upadhyay Cc : Matt Roper Cc : Ville Syrjälä Signed-off-by: Gareth Yu --- drivers/gpu/drm/i915/display/intel_backlight.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/drm/i915/display/intel_backlight.c b/drivers/gpu/drm/i915/display/intel_backlight.c index 3f3cd944a1c5..1cfac72aacc6 100644 --- a/drivers/gpu/drm/i915/display/intel_backlight.c +++ b/drivers/gpu/drm/i915/display/intel_backlight.c @@ -761,7 +761,7 @@ static void __intel_backlight_enable(const struct intel_crtc_state *crtc_state, WARN_ON(panel->backlight.max == 0); - if (panel->backlight.level <= panel->backlight.min) { + if (panel->backlight.level < panel->backlight.min) { panel->backlight.level = panel->backlight.max; if (panel->backlight.device) panel->backlight.device->props.brightness = -- 2.25.1
[PATCH] drm/i915/display: Fixed a screen flickering when turning on display from off
From: Gareth Yu Turn on the panel from zero brightness of the last state, the panel was set a maximum PWM in the flow. Once the panel initialization is completed, the backlight is restored to xero brightness. There is a flckering generated. This flicker happens in "Screen dimming and power off" of Google's design and resume from sleep. The sample of DMESG is below. (suspend) [53949.248875] i915 :00:02.0: [drm:intel_edp_backlight_off] [53949.452046] i915 :00:02.0: [drm:intel_backlight_set_pwm_level] set backlight PWM = 0 (wakeup) [53986.067356] i915 :00:02.0: [drm:intel_edp_backlight_on] [53986.067367] i915 :00:02.0: [drm:intel_backlight_enable] pipe A [53986.067476] i915 :00:02.0: [drm:intel_backlight_set_pwm_level] set backlight PWM = 96000 [53986.119766] backlight intel_backlight: PM: calling backlight_resume+0x0/0x7a @ 4916, parent: card0-eDP-1 [53986.119781] backlight intel_backlight: PM: backlight_resume+0x0/0x7a returned 0 after 0 usecs [53986.220068] [drm:intel_backlight_device_update_status] updating intel_backlight, brightness=26321/96000 [53986.220086] i915 :00:02.0: [drm:intel_panel_actually_set_backlight] set backlight level = 27961 Set the brightness to the minimum value when the brightness is less or equal to the minimum value to mitigate this flickering. Cc : Tejas Upadhyay Cc : Matt Roper Cc : Ville Syrjälä Signed-off-by: Gareth Yu --- drivers/gpu/drm/i915/display/intel_backlight.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/drm/i915/display/intel_backlight.c b/drivers/gpu/drm/i915/display/intel_backlight.c index 3f3cd944a1c5..c7a314b624fc 100644 --- a/drivers/gpu/drm/i915/display/intel_backlight.c +++ b/drivers/gpu/drm/i915/display/intel_backlight.c @@ -761,7 +761,7 @@ static void __intel_backlight_enable(const struct intel_crtc_state *crtc_state, WARN_ON(panel->backlight.max == 0); - if (panel->backlight.level <= panel->backlight.min) { + if (panel->backlight.level == 0) { panel->backlight.level = panel->backlight.max; if (panel->backlight.device) panel->backlight.device->props.brightness = -- 2.25.1
[PATCH] drm/i915/display: Fixed a screen flickering when turning on display from off
From: Gareth Yu Turn on the panel from zero brightness of the last state, the panel was set a maximum PWM in the flow. Once the panel initialization is completed, the backlight is restored to xero brightness. There is a flckering generated. This flicker happens in "Screen dimming and power off" of Google's design and resume from sleep. The sample of DMESG is below. (suspend) [53949.248875] i915 :00:02.0: [drm:intel_edp_backlight_off] [53949.452046] i915 :00:02.0: [drm:intel_backlight_set_pwm_level] set backlight PWM = 0 (wakeup) [53986.067356] i915 :00:02.0: [drm:intel_edp_backlight_on] [53986.067367] i915 :00:02.0: [drm:intel_backlight_enable] pipe A [53986.067476] i915 :00:02.0: [drm:intel_backlight_set_pwm_level] set backlight PWM = 96000 [53986.119766] backlight intel_backlight: PM: calling backlight_resume+0x0/0x7a @ 4916, parent: card0-eDP-1 [53986.119781] backlight intel_backlight: PM: backlight_resume+0x0/0x7a returned 0 after 0 usecs [53986.220068] [drm:intel_backlight_device_update_status] updating intel_backlight, brightness=26321/96000 [53986.220086] i915 :00:02.0: [drm:intel_panel_actually_set_backlight] set backlight level = 27961 Set the brightness to the minimum value when the brightness is less or equal to the minimum value to mitigate this flickering. Cc : Tejas Upadhyay Cc : Matt Roper Cc : Ville Syrjälä Signed-off-by: Gareth Yu --- drivers/gpu/drm/i915/display/intel_backlight.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/drm/i915/display/intel_backlight.c b/drivers/gpu/drm/i915/display/intel_backlight.c index 3f3cd944a1c5..855d6ead905c 100644 --- a/drivers/gpu/drm/i915/display/intel_backlight.c +++ b/drivers/gpu/drm/i915/display/intel_backlight.c @@ -762,7 +762,7 @@ static void __intel_backlight_enable(const struct intel_crtc_state *crtc_state, WARN_ON(panel->backlight.max == 0); if (panel->backlight.level <= panel->backlight.min) { - panel->backlight.level = panel->backlight.max; + panel->backlight.level = panel->backlight.min; if (panel->backlight.device) panel->backlight.device->props.brightness = scale_hw_to_user(connector, -- 2.25.1
[PATCH] drm/i915/display: Fixed a screen flickering when turning on display from off
From: Gareth Yu Turn on the panel from zero brightness of the last state, the panel was set a maximum PWM in the flow. Once the panel initialization is completed, the backlight is restored to zero brightness. There is a flckering generated. Set the brightness to the minimum value when the brightness is less or equal to the minimum value to fix this flickering Cc : Tejas Upadhyay Cc : Matt Roper Cc : Ville Syrjälä Signed-off-by: Gareth Yu --- drivers/gpu/drm/i915/display/intel_backlight.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/drm/i915/display/intel_backlight.c b/drivers/gpu/drm/i915/display/intel_backlight.c index 3f3cd944a1c5..855d6ead905c 100644 --- a/drivers/gpu/drm/i915/display/intel_backlight.c +++ b/drivers/gpu/drm/i915/display/intel_backlight.c @@ -762,7 +762,7 @@ static void __intel_backlight_enable(const struct intel_crtc_state *crtc_state, WARN_ON(panel->backlight.max == 0); if (panel->backlight.level <= panel->backlight.min) { - panel->backlight.level = panel->backlight.max; + panel->backlight.level = panel->backlight.min; if (panel->backlight.device) panel->backlight.device->props.brightness = scale_hw_to_user(connector, -- 2.25.1
[Intel-gfx] [PATCH] drm/i915/mtl: Print SSEU information of all GTs for debugfs
Print another SSEU information addition to the first one. Cc : Tejas Upadhyay Cc : Matt Roper Cc : Ville Syrjälä Signed-off-by: Gareth Yu --- drivers/gpu/drm/i915/i915_debugfs.c | 13 ++--- drivers/gpu/drm/i915/i915_gpu_error.c | 6 +- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c index e9b79c2c37d8..b5914a2c0597 100644 --- a/drivers/gpu/drm/i915/i915_debugfs.c +++ b/drivers/gpu/drm/i915/i915_debugfs.c @@ -63,13 +63,16 @@ static int i915_capabilities(struct seq_file *m, void *data) { struct drm_i915_private *i915 = node_to_i915(m->private); struct drm_printer p = drm_seq_file_printer(m); + struct intel_gt *gt; + unsigned int i; seq_printf(m, "pch: %d\n", INTEL_PCH_TYPE(i915)); intel_device_info_print(INTEL_INFO(i915), RUNTIME_INFO(i915), ); intel_display_device_info_print(DISPLAY_INFO(i915), DISPLAY_RUNTIME_INFO(i915), ); i915_print_iommu_status(i915, ); - intel_gt_info_print(_gt(i915)->info, ); + for_each_gt(gt, i915, i) + intel_gt_info_print(>info, ); intel_driver_caps_print(>caps, ); kernel_param_lock(THIS_MODULE); @@ -783,9 +786,13 @@ DEFINE_SIMPLE_ATTRIBUTE(i915_drop_caches_fops, static int i915_sseu_status(struct seq_file *m, void *unused) { struct drm_i915_private *i915 = node_to_i915(m->private); - struct intel_gt *gt = to_gt(i915); + struct intel_gt *gt; + unsigned int i; + + for_each_gt(gt, i915, i) + intel_sseu_status(m, gt); - return intel_sseu_status(m, gt); + return 0; } static int i915_forcewake_open(struct inode *inode, struct file *file) diff --git a/drivers/gpu/drm/i915/i915_gpu_error.c b/drivers/gpu/drm/i915/i915_gpu_error.c index b4e31e59c799..2adc317af944 100644 --- a/drivers/gpu/drm/i915/i915_gpu_error.c +++ b/drivers/gpu/drm/i915/i915_gpu_error.c @@ -722,9 +722,13 @@ static void err_print_gt_info(struct drm_i915_error_state_buf *m, struct intel_gt_coredump *gt) { struct drm_printer p = i915_error_printer(m); + struct drm_i915_private *i915 = gt->_gt->i915; + struct intel_gt *gt_n; + unsigned int n; intel_gt_info_print(>info, ); - intel_sseu_print_topology(gt->_gt->i915, >info.sseu, ); + for_each_gt(gt_n, i915, n) + intel_sseu_print_topology(gt_n->i915, _n->info.sseu, ); } static void err_print_gt_display(struct drm_i915_error_state_buf *m, -- 2.42.0.rc0.25.ga82fb66fed