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:
Dave Airlie 2017-11-20 06:14:14 +10:00
commit 1220a3e569
11 changed files with 87 additions and 51 deletions

View File

@ -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");

View File

@ -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++)

View File

@ -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)

View File

@ -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;
} }

View File

@ -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;
} }

View File

@ -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

View File

@ -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)

View File

@ -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);
} }

View File

@ -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;
} }
} }

View File

@ -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);

View File

@ -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