mirror of https://gitee.com/openkylin/linux.git
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;
|
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);
|
bios_header_start = bios[0x48] | (bios[0x49] << 8);
|
||||||
if (!bios_header_start) {
|
if (!bios_header_start) {
|
||||||
DRM_INFO("Can't locate bios header\n");
|
DRM_INFO("Can't locate bios header\n");
|
||||||
|
|
|
@ -1497,8 +1497,11 @@ static int amdgpu_cs_wait_any_fence(struct amdgpu_device *adev,
|
||||||
memset(wait, 0, sizeof(*wait));
|
memset(wait, 0, sizeof(*wait));
|
||||||
wait->out.status = (r > 0);
|
wait->out.status = (r > 0);
|
||||||
wait->out.first_signaled = first;
|
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:
|
err_free_fence_array:
|
||||||
for (i = 0; i < fence_count; i++)
|
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;
|
pm_pg_lock = (*pos >> 23) & 1;
|
||||||
|
|
||||||
if (*pos & (1ULL << 62)) {
|
if (*pos & (1ULL << 62)) {
|
||||||
se_bank = (*pos >> 24) & 0x3FF;
|
se_bank = (*pos & GENMASK_ULL(33, 24)) >> 24;
|
||||||
sh_bank = (*pos >> 34) & 0x3FF;
|
sh_bank = (*pos & GENMASK_ULL(43, 34)) >> 34;
|
||||||
instance_bank = (*pos >> 44) & 0x3FF;
|
instance_bank = (*pos & GENMASK_ULL(53, 44)) >> 44;
|
||||||
|
|
||||||
if (se_bank == 0x3FF)
|
if (se_bank == 0x3FF)
|
||||||
se_bank = 0xFFFFFFFF;
|
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;
|
pm_pg_lock = (*pos >> 23) & 1;
|
||||||
|
|
||||||
if (*pos & (1ULL << 62)) {
|
if (*pos & (1ULL << 62)) {
|
||||||
se_bank = (*pos >> 24) & 0x3FF;
|
se_bank = (*pos & GENMASK_ULL(33, 24)) >> 24;
|
||||||
sh_bank = (*pos >> 34) & 0x3FF;
|
sh_bank = (*pos & GENMASK_ULL(43, 34)) >> 34;
|
||||||
instance_bank = (*pos >> 44) & 0x3FF;
|
instance_bank = (*pos & GENMASK_ULL(53, 44)) >> 44;
|
||||||
|
|
||||||
if (se_bank == 0x3FF)
|
if (se_bank == 0x3FF)
|
||||||
se_bank = 0xFFFFFFFF;
|
se_bank = 0xFFFFFFFF;
|
||||||
|
@ -3614,12 +3614,12 @@ static ssize_t amdgpu_debugfs_wave_read(struct file *f, char __user *buf,
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
/* decode offset */
|
/* decode offset */
|
||||||
offset = (*pos & 0x7F);
|
offset = (*pos & GENMASK_ULL(6, 0));
|
||||||
se = ((*pos >> 7) & 0xFF);
|
se = (*pos & GENMASK_ULL(14, 7)) >> 7;
|
||||||
sh = ((*pos >> 15) & 0xFF);
|
sh = (*pos & GENMASK_ULL(22, 15)) >> 15;
|
||||||
cu = ((*pos >> 23) & 0xFF);
|
cu = (*pos & GENMASK_ULL(30, 23)) >> 23;
|
||||||
wave = ((*pos >> 31) & 0xFF);
|
wave = (*pos & GENMASK_ULL(36, 31)) >> 31;
|
||||||
simd = ((*pos >> 37) & 0xFF);
|
simd = (*pos & GENMASK_ULL(44, 37)) >> 37;
|
||||||
|
|
||||||
/* switch to the specific se/sh/cu */
|
/* switch to the specific se/sh/cu */
|
||||||
mutex_lock(&adev->grbm_idx_mutex);
|
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;
|
return -EINVAL;
|
||||||
|
|
||||||
/* decode offset */
|
/* decode offset */
|
||||||
offset = (*pos & 0xFFF); /* in dwords */
|
offset = *pos & GENMASK_ULL(11, 0);
|
||||||
se = ((*pos >> 12) & 0xFF);
|
se = (*pos & GENMASK_ULL(19, 12)) >> 12;
|
||||||
sh = ((*pos >> 20) & 0xFF);
|
sh = (*pos & GENMASK_ULL(27, 20)) >> 20;
|
||||||
cu = ((*pos >> 28) & 0xFF);
|
cu = (*pos & GENMASK_ULL(35, 28)) >> 28;
|
||||||
wave = ((*pos >> 36) & 0xFF);
|
wave = (*pos & GENMASK_ULL(43, 36)) >> 36;
|
||||||
simd = ((*pos >> 44) & 0xFF);
|
simd = (*pos & GENMASK_ULL(51, 44)) >> 44;
|
||||||
thread = ((*pos >> 52) & 0xFF);
|
thread = (*pos & GENMASK_ULL(59, 52)) >> 52;
|
||||||
bank = ((*pos >> 60) & 1);
|
bank = (*pos & GENMASK_ULL(61, 60)) >> 60;
|
||||||
|
|
||||||
data = kmalloc_array(1024, sizeof(*data), GFP_KERNEL);
|
data = kmalloc_array(1024, sizeof(*data), GFP_KERNEL);
|
||||||
if (!data)
|
if (!data)
|
||||||
|
|
|
@ -63,6 +63,11 @@ int amdgpu_gem_object_create(struct amdgpu_device *adev, unsigned long size,
|
||||||
flags, NULL, resv, 0, &bo);
|
flags, NULL, resv, 0, &bo);
|
||||||
if (r) {
|
if (r) {
|
||||||
if (r != -ERESTARTSYS) {
|
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) {
|
if (initial_domain == AMDGPU_GEM_DOMAIN_VRAM) {
|
||||||
initial_domain |= AMDGPU_GEM_DOMAIN_GTT;
|
initial_domain |= AMDGPU_GEM_DOMAIN_GTT;
|
||||||
goto retry;
|
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) {
|
if (args->va_address < AMDGPU_VA_RESERVED_SIZE) {
|
||||||
dev_err(&dev->pdev->dev,
|
dev_err(&dev->pdev->dev,
|
||||||
"va_address 0x%lX is in reserved area 0x%X\n",
|
"va_address 0x%LX is in reserved area 0x%LX\n",
|
||||||
(unsigned long)args->va_address,
|
args->va_address, AMDGPU_VA_RESERVED_SIZE);
|
||||||
AMDGPU_VA_RESERVED_SIZE);
|
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -169,10 +169,14 @@ struct dma_buf *amdgpu_gem_prime_export(struct drm_device *dev,
|
||||||
int flags)
|
int flags)
|
||||||
{
|
{
|
||||||
struct amdgpu_bo *bo = gem_to_amdgpu_bo(gobj);
|
struct amdgpu_bo *bo = gem_to_amdgpu_bo(gobj);
|
||||||
|
struct dma_buf *buf;
|
||||||
|
|
||||||
if (amdgpu_ttm_tt_get_usermm(bo->tbo.ttm) ||
|
if (amdgpu_ttm_tt_get_usermm(bo->tbo.ttm) ||
|
||||||
bo->flags & AMDGPU_GEM_CREATE_VM_ALWAYS_VALID)
|
bo->flags & AMDGPU_GEM_CREATE_VM_ALWAYS_VALID)
|
||||||
return ERR_PTR(-EPERM);
|
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
|
#define AMDGPU_MMHUB 1
|
||||||
|
|
||||||
/* hardcode that limit for now */
|
/* hardcode that limit for now */
|
||||||
#define AMDGPU_VA_RESERVED_SIZE (8 << 20)
|
#define AMDGPU_VA_RESERVED_SIZE (8ULL << 20)
|
||||||
|
|
||||||
/* max vmids dedicated for process */
|
/* max vmids dedicated for process */
|
||||||
#define AMDGPU_VM_MAX_RESERVED_VMID 1
|
#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
|
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 VEGA10_GB_ADDR_CONFIG_GOLDEN 0x2a114042
|
||||||
#define RAVEN_GB_ADDR_CONFIG_GOLDEN 0x24000042
|
#define RAVEN_GB_ADDR_CONFIG_GOLDEN 0x24000042
|
||||||
|
|
||||||
|
@ -242,6 +248,9 @@ static void gfx_v9_0_init_golden_registers(struct amdgpu_device *adev)
|
||||||
default:
|
default:
|
||||||
break;
|
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)
|
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);
|
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 = {
|
static const struct amdgpu_gfx_funcs gfx_v9_0_gfx_funcs = {
|
||||||
.get_gpu_clock_counter = &gfx_v9_0_get_gpu_clock_counter,
|
.get_gpu_clock_counter = &gfx_v9_0_get_gpu_clock_counter,
|
||||||
.select_se_sh = &gfx_v9_0_select_se_sh,
|
.select_se_sh = &gfx_v9_0_select_se_sh,
|
||||||
.read_wave_data = &gfx_v9_0_read_wave_data,
|
.read_wave_data = &gfx_v9_0_read_wave_data,
|
||||||
.read_wave_sgprs = &gfx_v9_0_read_wave_sgprs,
|
.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)
|
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)
|
static int gmc_v9_0_late_init(void *handle)
|
||||||
{
|
{
|
||||||
struct amdgpu_device *adev = (struct amdgpu_device *)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;
|
unsigned i;
|
||||||
|
|
||||||
for(i = 0; i < adev->num_rings; ++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);
|
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)
|
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);
|
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) {
|
if (vddci_id_buf[i] == virtual_voltage_id) {
|
||||||
for (j = 0; j < profile->ucLeakageBinNum; j++) {
|
for (j = 0; j < profile->ucLeakageBinNum; j++) {
|
||||||
if (efuse_voltage_id <= leakage_bin[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;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -753,6 +753,7 @@ static int vega10_hwmgr_backend_init(struct pp_hwmgr *hwmgr)
|
||||||
uint32_t config_telemetry = 0;
|
uint32_t config_telemetry = 0;
|
||||||
struct pp_atomfwctrl_voltage_table vol_table;
|
struct pp_atomfwctrl_voltage_table vol_table;
|
||||||
struct cgs_system_info sys_info = {0};
|
struct cgs_system_info sys_info = {0};
|
||||||
|
uint32_t reg;
|
||||||
|
|
||||||
data = kzalloc(sizeof(struct vega10_hwmgr), GFP_KERNEL);
|
data = kzalloc(sizeof(struct vega10_hwmgr), GFP_KERNEL);
|
||||||
if (data == NULL)
|
if (data == NULL)
|
||||||
|
@ -859,6 +860,16 @@ static int vega10_hwmgr_backend_init(struct pp_hwmgr *hwmgr)
|
||||||
advanceFanControlParameters.usFanPWMMinLimit *
|
advanceFanControlParameters.usFanPWMMinLimit *
|
||||||
hwmgr->thermal_controller.fanInfo.ulMaxRPM / 100;
|
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;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1777,7 +1788,7 @@ static int vega10_populate_all_memory_levels(struct pp_hwmgr *hwmgr)
|
||||||
struct vega10_single_dpm_table *dpm_table =
|
struct vega10_single_dpm_table *dpm_table =
|
||||||
&(data->dpm_table.mem_table);
|
&(data->dpm_table.mem_table);
|
||||||
int result = 0;
|
int result = 0;
|
||||||
uint32_t i, j, reg, mem_channels;
|
uint32_t i, j;
|
||||||
|
|
||||||
for (i = 0; i < dpm_table->count; i++) {
|
for (i = 0; i < dpm_table->count; i++) {
|
||||||
result = vega10_populate_single_memory_level(hwmgr,
|
result = vega10_populate_single_memory_level(hwmgr,
|
||||||
|
@ -1801,20 +1812,10 @@ static int vega10_populate_all_memory_levels(struct pp_hwmgr *hwmgr)
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
|
||||||
reg = soc15_get_register_offset(DF_HWID, 0,
|
pp_table->NumMemoryChannels = (uint16_t)(data->mem_channels);
|
||||||
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->MemoryChannelWidth =
|
pp_table->MemoryChannelWidth =
|
||||||
cpu_to_le16(HBM_MEMORY_CHANNEL_WIDTH *
|
(uint16_t)(HBM_MEMORY_CHANNEL_WIDTH *
|
||||||
channel_number[mem_channels]);
|
channel_number[data->mem_channels]);
|
||||||
|
|
||||||
pp_table->LowestUclkReservedForUlv =
|
pp_table->LowestUclkReservedForUlv =
|
||||||
(uint8_t)(data->lowest_uclk_reserved_for_ulv);
|
(uint8_t)(data->lowest_uclk_reserved_for_ulv);
|
||||||
|
|
|
@ -389,6 +389,7 @@ struct vega10_hwmgr {
|
||||||
uint32_t config_telemetry;
|
uint32_t config_telemetry;
|
||||||
uint32_t smu_version;
|
uint32_t smu_version;
|
||||||
uint32_t acg_loop_state;
|
uint32_t acg_loop_state;
|
||||||
|
uint32_t mem_channels;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define VEGA10_DPM2_NEAR_TDP_DEC 10
|
#define VEGA10_DPM2_NEAR_TDP_DEC 10
|
||||||
|
|
Loading…
Reference in New Issue