mirror of
https://github.com/torvalds/linux.git
synced 2024-11-17 01:22:07 +00:00
Merge branch 'drm-next-4.15' of git://people.freedesktop.org/~agd5f/linux into drm-next
Misc fixes for 4.15. * 'drm-next-4.15' of git://people.freedesktop.org/~agd5f/linux: drm/amd/pp: fix dpm randomly failed on Vega10 drm/amdgpu: set f_mapping on exported DMA-bufs drm/amdgpu: Properly allocate VM invalidate eng v2 drm/amd/amdgpu: if visible VRAM allocation fail, fall back to invisible try again drm/amd/amdgpu: Fix wave mask in amdgpu_debugfs_wave_read() (v2) drm/amdgpu: make AMDGPU_VA_RESERVED_SIZE 64bit drm/amdgpu/gfx9: implement wave VGPR reading drm/amdgpu: Add common golden settings for GFX9 drm/amd/powerplay: fix copy-n-paste error on vddci_buf index drm/amdgpu: Fix null pointer issue in amdgpu_cs_wait_any_fence drm/amdgpu: Remove check which is not valid for certain VBIOS
This commit is contained in:
commit
1220a3e569
@ -59,12 +59,6 @@ static bool check_atom_bios(uint8_t *bios, size_t size)
|
||||
return false;
|
||||
}
|
||||
|
||||
tmp = bios[0x18] | (bios[0x19] << 8);
|
||||
if (bios[tmp + 0x14] != 0x0) {
|
||||
DRM_INFO("Not an x86 BIOS ROM\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
bios_header_start = bios[0x48] | (bios[0x49] << 8);
|
||||
if (!bios_header_start) {
|
||||
DRM_INFO("Can't locate bios header\n");
|
||||
|
@ -1497,8 +1497,11 @@ out:
|
||||
memset(wait, 0, sizeof(*wait));
|
||||
wait->out.status = (r > 0);
|
||||
wait->out.first_signaled = first;
|
||||
/* set return value 0 to indicate success */
|
||||
r = array[first]->error;
|
||||
|
||||
if (array[first])
|
||||
r = array[first]->error;
|
||||
else
|
||||
r = 0;
|
||||
|
||||
err_free_fence_array:
|
||||
for (i = 0; i < fence_count; i++)
|
||||
|
@ -3188,9 +3188,9 @@ static ssize_t amdgpu_debugfs_regs_read(struct file *f, char __user *buf,
|
||||
pm_pg_lock = (*pos >> 23) & 1;
|
||||
|
||||
if (*pos & (1ULL << 62)) {
|
||||
se_bank = (*pos >> 24) & 0x3FF;
|
||||
sh_bank = (*pos >> 34) & 0x3FF;
|
||||
instance_bank = (*pos >> 44) & 0x3FF;
|
||||
se_bank = (*pos & GENMASK_ULL(33, 24)) >> 24;
|
||||
sh_bank = (*pos & GENMASK_ULL(43, 34)) >> 34;
|
||||
instance_bank = (*pos & GENMASK_ULL(53, 44)) >> 44;
|
||||
|
||||
if (se_bank == 0x3FF)
|
||||
se_bank = 0xFFFFFFFF;
|
||||
@ -3264,9 +3264,9 @@ static ssize_t amdgpu_debugfs_regs_write(struct file *f, const char __user *buf,
|
||||
pm_pg_lock = (*pos >> 23) & 1;
|
||||
|
||||
if (*pos & (1ULL << 62)) {
|
||||
se_bank = (*pos >> 24) & 0x3FF;
|
||||
sh_bank = (*pos >> 34) & 0x3FF;
|
||||
instance_bank = (*pos >> 44) & 0x3FF;
|
||||
se_bank = (*pos & GENMASK_ULL(33, 24)) >> 24;
|
||||
sh_bank = (*pos & GENMASK_ULL(43, 34)) >> 34;
|
||||
instance_bank = (*pos & GENMASK_ULL(53, 44)) >> 44;
|
||||
|
||||
if (se_bank == 0x3FF)
|
||||
se_bank = 0xFFFFFFFF;
|
||||
@ -3614,12 +3614,12 @@ static ssize_t amdgpu_debugfs_wave_read(struct file *f, char __user *buf,
|
||||
return -EINVAL;
|
||||
|
||||
/* decode offset */
|
||||
offset = (*pos & 0x7F);
|
||||
se = ((*pos >> 7) & 0xFF);
|
||||
sh = ((*pos >> 15) & 0xFF);
|
||||
cu = ((*pos >> 23) & 0xFF);
|
||||
wave = ((*pos >> 31) & 0xFF);
|
||||
simd = ((*pos >> 37) & 0xFF);
|
||||
offset = (*pos & GENMASK_ULL(6, 0));
|
||||
se = (*pos & GENMASK_ULL(14, 7)) >> 7;
|
||||
sh = (*pos & GENMASK_ULL(22, 15)) >> 15;
|
||||
cu = (*pos & GENMASK_ULL(30, 23)) >> 23;
|
||||
wave = (*pos & GENMASK_ULL(36, 31)) >> 31;
|
||||
simd = (*pos & GENMASK_ULL(44, 37)) >> 37;
|
||||
|
||||
/* switch to the specific se/sh/cu */
|
||||
mutex_lock(&adev->grbm_idx_mutex);
|
||||
@ -3664,14 +3664,14 @@ static ssize_t amdgpu_debugfs_gpr_read(struct file *f, char __user *buf,
|
||||
return -EINVAL;
|
||||
|
||||
/* decode offset */
|
||||
offset = (*pos & 0xFFF); /* in dwords */
|
||||
se = ((*pos >> 12) & 0xFF);
|
||||
sh = ((*pos >> 20) & 0xFF);
|
||||
cu = ((*pos >> 28) & 0xFF);
|
||||
wave = ((*pos >> 36) & 0xFF);
|
||||
simd = ((*pos >> 44) & 0xFF);
|
||||
thread = ((*pos >> 52) & 0xFF);
|
||||
bank = ((*pos >> 60) & 1);
|
||||
offset = *pos & GENMASK_ULL(11, 0);
|
||||
se = (*pos & GENMASK_ULL(19, 12)) >> 12;
|
||||
sh = (*pos & GENMASK_ULL(27, 20)) >> 20;
|
||||
cu = (*pos & GENMASK_ULL(35, 28)) >> 28;
|
||||
wave = (*pos & GENMASK_ULL(43, 36)) >> 36;
|
||||
simd = (*pos & GENMASK_ULL(51, 44)) >> 44;
|
||||
thread = (*pos & GENMASK_ULL(59, 52)) >> 52;
|
||||
bank = (*pos & GENMASK_ULL(61, 60)) >> 60;
|
||||
|
||||
data = kmalloc_array(1024, sizeof(*data), GFP_KERNEL);
|
||||
if (!data)
|
||||
|
@ -63,6 +63,11 @@ retry:
|
||||
flags, NULL, resv, 0, &bo);
|
||||
if (r) {
|
||||
if (r != -ERESTARTSYS) {
|
||||
if (flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED) {
|
||||
flags &= ~AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED;
|
||||
goto retry;
|
||||
}
|
||||
|
||||
if (initial_domain == AMDGPU_GEM_DOMAIN_VRAM) {
|
||||
initial_domain |= AMDGPU_GEM_DOMAIN_GTT;
|
||||
goto retry;
|
||||
@ -556,9 +561,8 @@ int amdgpu_gem_va_ioctl(struct drm_device *dev, void *data,
|
||||
|
||||
if (args->va_address < AMDGPU_VA_RESERVED_SIZE) {
|
||||
dev_err(&dev->pdev->dev,
|
||||
"va_address 0x%lX is in reserved area 0x%X\n",
|
||||
(unsigned long)args->va_address,
|
||||
AMDGPU_VA_RESERVED_SIZE);
|
||||
"va_address 0x%LX is in reserved area 0x%LX\n",
|
||||
args->va_address, AMDGPU_VA_RESERVED_SIZE);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
@ -169,10 +169,14 @@ struct dma_buf *amdgpu_gem_prime_export(struct drm_device *dev,
|
||||
int flags)
|
||||
{
|
||||
struct amdgpu_bo *bo = gem_to_amdgpu_bo(gobj);
|
||||
struct dma_buf *buf;
|
||||
|
||||
if (amdgpu_ttm_tt_get_usermm(bo->tbo.ttm) ||
|
||||
bo->flags & AMDGPU_GEM_CREATE_VM_ALWAYS_VALID)
|
||||
return ERR_PTR(-EPERM);
|
||||
|
||||
return drm_gem_prime_export(dev, gobj, flags);
|
||||
buf = drm_gem_prime_export(dev, gobj, flags);
|
||||
if (!IS_ERR(buf))
|
||||
buf->file->f_mapping = dev->anon_inode->i_mapping;
|
||||
return buf;
|
||||
}
|
||||
|
@ -94,7 +94,8 @@ struct amdgpu_bo_list_entry;
|
||||
#define AMDGPU_MMHUB 1
|
||||
|
||||
/* hardcode that limit for now */
|
||||
#define AMDGPU_VA_RESERVED_SIZE (8 << 20)
|
||||
#define AMDGPU_VA_RESERVED_SIZE (8ULL << 20)
|
||||
|
||||
/* max vmids dedicated for process */
|
||||
#define AMDGPU_VM_MAX_RESERVED_VMID 1
|
||||
|
||||
|
@ -207,6 +207,12 @@ static const u32 golden_settings_gc_9_1_rv1[] =
|
||||
SOC15_REG_OFFSET(GC, 0, mmTD_CNTL), 0x01bd9f33, 0x00000800
|
||||
};
|
||||
|
||||
static const u32 golden_settings_gc_9_x_common[] =
|
||||
{
|
||||
SOC15_REG_OFFSET(GC, 0, mmGRBM_CAM_INDEX), 0xffffffff, 0x00000000,
|
||||
SOC15_REG_OFFSET(GC, 0, mmGRBM_CAM_DATA), 0xffffffff, 0x2544c382
|
||||
};
|
||||
|
||||
#define VEGA10_GB_ADDR_CONFIG_GOLDEN 0x2a114042
|
||||
#define RAVEN_GB_ADDR_CONFIG_GOLDEN 0x24000042
|
||||
|
||||
@ -242,6 +248,9 @@ static void gfx_v9_0_init_golden_registers(struct amdgpu_device *adev)
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
amdgpu_program_register_sequence(adev, golden_settings_gc_9_x_common,
|
||||
(const u32)ARRAY_SIZE(golden_settings_gc_9_x_common));
|
||||
}
|
||||
|
||||
static void gfx_v9_0_scratch_init(struct amdgpu_device *adev)
|
||||
@ -988,12 +997,22 @@ static void gfx_v9_0_read_wave_sgprs(struct amdgpu_device *adev, uint32_t simd,
|
||||
start + SQIND_WAVE_SGPRS_OFFSET, size, dst);
|
||||
}
|
||||
|
||||
static void gfx_v9_0_read_wave_vgprs(struct amdgpu_device *adev, uint32_t simd,
|
||||
uint32_t wave, uint32_t thread,
|
||||
uint32_t start, uint32_t size,
|
||||
uint32_t *dst)
|
||||
{
|
||||
wave_read_regs(
|
||||
adev, simd, wave, thread,
|
||||
start + SQIND_WAVE_VGPRS_OFFSET, size, dst);
|
||||
}
|
||||
|
||||
static const struct amdgpu_gfx_funcs gfx_v9_0_gfx_funcs = {
|
||||
.get_gpu_clock_counter = &gfx_v9_0_get_gpu_clock_counter,
|
||||
.select_se_sh = &gfx_v9_0_select_se_sh,
|
||||
.read_wave_data = &gfx_v9_0_read_wave_data,
|
||||
.read_wave_sgprs = &gfx_v9_0_read_wave_sgprs,
|
||||
.read_wave_vgprs = &gfx_v9_0_read_wave_vgprs,
|
||||
};
|
||||
|
||||
static void gfx_v9_0_gpu_early_init(struct amdgpu_device *adev)
|
||||
|
@ -392,7 +392,16 @@ static int gmc_v9_0_early_init(void *handle)
|
||||
static int gmc_v9_0_late_init(void *handle)
|
||||
{
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||
unsigned vm_inv_eng[AMDGPU_MAX_VMHUBS] = { 3, 3 };
|
||||
/*
|
||||
* The latest engine allocation on gfx9 is:
|
||||
* Engine 0, 1: idle
|
||||
* Engine 2, 3: firmware
|
||||
* Engine 4~13: amdgpu ring, subject to change when ring number changes
|
||||
* Engine 14~15: idle
|
||||
* Engine 16: kfd tlb invalidation
|
||||
* Engine 17: Gart flushes
|
||||
*/
|
||||
unsigned vm_inv_eng[AMDGPU_MAX_VMHUBS] = { 4, 4 };
|
||||
unsigned i;
|
||||
|
||||
for(i = 0; i < adev->num_rings; ++i) {
|
||||
@ -405,9 +414,9 @@ static int gmc_v9_0_late_init(void *handle)
|
||||
ring->funcs->vmhub);
|
||||
}
|
||||
|
||||
/* Engine 17 is used for GART flushes */
|
||||
/* Engine 16 is used for KFD and 17 for GART flushes */
|
||||
for(i = 0; i < AMDGPU_MAX_VMHUBS; ++i)
|
||||
BUG_ON(vm_inv_eng[i] > 17);
|
||||
BUG_ON(vm_inv_eng[i] > 16);
|
||||
|
||||
return amdgpu_irq_get(adev, &adev->mc.vm_fault, 0);
|
||||
}
|
||||
|
@ -1486,7 +1486,7 @@ int atomctrl_get_leakage_vddc_base_on_leakage(struct pp_hwmgr *hwmgr,
|
||||
if (vddci_id_buf[i] == virtual_voltage_id) {
|
||||
for (j = 0; j < profile->ucLeakageBinNum; j++) {
|
||||
if (efuse_voltage_id <= leakage_bin[j]) {
|
||||
*vddci = vddci_buf[j * profile->ucElbVDDC_Num + i];
|
||||
*vddci = vddci_buf[j * profile->ucElbVDDCI_Num + i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -753,6 +753,7 @@ static int vega10_hwmgr_backend_init(struct pp_hwmgr *hwmgr)
|
||||
uint32_t config_telemetry = 0;
|
||||
struct pp_atomfwctrl_voltage_table vol_table;
|
||||
struct cgs_system_info sys_info = {0};
|
||||
uint32_t reg;
|
||||
|
||||
data = kzalloc(sizeof(struct vega10_hwmgr), GFP_KERNEL);
|
||||
if (data == NULL)
|
||||
@ -859,6 +860,16 @@ static int vega10_hwmgr_backend_init(struct pp_hwmgr *hwmgr)
|
||||
advanceFanControlParameters.usFanPWMMinLimit *
|
||||
hwmgr->thermal_controller.fanInfo.ulMaxRPM / 100;
|
||||
|
||||
reg = soc15_get_register_offset(DF_HWID, 0,
|
||||
mmDF_CS_AON0_DramBaseAddress0_BASE_IDX,
|
||||
mmDF_CS_AON0_DramBaseAddress0);
|
||||
data->mem_channels = (cgs_read_register(hwmgr->device, reg) &
|
||||
DF_CS_AON0_DramBaseAddress0__IntLvNumChan_MASK) >>
|
||||
DF_CS_AON0_DramBaseAddress0__IntLvNumChan__SHIFT;
|
||||
PP_ASSERT_WITH_CODE(data->mem_channels < ARRAY_SIZE(channel_number),
|
||||
"Mem Channel Index Exceeded maximum!",
|
||||
return -EINVAL);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
@ -1777,7 +1788,7 @@ static int vega10_populate_all_memory_levels(struct pp_hwmgr *hwmgr)
|
||||
struct vega10_single_dpm_table *dpm_table =
|
||||
&(data->dpm_table.mem_table);
|
||||
int result = 0;
|
||||
uint32_t i, j, reg, mem_channels;
|
||||
uint32_t i, j;
|
||||
|
||||
for (i = 0; i < dpm_table->count; i++) {
|
||||
result = vega10_populate_single_memory_level(hwmgr,
|
||||
@ -1801,20 +1812,10 @@ static int vega10_populate_all_memory_levels(struct pp_hwmgr *hwmgr)
|
||||
i++;
|
||||
}
|
||||
|
||||
reg = soc15_get_register_offset(DF_HWID, 0,
|
||||
mmDF_CS_AON0_DramBaseAddress0_BASE_IDX,
|
||||
mmDF_CS_AON0_DramBaseAddress0);
|
||||
mem_channels = (cgs_read_register(hwmgr->device, reg) &
|
||||
DF_CS_AON0_DramBaseAddress0__IntLvNumChan_MASK) >>
|
||||
DF_CS_AON0_DramBaseAddress0__IntLvNumChan__SHIFT;
|
||||
PP_ASSERT_WITH_CODE(mem_channels < ARRAY_SIZE(channel_number),
|
||||
"Mem Channel Index Exceeded maximum!",
|
||||
return -1);
|
||||
|
||||
pp_table->NumMemoryChannels = cpu_to_le16(mem_channels);
|
||||
pp_table->NumMemoryChannels = (uint16_t)(data->mem_channels);
|
||||
pp_table->MemoryChannelWidth =
|
||||
cpu_to_le16(HBM_MEMORY_CHANNEL_WIDTH *
|
||||
channel_number[mem_channels]);
|
||||
(uint16_t)(HBM_MEMORY_CHANNEL_WIDTH *
|
||||
channel_number[data->mem_channels]);
|
||||
|
||||
pp_table->LowestUclkReservedForUlv =
|
||||
(uint8_t)(data->lowest_uclk_reserved_for_ulv);
|
||||
|
@ -389,6 +389,7 @@ struct vega10_hwmgr {
|
||||
uint32_t config_telemetry;
|
||||
uint32_t smu_version;
|
||||
uint32_t acg_loop_state;
|
||||
uint32_t mem_channels;
|
||||
};
|
||||
|
||||
#define VEGA10_DPM2_NEAR_TDP_DEC 10
|
||||
|
Loading…
Reference in New Issue
Block a user