Skip to content

Commit a48fa7e

Browse files
committed
Merge tag 'drm-next-2023-09-08' of git://anongit.freedesktop.org/drm/drm
Pull drm fixes from Dave Airlie: "Regular rounds of rc1 fixes, a large bunch for amdgpu since it's three weeks in one go, one i915, one nouveau and one ivpu. I think there might be a few more fixes in misc that I haven't pulled in yet, but we should get them all for rc2. amdgpu: - Display replay fixes - Fixes for headless boards - Fix documentation breakage - RAS fixes - Handle newer IP discovery tables - SMU 13.0.6 fixes - SR-IOV fixes - Display vstartup fixes - NBIO 7.9 fixes - Display scaling mode fixes - Debugfs power reporting fix - GC 9.4.3 fixes - Dirty framebuffer fixes for fbcon - eDP fixes - DCN 3.1.5 fix - Display ODM fixes - GPU core dump fix - Re-enable zops property now that IGT test is fixed - Fix possible UAF in CS code - Cursor degamma fix amdkfd: - HMM fixes - Interrupt masking fix - GFX11 MQD fixes i915: - Mark requests for GuC virtual engines to avoid use-after-free nouveau: - Fix fence state in nouveau_fence_emit() ivpu: - replace strncpy" * tag 'drm-next-2023-09-08' of git://anongit.freedesktop.org/drm/drm: (51 commits) drm/amdgpu: Restrict bootloader wait to SMUv13.0.6 drm/amd/display: prevent potential division by zero errors drm/amd/display: enable cursor degamma for DCN3+ DRM legacy gamma drm/amd/display: limit the v_startup workaround to ASICs older than DCN3.1 Revert "drm/amd/display: Remove v_startup workaround for dcn3+" drm/amdgpu: fix amdgpu_cs_p1_user_fence Revert "Revert "drm/amd/display: Implement zpos property"" drm/amdkfd: Add missing gfx11 MQD manager callbacks drm/amdgpu: Free ras cmd input buffer properly drm/amdgpu: Hide xcp partition sysfs under SRIOV drm/amdgpu: use read-modify-write mode for gfx v9_4_3 SQ setting drm/amdkfd: use mask to get v9 interrupt sq data bits correctly drm/amdgpu: Allocate coredump memory in a nonblocking way drm/amdgpu: Support query ecc cap for aqua_vanjaram drm/amdgpu: Add umc_info v4_0 structure drm/amd/display: always switch off ODM before committing more streams drm/amd/display: Remove wait while locked drm/amd/display: update blank state on ODM changes drm/amd/display: Add smu write msg id fail retry process drm/amdgpu: Add SMU v13.0.6 default reset methods ...
2 parents 73be7fb + 43ffcd6 commit a48fa7e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

62 files changed

+684
-227
lines changed

Documentation/gpu/amdgpu/driver-misc.rst

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,19 +11,19 @@ via sysfs
1111
product_name
1212
------------
1313

14-
.. kernel-doc:: drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
14+
.. kernel-doc:: drivers/gpu/drm/amd/amdgpu/amdgpu_fru_eeprom.c
1515
:doc: product_name
1616

1717
product_number
1818
--------------
1919

20-
.. kernel-doc:: drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
21-
:doc: product_name
20+
.. kernel-doc:: drivers/gpu/drm/amd/amdgpu/amdgpu_fru_eeprom.c
21+
:doc: product_number
2222

2323
serial_number
2424
-------------
2525

26-
.. kernel-doc:: drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
26+
.. kernel-doc:: drivers/gpu/drm/amd/amdgpu/amdgpu_fru_eeprom.c
2727
:doc: serial_number
2828

2929
unique_id

drivers/accel/ivpu/ivpu_jsm_msg.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,8 +118,7 @@ int ivpu_jsm_dyndbg_control(struct ivpu_device *vdev, char *command, size_t size
118118
struct vpu_jsm_msg resp;
119119
int ret;
120120

121-
if (!strncpy(req.payload.dyndbg_control.dyndbg_cmd, command, VPU_DYNDBG_CMD_MAX_LEN - 1))
122-
return -ENOMEM;
121+
strscpy(req.payload.dyndbg_control.dyndbg_cmd, command, VPU_DYNDBG_CMD_MAX_LEN);
123122

124123
ret = ivpu_ipc_send_receive(vdev, &req, VPU_JSM_MSG_DYNDBG_CONTROL_RSP, &resp,
125124
VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm);

drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -442,9 +442,7 @@ void amdgpu_amdkfd_get_local_mem_info(struct amdgpu_device *adev,
442442
mem_info->local_mem_size_public,
443443
mem_info->local_mem_size_private);
444444

445-
if (amdgpu_sriov_vf(adev))
446-
mem_info->mem_clk_max = adev->clock.default_mclk / 100;
447-
else if (adev->pm.dpm_enabled) {
445+
if (adev->pm.dpm_enabled) {
448446
if (amdgpu_emu_mode == 1)
449447
mem_info->mem_clk_max = 0;
450448
else
@@ -463,9 +461,7 @@ uint64_t amdgpu_amdkfd_get_gpu_clock_counter(struct amdgpu_device *adev)
463461
uint32_t amdgpu_amdkfd_get_max_engine_clock_in_mhz(struct amdgpu_device *adev)
464462
{
465463
/* the sclk is in quantas of 10kHz */
466-
if (amdgpu_sriov_vf(adev))
467-
return adev->clock.default_sclk / 100;
468-
else if (adev->pm.dpm_enabled)
464+
if (adev->pm.dpm_enabled)
469465
return amdgpu_dpm_get_sclk(adev, false) / 100;
470466
else
471467
return 100;

drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,7 @@ union umc_info {
217217
struct atom_umc_info_v3_1 v31;
218218
struct atom_umc_info_v3_2 v32;
219219
struct atom_umc_info_v3_3 v33;
220+
struct atom_umc_info_v4_0 v40;
220221
};
221222

222223
union vram_info {
@@ -508,9 +509,8 @@ bool amdgpu_atomfirmware_mem_ecc_supported(struct amdgpu_device *adev)
508509

509510
if (amdgpu_atom_parse_data_header(mode_info->atom_context,
510511
index, &size, &frev, &crev, &data_offset)) {
512+
umc_info = (union umc_info *)(mode_info->atom_context->bios + data_offset);
511513
if (frev == 3) {
512-
umc_info = (union umc_info *)
513-
(mode_info->atom_context->bios + data_offset);
514514
switch (crev) {
515515
case 1:
516516
umc_config = le32_to_cpu(umc_info->v31.umc_config);
@@ -533,6 +533,20 @@ bool amdgpu_atomfirmware_mem_ecc_supported(struct amdgpu_device *adev)
533533
/* unsupported crev */
534534
return false;
535535
}
536+
} else if (frev == 4) {
537+
switch (crev) {
538+
case 0:
539+
umc_config1 = le32_to_cpu(umc_info->v40.umc_config1);
540+
ecc_default_enabled =
541+
(umc_config1 & UMC_CONFIG1__ENABLE_ECC_CAPABLE) ? true : false;
542+
break;
543+
default:
544+
/* unsupported crev */
545+
return false;
546+
}
547+
} else {
548+
/* unsupported frev */
549+
return false;
536550
}
537551
}
538552

drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,6 @@ static int amdgpu_cs_p1_user_fence(struct amdgpu_cs_parser *p,
127127
{
128128
struct drm_gem_object *gobj;
129129
unsigned long size;
130-
int r;
131130

132131
gobj = drm_gem_object_lookup(p->filp, data->handle);
133132
if (gobj == NULL)
@@ -137,23 +136,14 @@ static int amdgpu_cs_p1_user_fence(struct amdgpu_cs_parser *p,
137136
drm_gem_object_put(gobj);
138137

139138
size = amdgpu_bo_size(p->uf_bo);
140-
if (size != PAGE_SIZE || (data->offset + 8) > size) {
141-
r = -EINVAL;
142-
goto error_unref;
143-
}
139+
if (size != PAGE_SIZE || data->offset > (size - 8))
140+
return -EINVAL;
144141

145-
if (amdgpu_ttm_tt_get_usermm(p->uf_bo->tbo.ttm)) {
146-
r = -EINVAL;
147-
goto error_unref;
148-
}
142+
if (amdgpu_ttm_tt_get_usermm(p->uf_bo->tbo.ttm))
143+
return -EINVAL;
149144

150145
*offset = data->offset;
151-
152146
return 0;
153-
154-
error_unref:
155-
amdgpu_bo_unref(&p->uf_bo);
156-
return r;
157147
}
158148

159149
static int amdgpu_cs_p1_bo_handles(struct amdgpu_cs_parser *p,

drivers/gpu/drm/amd/amdgpu/amdgpu_device.c

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -885,13 +885,20 @@ static void amdgpu_block_invalid_wreg(struct amdgpu_device *adev,
885885
*/
886886
static int amdgpu_device_asic_init(struct amdgpu_device *adev)
887887
{
888+
int ret;
889+
888890
amdgpu_asic_pre_asic_init(adev);
889891

890892
if (adev->ip_versions[GC_HWIP][0] == IP_VERSION(9, 4, 3) ||
891-
adev->ip_versions[GC_HWIP][0] >= IP_VERSION(11, 0, 0))
892-
return amdgpu_atomfirmware_asic_init(adev, true);
893-
else
893+
adev->ip_versions[GC_HWIP][0] >= IP_VERSION(11, 0, 0)) {
894+
amdgpu_psp_wait_for_bootloader(adev);
895+
ret = amdgpu_atomfirmware_asic_init(adev, true);
896+
return ret;
897+
} else {
894898
return amdgpu_atom_asic_init(adev->mode_info.atom_context);
899+
}
900+
901+
return 0;
895902
}
896903

897904
/**
@@ -4694,9 +4701,12 @@ int amdgpu_device_mode1_reset(struct amdgpu_device *adev)
46944701
}
46954702

46964703
if (ret)
4697-
dev_err(adev->dev, "GPU mode1 reset failed\n");
4704+
goto mode1_reset_failed;
46984705

46994706
amdgpu_device_load_pci_state(adev->pdev);
4707+
ret = amdgpu_psp_wait_for_bootloader(adev);
4708+
if (ret)
4709+
goto mode1_reset_failed;
47004710

47014711
/* wait for asic to come out of reset */
47024712
for (i = 0; i < adev->usec_timeout; i++) {
@@ -4707,7 +4717,17 @@ int amdgpu_device_mode1_reset(struct amdgpu_device *adev)
47074717
udelay(1);
47084718
}
47094719

4720+
if (i >= adev->usec_timeout) {
4721+
ret = -ETIMEDOUT;
4722+
goto mode1_reset_failed;
4723+
}
4724+
47104725
amdgpu_atombios_scratch_regs_engine_hung(adev, false);
4726+
4727+
return 0;
4728+
4729+
mode1_reset_failed:
4730+
dev_err(adev->dev, "GPU mode1 reset failed\n");
47114731
return ret;
47124732
}
47134733

@@ -4849,7 +4869,7 @@ static void amdgpu_reset_capture_coredumpm(struct amdgpu_device *adev)
48494869
struct drm_device *dev = adev_to_drm(adev);
48504870

48514871
ktime_get_ts64(&adev->reset_time);
4852-
dev_coredumpm(dev->dev, THIS_MODULE, adev, 0, GFP_KERNEL,
4872+
dev_coredumpm(dev->dev, THIS_MODULE, adev, 0, GFP_NOWAIT,
48534873
amdgpu_devcoredump_read, amdgpu_devcoredump_free);
48544874
}
48554875
#endif

drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1390,6 +1390,7 @@ union gc_info {
13901390
struct gc_info_v1_1 v1_1;
13911391
struct gc_info_v1_2 v1_2;
13921392
struct gc_info_v2_0 v2;
1393+
struct gc_info_v2_1 v2_1;
13931394
};
13941395

13951396
static int amdgpu_discovery_get_gfx_info(struct amdgpu_device *adev)
@@ -1465,6 +1466,15 @@ static int amdgpu_discovery_get_gfx_info(struct amdgpu_device *adev)
14651466
adev->gfx.config.num_sc_per_sh = le32_to_cpu(gc_info->v2.gc_num_sc_per_se) /
14661467
le32_to_cpu(gc_info->v2.gc_num_sh_per_se);
14671468
adev->gfx.config.num_packer_per_sc = le32_to_cpu(gc_info->v2.gc_num_packer_per_sc);
1469+
if (gc_info->v2.header.version_minor == 1) {
1470+
adev->gfx.config.gc_num_tcp_per_sa = le32_to_cpu(gc_info->v2_1.gc_num_tcp_per_sh);
1471+
adev->gfx.config.gc_tcp_size_per_cu = le32_to_cpu(gc_info->v2_1.gc_tcp_size_per_cu);
1472+
adev->gfx.config.gc_num_sdp_interface = le32_to_cpu(gc_info->v2_1.gc_num_sdp_interface); /* per XCD */
1473+
adev->gfx.config.gc_num_cu_per_sqc = le32_to_cpu(gc_info->v2_1.gc_num_cu_per_sqc);
1474+
adev->gfx.config.gc_l1_instruction_cache_size_per_sqc = le32_to_cpu(gc_info->v2_1.gc_instruction_cache_size_per_sqc);
1475+
adev->gfx.config.gc_l1_data_cache_size_per_sqc = le32_to_cpu(gc_info->v2_1.gc_scalar_data_cache_size_per_sqc);
1476+
adev->gfx.config.gc_tcc_size = le32_to_cpu(gc_info->v2_1.gc_tcc_size); /* per XCD */
1477+
}
14681478
break;
14691479
default:
14701480
dev_err(adev->dev,
@@ -1478,6 +1488,7 @@ static int amdgpu_discovery_get_gfx_info(struct amdgpu_device *adev)
14781488

14791489
union mall_info {
14801490
struct mall_info_v1_0 v1;
1491+
struct mall_info_v2_0 v2;
14811492
};
14821493

14831494
static int amdgpu_discovery_get_mall_info(struct amdgpu_device *adev)
@@ -1518,6 +1529,10 @@ static int amdgpu_discovery_get_mall_info(struct amdgpu_device *adev)
15181529
adev->gmc.mall_size = mall_size;
15191530
adev->gmc.m_half_use = half_use;
15201531
break;
1532+
case 2:
1533+
mall_size_per_umc = le32_to_cpu(mall_info->v2.mall_size_per_umc);
1534+
adev->gmc.mall_size = mall_size_per_umc * adev->gmc.num_umc;
1535+
break;
15211536
default:
15221537
dev_err(adev->dev,
15231538
"Unhandled MALL info table %d.%d\n",

drivers/gpu/drm/amd/amdgpu/amdgpu_display.c

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@
3838
#include <linux/pci.h>
3939
#include <linux/pm_runtime.h>
4040
#include <drm/drm_crtc_helper.h>
41+
#include <drm/drm_damage_helper.h>
42+
#include <drm/drm_drv.h>
4143
#include <drm/drm_edid.h>
4244
#include <drm/drm_fb_helper.h>
4345
#include <drm/drm_gem_framebuffer_helper.h>
@@ -532,11 +534,29 @@ bool amdgpu_display_ddc_probe(struct amdgpu_connector *amdgpu_connector,
532534
return true;
533535
}
534536

537+
static int amdgpu_dirtyfb(struct drm_framebuffer *fb, struct drm_file *file,
538+
unsigned int flags, unsigned int color,
539+
struct drm_clip_rect *clips, unsigned int num_clips)
540+
{
541+
542+
if (file)
543+
return -ENOSYS;
544+
545+
return drm_atomic_helper_dirtyfb(fb, file, flags, color, clips,
546+
num_clips);
547+
}
548+
535549
static const struct drm_framebuffer_funcs amdgpu_fb_funcs = {
536550
.destroy = drm_gem_fb_destroy,
537551
.create_handle = drm_gem_fb_create_handle,
538552
};
539553

554+
static const struct drm_framebuffer_funcs amdgpu_fb_funcs_atomic = {
555+
.destroy = drm_gem_fb_destroy,
556+
.create_handle = drm_gem_fb_create_handle,
557+
.dirty = amdgpu_dirtyfb
558+
};
559+
540560
uint32_t amdgpu_display_supported_domains(struct amdgpu_device *adev,
541561
uint64_t bo_flags)
542562
{
@@ -1139,7 +1159,11 @@ static int amdgpu_display_gem_fb_verify_and_init(struct drm_device *dev,
11391159
if (ret)
11401160
goto err;
11411161

1142-
ret = drm_framebuffer_init(dev, &rfb->base, &amdgpu_fb_funcs);
1162+
if (drm_drv_uses_atomic_modeset(dev))
1163+
ret = drm_framebuffer_init(dev, &rfb->base,
1164+
&amdgpu_fb_funcs_atomic);
1165+
else
1166+
ret = drm_framebuffer_init(dev, &rfb->base, &amdgpu_fb_funcs);
11431167

11441168
if (ret)
11451169
goto err;

drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,9 @@ struct amdgpu_gfx_config {
241241
uint32_t gc_gl1c_per_sa;
242242
uint32_t gc_gl1c_size_per_instance;
243243
uint32_t gc_gl2c_per_gpu;
244+
uint32_t gc_tcp_size_per_cu;
245+
uint32_t gc_num_cu_per_sqc;
246+
uint32_t gc_tcc_size;
244247
};
245248

246249
struct amdgpu_cu_info {

drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2078,6 +2078,17 @@ int psp_securedisplay_invoke(struct psp_context *psp, uint32_t ta_cmd_id)
20782078
}
20792079
/* SECUREDISPLAY end */
20802080

2081+
int amdgpu_psp_wait_for_bootloader(struct amdgpu_device *adev)
2082+
{
2083+
struct psp_context *psp = &adev->psp;
2084+
int ret = 0;
2085+
2086+
if (!amdgpu_sriov_vf(adev) && psp->funcs && psp->funcs->wait_for_bootloader != NULL)
2087+
ret = psp->funcs->wait_for_bootloader(psp);
2088+
2089+
return ret;
2090+
}
2091+
20812092
static int psp_hw_start(struct psp_context *psp)
20822093
{
20832094
struct amdgpu_device *adev = psp->adev;

0 commit comments

Comments
 (0)