drm/amd/powerplay: correct the clocks for DAL to be Khz unit
Subsystems (2)
PATCH 1/2 drm/amd/powerplay: correct the clocks for DAL to be Khz unit
Currently the clocks reported are in 10Khz unit. Correct them as Khz unit as DAL wanted.
--- .../drm/amd/powerplay/hwmgr/vega20_hwmgr.c | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-)
drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c +10 -11
@@ -2012,7 +2012,6 @@ int vega20_display_clock_voltage_request(struct pp_hwmgr *hwmgr,if (data->smu_features[GNLD_DPM_DCEFCLK ].enabled) {switch (clk_type) {case amd_pp_dcef_clock: - clk_freq = clock_req->clock_freq_in_khz /100 ; clk_select =PPCLK_DCEFCLK ;break ;case amd_pp_disp_clock:
@@ -2072,7 +2071,7 @@ static int vega20_notify_smc_display_config_after_ps_adjustment( if (data->smu_features[GNLD_DPM_DCEFCLK].supported) { clock_req.clock_type = amd_pp_dcef_clock; - clock_req.clock_freq_in_khz = min_clocks.dcefClock; + clock_req.clock_freq_in_khz = min_clocks.dcefClock * 10; if (!vega20_display_clock_voltage_request(hwmgr, &clock_req)) { if (data->smu_features[GNLD_DS_DCEFCLK].supported) PP_ASSERT_WITH_CODE((ret = smum_send_msg_to_smc_with_parameter(
@@ -2371,7 +2370,7 @@ static int vega20_get_sclks(struct pp_hwmgr *hwmgr,for (i =0 ; i < count; i++) { clocks->data[i].clocks_in_khz = - dpm_table->dpm_levels[i].value *100 ; + dpm_table->dpm_levels[i].value *1000 ; clocks->data[i].latency_in_us =0 ; }
@@ -2401,7 +2400,7 @@ static int vega20_get_memclocks(struct pp_hwmgr *hwmgr,for (i =0 ; i < count; i++) { clocks->data[i].clocks_in_khz = data->mclk_latency_table.entries[i].frequency = - dpm_table->dpm_levels[i].value *100 ; + dpm_table->dpm_levels[i].value *1000 ; clocks->data[i].latency_in_us = data->mclk_latency_table.entries[i].latency =vega20_get_mem_latency (hwmgr, dpm_table->dpm_levels[i].value);
@@ -2426,7 +2425,7 @@ static int vega20_get_dcefclocks(struct pp_hwmgr *hwmgr,for (i =0 ; i < count; i++) { clocks->data[i].clocks_in_khz = - dpm_table->dpm_levels[i].value *100 ; + dpm_table->dpm_levels[i].value *1000 ; clocks->data[i].latency_in_us =0 ; }
@@ -2449,7 +2448,7 @@ static int vega20_get_socclocks(struct pp_hwmgr *hwmgr,for (i =0 ; i < count; i++) { clocks->data[i].clocks_in_khz = - dpm_table->dpm_levels[i].value *100 ; + dpm_table->dpm_levels[i].value *1000 ; clocks->data[i].latency_in_us =0 ; }
@@ -2600,11 +2599,11 @@ static int vega20_odn_edit_dpm_table(struct pp_hwmgr *hwmgr,return -EINVAL ; } -if (input_clk < clocks.data[0 ].clocks_in_khz /100 || +if (input_clk < clocks.data[0 ].clocks_in_khz /1000 || input_clk > od8_settings[OD8_SETTING_UCLK_FMAX ].max_value) {pr_info ("clock freq %d is not within allowed range [%d - %d]\n" , input_clk, - clocks.data[0 ].clocks_in_khz /100 , + clocks.data[0 ].clocks_in_khz /1000 , od8_settings[OD8_SETTING_UCLK_FMAX ].max_value);return -EINVAL ; }
@@ -2756,7 +2755,7 @@ static int vega20_print_clock_levels(struct pp_hwmgr *hwmgr,for (i =0 ; i < clocks.num_levels; i++) size +=sprintf (buf + size,"%d: %uMhz %s\n" , - i, clocks.data[i].clocks_in_khz /100 , + i, clocks.data[i].clocks_in_khz /1000 , (clocks.data[i].clocks_in_khz == now) ?"*" :"" );break ;
@@ -2773,7 +2772,7 @@ static int vega20_print_clock_levels(struct pp_hwmgr *hwmgr,for (i =0 ; i < clocks.num_levels; i++) size +=sprintf (buf + size,"%d: %uMhz %s\n" , - i, clocks.data[i].clocks_in_khz /100 , + i, clocks.data[i].clocks_in_khz /1000 , (clocks.data[i].clocks_in_khz == now) ?"*" :"" );break ;
@@ -2838,7 +2837,7 @@ static int vega20_print_clock_levels(struct pp_hwmgr *hwmgr, return ret); size +=sprintf (buf + size,"MCLK: %7uMhz %10uMhz\n" , - clocks.data[0 ].clocks_in_khz /100 , + clocks.data[0 ].clocks_in_khz /1000 , od8_settings[OD8_SETTING_UCLK_FMAX ].max_value); }
Signature · 6 lines
2.19.1 _______________________________________________ amd-gfx mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/amd-gfx
A message that is not in the archive (sent off-list or not yet received): [email protected]
PATCH 2/2 drm/amd/powerplay: commonize the API for retrieving current clocks
So that it can be shared between all clocks.
--- .../drm/amd/powerplay/hwmgr/vega20_hwmgr.c | 44 +++++++------------ 1 file changed, 15 insertions(+), 29 deletions(-)
drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c +15 -29
@@ -1875,38 +1875,20 @@ static int vega20_get_gpu_power(struct pp_hwmgr *hwmgr,return ret; } -static int vega20_get_current_gfx_clk_freq (struct pp_hwmgr *hwmgr,uint32_t *gfx_freq) +static int vega20_get_current_clk_freq (struct pp_hwmgr *hwmgr, +PPCLK_e clk_id,uint32_t *clk_freq) { -uint32_t gfx_clk =0 ;int ret =0 ; - *gfx_freq =0 ; + *clk_freq =0 ;PP_ASSERT_WITH_CODE ((ret =smum_send_msg_to_smc_with_parameter (hwmgr, - PPSMC_MSG_GetDpmClockFreq, (PPCLK_GFXCLK <<16 ))) ==0 , -"[GetCurrentGfxClkFreq] Attempt to get Current GFXCLK Frequency Failed!" , + PPSMC_MSG_GetDpmClockFreq, (clk_id <<16 ))) ==0 , +"[GetCurrentClkFreq] Attempt to get Current Frequency Failed!" , return ret); - gfx_clk =smum_get_argument (hwmgr); + *clk_freq =smum_get_argument (hwmgr); - *gfx_freq = gfx_clk *100 ; - -return 0 ; -} - -static int vega20_get_current_mclk_freq (struct pp_hwmgr *hwmgr,uint32_t *mclk_freq) -{ -uint32_t mem_clk =0 ; -int ret =0 ; - - *mclk_freq =0 ; - -PP_ASSERT_WITH_CODE ((ret =smum_send_msg_to_smc_with_parameter (hwmgr, - PPSMC_MSG_GetDpmClockFreq, (PPCLK_UCLK <<16 ))) ==0 , -"[GetCurrentMClkFreq] Attempt to get Current MCLK Frequency Failed!" , - return ret); - mem_clk =smum_get_argument (hwmgr); - - *mclk_freq = mem_clk *100 ; + *clk_freq = *clk_freq *100 ;return 0 ; }
@@ -1937,12 +1919,16 @@ static int vega20_read_sensor(struct pp_hwmgr *hwmgr, int idx,switch (idx) {case AMDGPU_PP_SENSOR_GFX_SCLK : - ret =vega20_get_current_gfx_clk_freq (hwmgr, (uint32_t *)value); + ret =vega20_get_current_clk_freq (hwmgr, +PPCLK_GFXCLK , + (uint32_t *)value);if (!ret) *size =4 ;break ;case AMDGPU_PP_SENSOR_GFX_MCLK : - ret =vega20_get_current_mclk_freq (hwmgr, (uint32_t *)value); + ret =vega20_get_current_clk_freq (hwmgr, +PPCLK_UCLK , + (uint32_t *)value);if (!ret) *size =4 ;break ;
@@ -2743,7 +2729,7 @@ static int vega20_print_clock_levels(struct pp_hwmgr *hwmgr,switch (type) {case PP_SCLK : - ret =vega20_get_current_gfx_clk_freq (hwmgr, &now); + ret =vega20_get_current_clk_freq (hwmgr,PPCLK_GFXCLK , &now);PP_ASSERT_WITH_CODE (!ret,"Attempt to get current gfx clk Failed!" , return ret);
@@ -2760,7 +2746,7 @@ static int vega20_print_clock_levels(struct pp_hwmgr *hwmgr,break ;case PP_MCLK : - ret =vega20_get_current_mclk_freq (hwmgr, &now); + ret =vega20_get_current_clk_freq (hwmgr,PPCLK_UCLK , &now);PP_ASSERT_WITH_CODE (!ret,"Attempt to get current mclk freq Failed!" , return ret);
Signature · 6 lines
2.19.1 _______________________________________________ amd-gfx mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/amd-gfx
A message that is not in the archive (sent off-list or not yet received): [email protected]
Xu, Feifei
Reviewed-by Feifei XuRE: [PATCH 2/2] drm/amd/powerplay: commonize the API for retrieving current clocks
Regards,
Feifei
-----Original Message-----
From: amd-gfx <[email protected]> On Behalf Of Evan Quan
Sent: 2018年10月24日 16:09
To: [email protected]
Cc: Quan, Evan <[email protected]>
Subject: [PATCH 2/2] drm/amd/powerplay: commonize the API for retrieving current clocks
So that it can be shared between all clocks.
--- .../drm/amd/powerplay/hwmgr/vega20_hwmgr.c | 44 +++++++------------ 1 file changed, 15 insertions(+), 29 deletions(-)
drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c +15 -28
@@ -1875,38 +1875,20 @@ static int vega20_get_gpu_power(struct pp_hwmgr *hwmgr,return ret; } -static int vega20_get_current_gfx_clk_freq (struct pp_hwmgr *hwmgr,uint32_t *gfx_freq) +static int vega20_get_current_clk_freq (struct pp_hwmgr *hwmgr, +PPCLK_e clk_id,uint32_t *clk_freq) { -uint32_t gfx_clk =0 ;int ret =0 ; - *gfx_freq =0 ; + *clk_freq =0 ;PP_ASSERT_WITH_CODE ((ret =smum_send_msg_to_smc_with_parameter (hwmgr, - PPSMC_MSG_GetDpmClockFreq, (PPCLK_GFXCLK <<16 ))) ==0 , -"[GetCurrentGfxClkFreq] Attempt to get Current GFXCLK Frequency Failed!" , + PPSMC_MSG_GetDpmClockFreq, (clk_id <<16 ))) ==0 , +"[GetCurrentClkFreq] Attempt to get Current Frequency Failed!" , return ret); - gfx_clk =smum_get_argument (hwmgr); + *clk_freq =smum_get_argument (hwmgr); - *gfx_freq = gfx_clk *100 ; - -return 0 ; -} - -static int vega20_get_current_mclk_freq(struct pp_hwmgr *hwmgr, uint32_t *mclk_freq) -{ -uint32_t mem_clk =0 ; -int ret =0 ; - - *mclk_freq =0 ; - -PP_ASSERT_WITH_CODE ((ret =smum_send_msg_to_smc_with_parameter (hwmgr, - PPSMC_MSG_GetDpmClockFreq, (PPCLK_UCLK <<16 ))) ==0 , -"[GetCurrentMClkFreq] Attempt to get Current MCLK Frequency Failed!" , - return ret); - mem_clk =smum_get_argument (hwmgr); - - *mclk_freq = mem_clk *100 ; + *clk_freq = *clk_freq *100 ;return 0 ; }
@@ -1937,12 +1919,16 @@ static int vega20_read_sensor(struct pp_hwmgr *hwmgr, int idx,switch (idx) {case AMDGPU_PP_SENSOR_GFX_SCLK : - ret =vega20_get_current_gfx_clk_freq (hwmgr, (uint32_t *)value); + ret =vega20_get_current_clk_freq (hwmgr, +PPCLK_GFXCLK , + (uint32_t *)value);if (!ret) *size =4 ;break ;case AMDGPU_PP_SENSOR_GFX_MCLK : - ret =vega20_get_current_mclk_freq (hwmgr, (uint32_t *)value); + ret =vega20_get_current_clk_freq (hwmgr, +PPCLK_UCLK , + (uint32_t *)value);if (!ret) *size =4 ;break ;
@@ -2743,7 +2729,7 @@ static int vega20_print_clock_levels(struct pp_hwmgr *hwmgr,switch (type) {case PP_SCLK : - ret =vega20_get_current_gfx_clk_freq (hwmgr, &now); + ret =vega20_get_current_clk_freq (hwmgr,PPCLK_GFXCLK , &now);PP_ASSERT_WITH_CODE (!ret,"Attempt to get current gfx clk Failed!" , return ret);
@@ -2760,7 +2746,7 @@ static int vega20_print_clock_levels(struct pp_hwmgr *hwmgr,break ;case PP_MCLK : - ret =vega20_get_current_mclk_freq (hwmgr, &now); + ret =vega20_get_current_clk_freq (hwmgr,PPCLK_UCLK , &now);PP_ASSERT_WITH_CODE (!ret,"Attempt to get current mclk freq Failed!" , return ret);
--
2.19.1
_______________________________________________
amd-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
_______________________________________________
amd-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
Zhu, Rex
Reviewed-byRe: [PATCH 2/2] drm/amd/powerplay: commonize the API for retrieving current clocks
In reply to a message not in the archiveSeries is:
Best Regards
Rex
________________________________
From: amd-gfx <amd-gfx-bounces-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org> on behalf of Evan Quan <[email protected]>
Sent: Wednesday, October 24, 2018 4:09 PM
To: [email protected]
Cc: Quan, Evan
Subject: [PATCH 2/2] drm/amd/powerplay: commonize the API for retrieving current clocks
So that it can be shared between all clocks.
--- .../drm/amd/powerplay/hwmgr/vega20_hwmgr.c | 44 +++++++------------ 1 file changed, 15 insertions(+), 29 deletions(-)
drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c +15 -29
@@ -1875,38 +1875,20 @@ static int vega20_get_gpu_power(struct pp_hwmgr *hwmgr,return ret; } -static int vega20_get_current_gfx_clk_freq (struct pp_hwmgr *hwmgr,uint32_t *gfx_freq) +static int vega20_get_current_clk_freq (struct pp_hwmgr *hwmgr, +PPCLK_e clk_id,uint32_t *clk_freq) { -uint32_t gfx_clk =0 ;int ret =0 ; - *gfx_freq =0 ; + *clk_freq =0 ;PP_ASSERT_WITH_CODE ((ret =smum_send_msg_to_smc_with_parameter (hwmgr, - PPSMC_MSG_GetDpmClockFreq, (PPCLK_GFXCLK <<16 ))) ==0 , -"[GetCurrentGfxClkFreq] Attempt to get Current GFXCLK Frequency Failed!" , + PPSMC_MSG_GetDpmClockFreq, (clk_id <<16 ))) ==0 , +"[GetCurrentClkFreq] Attempt to get Current Frequency Failed!" , return ret); - gfx_clk =smum_get_argument (hwmgr); + *clk_freq =smum_get_argument (hwmgr); - *gfx_freq = gfx_clk *100 ; - -return 0 ; -} - -static int vega20_get_current_mclk_freq (struct pp_hwmgr *hwmgr,uint32_t *mclk_freq) -{ -uint32_t mem_clk =0 ; -int ret =0 ; - - *mclk_freq =0 ; - -PP_ASSERT_WITH_CODE ((ret =smum_send_msg_to_smc_with_parameter (hwmgr, - PPSMC_MSG_GetDpmClockFreq, (PPCLK_UCLK <<16 ))) ==0 , -"[GetCurrentMClkFreq] Attempt to get Current MCLK Frequency Failed!" , - return ret); - mem_clk =smum_get_argument (hwmgr); - - *mclk_freq = mem_clk *100 ; + *clk_freq = *clk_freq *100 ;return 0 ; }
@@ -1937,12 +1919,16 @@ static int vega20_read_sensor(struct pp_hwmgr *hwmgr, int idx,switch (idx) {case AMDGPU_PP_SENSOR_GFX_SCLK : - ret =vega20_get_current_gfx_clk_freq (hwmgr, (uint32_t *)value); + ret =vega20_get_current_clk_freq (hwmgr, +PPCLK_GFXCLK , + (uint32_t *)value);if (!ret) *size =4 ;break ;case AMDGPU_PP_SENSOR_GFX_MCLK : - ret =vega20_get_current_mclk_freq (hwmgr, (uint32_t *)value); + ret =vega20_get_current_clk_freq (hwmgr, +PPCLK_UCLK , + (uint32_t *)value);if (!ret) *size =4 ;break ;
@@ -2743,7 +2729,7 @@ static int vega20_print_clock_levels(struct pp_hwmgr *hwmgr,switch (type) {case PP_SCLK : - ret =vega20_get_current_gfx_clk_freq (hwmgr, &now); + ret =vega20_get_current_clk_freq (hwmgr,PPCLK_GFXCLK , &now);PP_ASSERT_WITH_CODE (!ret,"Attempt to get current gfx clk Failed!" , return ret);
@@ -2760,7 +2746,7 @@ static int vega20_print_clock_levels(struct pp_hwmgr *hwmgr,break ;case PP_MCLK : - ret =vega20_get_current_mclk_freq (hwmgr, &now); + ret =vega20_get_current_clk_freq (hwmgr,PPCLK_UCLK , &now);PP_ASSERT_WITH_CODE (!ret,"Attempt to get current mclk freq Failed!" , return ret);
--
2.19.1
_______________________________________________
amd-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
amd-gfx Info Page - freedesktop.org<https://lists.freedesktop.org/mailman/listinfo/amd-gfx>
lists.freedesktop.org
To see the collection of prior postings to the list, visit the amd-gfx Archives.. Using amd-gfx: To post a message to all the list members, send email to [email protected] You can subscribe to the list, or change your existing subscription, in the sections below.
_______________________________________________
amd-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
Xu, Feifei
Reviewed-by Feifei XuRegards,
Feifei
-----Original Message-----
From: amd-gfx <[email protected]> On Behalf Of Evan Quan
Sent: 2018年10月24日 16:09
To: [email protected]
Cc: Quan, Evan <[email protected]>
Subject: [PATCH 1/2] drm/amd/powerplay: correct the clocks for DAL to be Khz unit
Currently the clocks reported are in 10Khz unit. Correct them as Khz unit as DAL wanted.
--- .../drm/amd/powerplay/hwmgr/vega20_hwmgr.c | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-)
drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c +3 -4
@@ -2012,7 +2012,6 @@ int vega20_display_clock_voltage_request(struct pp_hwmgr *hwmgr,if (data->smu_features[GNLD_DPM_DCEFCLK ].enabled) {switch (clk_type) {case amd_pp_dcef_clock: - clk_freq = clock_req->clock_freq_in_khz /100 ; clk_select =PPCLK_DCEFCLK ;break ;case amd_pp_disp_clock:
@@ -2072,7 +2071,7 @@ static int vega20_notify_smc_display_config_after_ps_adjustment( if (data->smu_features[GNLD_DPM_DCEFCLK].supported) { clock_req.clock_type = amd_pp_dcef_clock; - clock_req.clock_freq_in_khz = min_clocks.dcefClock; + clock_req.clock_freq_in_khz = min_clocks.dcefClock * 10; if (!vega20_display_clock_voltage_request(hwmgr, &clock_req)) { if (data->smu_features[GNLD_DS_DCEFCLK].supported) PP_ASSERT_WITH_CODE((ret = smum_send_msg_to_smc_with_parameter(
@@ -2371,7 +2370,7 @@ static int vega20_get_sclks(struct pp_hwmgr *hwmgr,for (i =0 ; i < count; i++) { clocks->data[i].clocks_in_khz = - dpm_table->dpm_levels[i].value *100 ; + dpm_table->dpm_levels[i].value *1000 ; clocks->data[i].latency_in_us =0 ; }
@@ -2401,7 +2400,7 @@ static int vega20_get_memclocks(struct pp_hwmgr *hwmgr,for (i =0 ; i < count; i++) { clocks->data[i].clocks_in_khz = data->mclk_latency_table.entries[i].frequency = - dpm_table->dpm_levels[i].value *100 ; + dpm_table->dpm_levels[i].value *1000 ; clocks->data[i].latency_in_us = data->mclk_latency_table.entries[i].latency = vega20_get_mem_latency(hwmgr, dpm_table->dpm_levels[i].value); @@ -2426,7 +2425,7 @@ static int vega20_get_dcefclocks(struct pp_hwmgr *hwmgr,
for (i = 0; i < count; i++) {
clocks->data[i].clocks_in_khz =
- dpm_table->dpm_levels[i].value * 100;
+ dpm_table->dpm_levels[i].value * 1000;
clocks->data[i].latency_in_us = 0;
}
@@ -2449,7 +2448,7 @@ static int vega20_get_socclocks(struct pp_hwmgr *hwmgr,
for (i = 0; i < count; i++) {
clocks->data[i].clocks_in_khz =
- dpm_table->dpm_levels[i].value * 100;
+ dpm_table->dpm_levels[i].value * 1000;
clocks->data[i].latency_in_us = 0;
}
@@ -2600,11 +2599,11 @@ static int vega20_odn_edit_dpm_table(struct pp_hwmgr *hwmgr,
return -EINVAL;
}
- if (input_clk < clocks.data[0].clocks_in_khz / 100 ||
+ if (input_clk < clocks.data[0].clocks_in_khz / 1000 ||
input_clk > od8_settings[OD8_SETTING_UCLK_FMAX].max_value) {
pr_info("clock freq %d is not within allowed range [%d - %d]\n",
input_clk,
- clocks.data[0].clocks_in_khz / 100,
+ clocks.data[0].clocks_in_khz / 1000,
od8_settings[OD8_SETTING_UCLK_FMAX].max_value);
return -EINVAL;
}
@@ -2756,7 +2755,7 @@ static int vega20_print_clock_levels(struct pp_hwmgr *hwmgr,
for (i = 0; i < clocks.num_levels; i++)
size += sprintf(buf + size, "%d: %uMhz %s\n",
- i, clocks.data[i].clocks_in_khz / 100,
+ i, clocks.data[i].clocks_in_khz / 1000,
(clocks.data[i].clocks_in_khz == now) ? "*" : "");
break;
@@ -2773,7 +2772,7 @@ static int vega20_print_clock_levels(struct pp_hwmgr *hwmgr,
for (i = 0; i < clocks.num_levels; i++)
size += sprintf(buf + size, "%d: %uMhz %s\n",
- i, clocks.data[i].clocks_in_khz / 100,
+ i, clocks.data[i].clocks_in_khz / 1000,
(clocks.data[i].clocks_in_khz == now) ? "*" : "");
break;
@@ -2838,7 +2837,7 @@ static int vega20_print_clock_levels(struct pp_hwmgr *hwmgr,
return ret);
size += sprintf(buf + size, "MCLK: %7uMhz %10uMhz\n",
- clocks.data[0].clocks_in_khz / 100,
+ clocks.data[0].clocks_in_khz / 1000,
od8_settings[OD8_SETTING_UCLK_FMAX].max_value);
}
--
2.19.1
_______________________________________________
amd-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
_______________________________________________
amd-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/amd-gfx