mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-26 08:31:13 +00:00
Merge branch 'drm-fixes-3.13' of git://people.freedesktop.org/~agd5f/linux into drm-fixes
Some additional fixes for 3.13. Regression fixes for audio and hw_i2c, vram fix for some SI PX cards, race fix in the hwmon code, and a few other odds and ends. * 'drm-fixes-3.13' of git://people.freedesktop.org/~agd5f/linux: drm/radeon/atom: fix bus probes when hw_i2c is set (v2) drm/radeon: fix null pointer dereference in dce6+ audio code drm/radeon: fixup bad vram size on SI drm/radeon: fix VGT_GS_INSTANCE_CNT register drm/radeon: Fix a typo in Cayman and Evergreen registers drm/radeon/dpm: simplify state adjust logic for NI drm/radeon: add radeon_vm_bo_update trace point drm/radeon: add VMID allocation trace point drm/radeon/dpm: Convert to use devm_hwmon_register_with_groups drm/radeon: program DCE2 audio dto just like DCE3 drm/radeon: fix typo in fetching mpll params
This commit is contained in:
commit
9255ce80f8
14 changed files with 106 additions and 91 deletions
|
@ -44,7 +44,7 @@ static int radeon_process_i2c_ch(struct radeon_i2c_chan *chan,
|
||||||
PROCESS_I2C_CHANNEL_TRANSACTION_PS_ALLOCATION args;
|
PROCESS_I2C_CHANNEL_TRANSACTION_PS_ALLOCATION args;
|
||||||
int index = GetIndexIntoMasterTable(COMMAND, ProcessI2cChannelTransaction);
|
int index = GetIndexIntoMasterTable(COMMAND, ProcessI2cChannelTransaction);
|
||||||
unsigned char *base;
|
unsigned char *base;
|
||||||
u16 out;
|
u16 out = cpu_to_le16(0);
|
||||||
|
|
||||||
memset(&args, 0, sizeof(args));
|
memset(&args, 0, sizeof(args));
|
||||||
|
|
||||||
|
@ -55,11 +55,14 @@ static int radeon_process_i2c_ch(struct radeon_i2c_chan *chan,
|
||||||
DRM_ERROR("hw i2c: tried to write too many bytes (%d vs 3)\n", num);
|
DRM_ERROR("hw i2c: tried to write too many bytes (%d vs 3)\n", num);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
args.ucRegIndex = buf[0];
|
if (buf == NULL)
|
||||||
if (num > 1) {
|
args.ucRegIndex = 0;
|
||||||
|
else
|
||||||
|
args.ucRegIndex = buf[0];
|
||||||
|
if (num)
|
||||||
num--;
|
num--;
|
||||||
|
if (num)
|
||||||
memcpy(&out, &buf[1], num);
|
memcpy(&out, &buf[1], num);
|
||||||
}
|
|
||||||
args.lpI2CDataOut = cpu_to_le16(out);
|
args.lpI2CDataOut = cpu_to_le16(out);
|
||||||
} else {
|
} else {
|
||||||
if (num > ATOM_MAX_HW_I2C_READ) {
|
if (num > ATOM_MAX_HW_I2C_READ) {
|
||||||
|
@ -96,14 +99,14 @@ int radeon_atom_hw_i2c_xfer(struct i2c_adapter *i2c_adap,
|
||||||
struct radeon_i2c_chan *i2c = i2c_get_adapdata(i2c_adap);
|
struct radeon_i2c_chan *i2c = i2c_get_adapdata(i2c_adap);
|
||||||
struct i2c_msg *p;
|
struct i2c_msg *p;
|
||||||
int i, remaining, current_count, buffer_offset, max_bytes, ret;
|
int i, remaining, current_count, buffer_offset, max_bytes, ret;
|
||||||
u8 buf = 0, flags;
|
u8 flags;
|
||||||
|
|
||||||
/* check for bus probe */
|
/* check for bus probe */
|
||||||
p = &msgs[0];
|
p = &msgs[0];
|
||||||
if ((num == 1) && (p->len == 0)) {
|
if ((num == 1) && (p->len == 0)) {
|
||||||
ret = radeon_process_i2c_ch(i2c,
|
ret = radeon_process_i2c_ch(i2c,
|
||||||
p->addr, HW_I2C_WRITE,
|
p->addr, HW_I2C_WRITE,
|
||||||
&buf, 1);
|
NULL, 0);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
else
|
else
|
||||||
|
|
|
@ -93,11 +93,13 @@ void dce6_afmt_select_pin(struct drm_encoder *encoder)
|
||||||
struct radeon_device *rdev = encoder->dev->dev_private;
|
struct radeon_device *rdev = encoder->dev->dev_private;
|
||||||
struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
|
struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
|
||||||
struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
|
struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
|
||||||
u32 offset = dig->afmt->offset;
|
u32 offset;
|
||||||
|
|
||||||
if (!dig->afmt->pin)
|
if (!dig || !dig->afmt || !dig->afmt->pin)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
offset = dig->afmt->offset;
|
||||||
|
|
||||||
WREG32(AFMT_AUDIO_SRC_CONTROL + offset,
|
WREG32(AFMT_AUDIO_SRC_CONTROL + offset,
|
||||||
AFMT_AUDIO_SRC_SELECT(dig->afmt->pin->id));
|
AFMT_AUDIO_SRC_SELECT(dig->afmt->pin->id));
|
||||||
}
|
}
|
||||||
|
@ -112,7 +114,7 @@ void dce6_afmt_write_latency_fields(struct drm_encoder *encoder,
|
||||||
struct radeon_connector *radeon_connector = NULL;
|
struct radeon_connector *radeon_connector = NULL;
|
||||||
u32 tmp = 0, offset;
|
u32 tmp = 0, offset;
|
||||||
|
|
||||||
if (!dig->afmt->pin)
|
if (!dig || !dig->afmt || !dig->afmt->pin)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
offset = dig->afmt->pin->offset;
|
offset = dig->afmt->pin->offset;
|
||||||
|
@ -156,7 +158,7 @@ void dce6_afmt_write_speaker_allocation(struct drm_encoder *encoder)
|
||||||
u8 *sadb;
|
u8 *sadb;
|
||||||
int sad_count;
|
int sad_count;
|
||||||
|
|
||||||
if (!dig->afmt->pin)
|
if (!dig || !dig->afmt || !dig->afmt->pin)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
offset = dig->afmt->pin->offset;
|
offset = dig->afmt->pin->offset;
|
||||||
|
@ -217,7 +219,7 @@ void dce6_afmt_write_sad_regs(struct drm_encoder *encoder)
|
||||||
{ AZ_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR13, HDMI_AUDIO_CODING_TYPE_WMA_PRO },
|
{ AZ_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR13, HDMI_AUDIO_CODING_TYPE_WMA_PRO },
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!dig->afmt->pin)
|
if (!dig || !dig->afmt || !dig->afmt->pin)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
offset = dig->afmt->pin->offset;
|
offset = dig->afmt->pin->offset;
|
||||||
|
|
|
@ -785,8 +785,8 @@ static void ni_apply_state_adjust_rules(struct radeon_device *rdev,
|
||||||
struct ni_ps *ps = ni_get_ps(rps);
|
struct ni_ps *ps = ni_get_ps(rps);
|
||||||
struct radeon_clock_and_voltage_limits *max_limits;
|
struct radeon_clock_and_voltage_limits *max_limits;
|
||||||
bool disable_mclk_switching;
|
bool disable_mclk_switching;
|
||||||
u32 mclk, sclk;
|
u32 mclk;
|
||||||
u16 vddc, vddci;
|
u16 vddci;
|
||||||
u32 max_sclk_vddc, max_mclk_vddci, max_mclk_vddc;
|
u32 max_sclk_vddc, max_mclk_vddci, max_mclk_vddc;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
@ -839,24 +839,14 @@ static void ni_apply_state_adjust_rules(struct radeon_device *rdev,
|
||||||
|
|
||||||
/* XXX validate the min clocks required for display */
|
/* XXX validate the min clocks required for display */
|
||||||
|
|
||||||
|
/* adjust low state */
|
||||||
if (disable_mclk_switching) {
|
if (disable_mclk_switching) {
|
||||||
mclk = ps->performance_levels[ps->performance_level_count - 1].mclk;
|
ps->performance_levels[0].mclk =
|
||||||
sclk = ps->performance_levels[0].sclk;
|
ps->performance_levels[ps->performance_level_count - 1].mclk;
|
||||||
vddc = ps->performance_levels[0].vddc;
|
ps->performance_levels[0].vddci =
|
||||||
vddci = ps->performance_levels[ps->performance_level_count - 1].vddci;
|
ps->performance_levels[ps->performance_level_count - 1].vddci;
|
||||||
} else {
|
|
||||||
sclk = ps->performance_levels[0].sclk;
|
|
||||||
mclk = ps->performance_levels[0].mclk;
|
|
||||||
vddc = ps->performance_levels[0].vddc;
|
|
||||||
vddci = ps->performance_levels[0].vddci;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* adjusted low state */
|
|
||||||
ps->performance_levels[0].sclk = sclk;
|
|
||||||
ps->performance_levels[0].mclk = mclk;
|
|
||||||
ps->performance_levels[0].vddc = vddc;
|
|
||||||
ps->performance_levels[0].vddci = vddci;
|
|
||||||
|
|
||||||
btc_skip_blacklist_clocks(rdev, max_limits->sclk, max_limits->mclk,
|
btc_skip_blacklist_clocks(rdev, max_limits->sclk, max_limits->mclk,
|
||||||
&ps->performance_levels[0].sclk,
|
&ps->performance_levels[0].sclk,
|
||||||
&ps->performance_levels[0].mclk);
|
&ps->performance_levels[0].mclk);
|
||||||
|
@ -868,11 +858,15 @@ static void ni_apply_state_adjust_rules(struct radeon_device *rdev,
|
||||||
ps->performance_levels[i].vddc = ps->performance_levels[i - 1].vddc;
|
ps->performance_levels[i].vddc = ps->performance_levels[i - 1].vddc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* adjust remaining states */
|
||||||
if (disable_mclk_switching) {
|
if (disable_mclk_switching) {
|
||||||
mclk = ps->performance_levels[0].mclk;
|
mclk = ps->performance_levels[0].mclk;
|
||||||
|
vddci = ps->performance_levels[0].vddci;
|
||||||
for (i = 1; i < ps->performance_level_count; i++) {
|
for (i = 1; i < ps->performance_level_count; i++) {
|
||||||
if (mclk < ps->performance_levels[i].mclk)
|
if (mclk < ps->performance_levels[i].mclk)
|
||||||
mclk = ps->performance_levels[i].mclk;
|
mclk = ps->performance_levels[i].mclk;
|
||||||
|
if (vddci < ps->performance_levels[i].vddci)
|
||||||
|
vddci = ps->performance_levels[i].vddci;
|
||||||
}
|
}
|
||||||
for (i = 0; i < ps->performance_level_count; i++) {
|
for (i = 0; i < ps->performance_level_count; i++) {
|
||||||
ps->performance_levels[i].mclk = mclk;
|
ps->performance_levels[i].mclk = mclk;
|
||||||
|
|
|
@ -304,9 +304,9 @@ void r600_audio_set_dto(struct drm_encoder *encoder, u32 clock)
|
||||||
WREG32(DCCG_AUDIO_DTO1_MODULE, dto_modulo);
|
WREG32(DCCG_AUDIO_DTO1_MODULE, dto_modulo);
|
||||||
WREG32(DCCG_AUDIO_DTO_SELECT, 1); /* select DTO1 */
|
WREG32(DCCG_AUDIO_DTO_SELECT, 1); /* select DTO1 */
|
||||||
}
|
}
|
||||||
} else if (ASIC_IS_DCE3(rdev)) {
|
} else {
|
||||||
/* according to the reg specs, this should DCE3.2 only, but in
|
/* according to the reg specs, this should DCE3.2 only, but in
|
||||||
* practice it seems to cover DCE3.0/3.1 as well.
|
* practice it seems to cover DCE2.0/3.0/3.1 as well.
|
||||||
*/
|
*/
|
||||||
if (dig->dig_encoder == 0) {
|
if (dig->dig_encoder == 0) {
|
||||||
WREG32(DCCG_AUDIO_DTO0_PHASE, base_rate * 100);
|
WREG32(DCCG_AUDIO_DTO0_PHASE, base_rate * 100);
|
||||||
|
@ -317,10 +317,6 @@ void r600_audio_set_dto(struct drm_encoder *encoder, u32 clock)
|
||||||
WREG32(DCCG_AUDIO_DTO1_MODULE, clock * 100);
|
WREG32(DCCG_AUDIO_DTO1_MODULE, clock * 100);
|
||||||
WREG32(DCCG_AUDIO_DTO_SELECT, 1); /* select DTO1 */
|
WREG32(DCCG_AUDIO_DTO_SELECT, 1); /* select DTO1 */
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
/* according to the reg specs, this should be DCE2.0 and DCE3.0/3.1 */
|
|
||||||
WREG32(AUDIO_DTO, AUDIO_DTO_PHASE(base_rate / 10) |
|
|
||||||
AUDIO_DTO_MODULE(clock / 10));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2710,10 +2710,10 @@ void radeon_vm_fence(struct radeon_device *rdev,
|
||||||
struct radeon_vm *vm,
|
struct radeon_vm *vm,
|
||||||
struct radeon_fence *fence);
|
struct radeon_fence *fence);
|
||||||
uint64_t radeon_vm_map_gart(struct radeon_device *rdev, uint64_t addr);
|
uint64_t radeon_vm_map_gart(struct radeon_device *rdev, uint64_t addr);
|
||||||
int radeon_vm_bo_update_pte(struct radeon_device *rdev,
|
int radeon_vm_bo_update(struct radeon_device *rdev,
|
||||||
struct radeon_vm *vm,
|
struct radeon_vm *vm,
|
||||||
struct radeon_bo *bo,
|
struct radeon_bo *bo,
|
||||||
struct ttm_mem_reg *mem);
|
struct ttm_mem_reg *mem);
|
||||||
void radeon_vm_bo_invalidate(struct radeon_device *rdev,
|
void radeon_vm_bo_invalidate(struct radeon_device *rdev,
|
||||||
struct radeon_bo *bo);
|
struct radeon_bo *bo);
|
||||||
struct radeon_bo_va *radeon_vm_bo_find(struct radeon_vm *vm,
|
struct radeon_bo_va *radeon_vm_bo_find(struct radeon_vm *vm,
|
||||||
|
|
|
@ -2918,7 +2918,7 @@ int radeon_atom_get_memory_pll_dividers(struct radeon_device *rdev,
|
||||||
mpll_param->dll_speed = args.ucDllSpeed;
|
mpll_param->dll_speed = args.ucDllSpeed;
|
||||||
mpll_param->bwcntl = args.ucBWCntl;
|
mpll_param->bwcntl = args.ucBWCntl;
|
||||||
mpll_param->vco_mode =
|
mpll_param->vco_mode =
|
||||||
(args.ucPllCntlFlag & MPLL_CNTL_FLAG_VCO_MODE_MASK) ? 1 : 0;
|
(args.ucPllCntlFlag & MPLL_CNTL_FLAG_VCO_MODE_MASK);
|
||||||
mpll_param->yclk_sel =
|
mpll_param->yclk_sel =
|
||||||
(args.ucPllCntlFlag & MPLL_CNTL_FLAG_BYPASS_DQ_PLL) ? 1 : 0;
|
(args.ucPllCntlFlag & MPLL_CNTL_FLAG_BYPASS_DQ_PLL) ? 1 : 0;
|
||||||
mpll_param->qdr =
|
mpll_param->qdr =
|
||||||
|
|
|
@ -360,13 +360,13 @@ static int radeon_bo_vm_update_pte(struct radeon_cs_parser *parser,
|
||||||
struct radeon_bo *bo;
|
struct radeon_bo *bo;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
r = radeon_vm_bo_update_pte(rdev, vm, rdev->ring_tmp_bo.bo, &rdev->ring_tmp_bo.bo->tbo.mem);
|
r = radeon_vm_bo_update(rdev, vm, rdev->ring_tmp_bo.bo, &rdev->ring_tmp_bo.bo->tbo.mem);
|
||||||
if (r) {
|
if (r) {
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
list_for_each_entry(lobj, &parser->validated, tv.head) {
|
list_for_each_entry(lobj, &parser->validated, tv.head) {
|
||||||
bo = lobj->bo;
|
bo = lobj->bo;
|
||||||
r = radeon_vm_bo_update_pte(parser->rdev, vm, bo, &bo->tbo.mem);
|
r = radeon_vm_bo_update(parser->rdev, vm, bo, &bo->tbo.mem);
|
||||||
if (r) {
|
if (r) {
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
|
@ -108,9 +108,10 @@
|
||||||
* 1.31- Add support for num Z pipes from GET_PARAM
|
* 1.31- Add support for num Z pipes from GET_PARAM
|
||||||
* 1.32- fixes for rv740 setup
|
* 1.32- fixes for rv740 setup
|
||||||
* 1.33- Add r6xx/r7xx const buffer support
|
* 1.33- Add r6xx/r7xx const buffer support
|
||||||
|
* 1.34- fix evergreen/cayman GS register
|
||||||
*/
|
*/
|
||||||
#define DRIVER_MAJOR 1
|
#define DRIVER_MAJOR 1
|
||||||
#define DRIVER_MINOR 33
|
#define DRIVER_MINOR 34
|
||||||
#define DRIVER_PATCHLEVEL 0
|
#define DRIVER_PATCHLEVEL 0
|
||||||
|
|
||||||
long radeon_drm_ioctl(struct file *filp,
|
long radeon_drm_ioctl(struct file *filp,
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
#include <drm/radeon_drm.h>
|
#include <drm/radeon_drm.h>
|
||||||
#include "radeon.h"
|
#include "radeon.h"
|
||||||
#include "radeon_reg.h"
|
#include "radeon_reg.h"
|
||||||
|
#include "radeon_trace.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* GART
|
* GART
|
||||||
|
@ -737,6 +738,7 @@ struct radeon_fence *radeon_vm_grab_id(struct radeon_device *rdev,
|
||||||
for (i = 0; i < 2; ++i) {
|
for (i = 0; i < 2; ++i) {
|
||||||
if (choices[i]) {
|
if (choices[i]) {
|
||||||
vm->id = choices[i];
|
vm->id = choices[i];
|
||||||
|
trace_radeon_vm_grab_id(vm->id, ring);
|
||||||
return rdev->vm_manager.active[choices[i]];
|
return rdev->vm_manager.active[choices[i]];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1116,7 +1118,7 @@ static void radeon_vm_update_ptes(struct radeon_device *rdev,
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* radeon_vm_bo_update_pte - map a bo into the vm page table
|
* radeon_vm_bo_update - map a bo into the vm page table
|
||||||
*
|
*
|
||||||
* @rdev: radeon_device pointer
|
* @rdev: radeon_device pointer
|
||||||
* @vm: requested vm
|
* @vm: requested vm
|
||||||
|
@ -1128,10 +1130,10 @@ static void radeon_vm_update_ptes(struct radeon_device *rdev,
|
||||||
*
|
*
|
||||||
* Object have to be reserved & global and local mutex must be locked!
|
* Object have to be reserved & global and local mutex must be locked!
|
||||||
*/
|
*/
|
||||||
int radeon_vm_bo_update_pte(struct radeon_device *rdev,
|
int radeon_vm_bo_update(struct radeon_device *rdev,
|
||||||
struct radeon_vm *vm,
|
struct radeon_vm *vm,
|
||||||
struct radeon_bo *bo,
|
struct radeon_bo *bo,
|
||||||
struct ttm_mem_reg *mem)
|
struct ttm_mem_reg *mem)
|
||||||
{
|
{
|
||||||
struct radeon_ib ib;
|
struct radeon_ib ib;
|
||||||
struct radeon_bo_va *bo_va;
|
struct radeon_bo_va *bo_va;
|
||||||
|
@ -1176,6 +1178,8 @@ int radeon_vm_bo_update_pte(struct radeon_device *rdev,
|
||||||
bo_va->valid = false;
|
bo_va->valid = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
trace_radeon_vm_bo_update(bo_va);
|
||||||
|
|
||||||
nptes = radeon_bo_ngpu_pages(bo);
|
nptes = radeon_bo_ngpu_pages(bo);
|
||||||
|
|
||||||
/* assume two extra pdes in case the mapping overlaps the borders */
|
/* assume two extra pdes in case the mapping overlaps the borders */
|
||||||
|
@ -1257,7 +1261,7 @@ int radeon_vm_bo_rmv(struct radeon_device *rdev,
|
||||||
mutex_lock(&rdev->vm_manager.lock);
|
mutex_lock(&rdev->vm_manager.lock);
|
||||||
mutex_lock(&bo_va->vm->mutex);
|
mutex_lock(&bo_va->vm->mutex);
|
||||||
if (bo_va->soffset) {
|
if (bo_va->soffset) {
|
||||||
r = radeon_vm_bo_update_pte(rdev, bo_va->vm, bo_va->bo, NULL);
|
r = radeon_vm_bo_update(rdev, bo_va->vm, bo_va->bo, NULL);
|
||||||
}
|
}
|
||||||
mutex_unlock(&rdev->vm_manager.lock);
|
mutex_unlock(&rdev->vm_manager.lock);
|
||||||
list_del(&bo_va->vm_list);
|
list_del(&bo_va->vm_list);
|
||||||
|
|
|
@ -537,8 +537,7 @@ static ssize_t radeon_hwmon_show_temp(struct device *dev,
|
||||||
struct device_attribute *attr,
|
struct device_attribute *attr,
|
||||||
char *buf)
|
char *buf)
|
||||||
{
|
{
|
||||||
struct drm_device *ddev = dev_get_drvdata(dev);
|
struct radeon_device *rdev = dev_get_drvdata(dev);
|
||||||
struct radeon_device *rdev = ddev->dev_private;
|
|
||||||
int temp;
|
int temp;
|
||||||
|
|
||||||
if (rdev->asic->pm.get_temperature)
|
if (rdev->asic->pm.get_temperature)
|
||||||
|
@ -566,23 +565,14 @@ static ssize_t radeon_hwmon_show_temp_thresh(struct device *dev,
|
||||||
return snprintf(buf, PAGE_SIZE, "%d\n", temp);
|
return snprintf(buf, PAGE_SIZE, "%d\n", temp);
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t radeon_hwmon_show_name(struct device *dev,
|
|
||||||
struct device_attribute *attr,
|
|
||||||
char *buf)
|
|
||||||
{
|
|
||||||
return sprintf(buf, "radeon\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, radeon_hwmon_show_temp, NULL, 0);
|
static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, radeon_hwmon_show_temp, NULL, 0);
|
||||||
static SENSOR_DEVICE_ATTR(temp1_crit, S_IRUGO, radeon_hwmon_show_temp_thresh, NULL, 0);
|
static SENSOR_DEVICE_ATTR(temp1_crit, S_IRUGO, radeon_hwmon_show_temp_thresh, NULL, 0);
|
||||||
static SENSOR_DEVICE_ATTR(temp1_crit_hyst, S_IRUGO, radeon_hwmon_show_temp_thresh, NULL, 1);
|
static SENSOR_DEVICE_ATTR(temp1_crit_hyst, S_IRUGO, radeon_hwmon_show_temp_thresh, NULL, 1);
|
||||||
static SENSOR_DEVICE_ATTR(name, S_IRUGO, radeon_hwmon_show_name, NULL, 0);
|
|
||||||
|
|
||||||
static struct attribute *hwmon_attributes[] = {
|
static struct attribute *hwmon_attributes[] = {
|
||||||
&sensor_dev_attr_temp1_input.dev_attr.attr,
|
&sensor_dev_attr_temp1_input.dev_attr.attr,
|
||||||
&sensor_dev_attr_temp1_crit.dev_attr.attr,
|
&sensor_dev_attr_temp1_crit.dev_attr.attr,
|
||||||
&sensor_dev_attr_temp1_crit_hyst.dev_attr.attr,
|
&sensor_dev_attr_temp1_crit_hyst.dev_attr.attr,
|
||||||
&sensor_dev_attr_name.dev_attr.attr,
|
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -607,11 +597,15 @@ static const struct attribute_group hwmon_attrgroup = {
|
||||||
.is_visible = hwmon_attributes_visible,
|
.is_visible = hwmon_attributes_visible,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct attribute_group *hwmon_groups[] = {
|
||||||
|
&hwmon_attrgroup,
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
static int radeon_hwmon_init(struct radeon_device *rdev)
|
static int radeon_hwmon_init(struct radeon_device *rdev)
|
||||||
{
|
{
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
struct device *hwmon_dev;
|
||||||
rdev->pm.int_hwmon_dev = NULL;
|
|
||||||
|
|
||||||
switch (rdev->pm.int_thermal_type) {
|
switch (rdev->pm.int_thermal_type) {
|
||||||
case THERMAL_TYPE_RV6XX:
|
case THERMAL_TYPE_RV6XX:
|
||||||
|
@ -624,20 +618,13 @@ static int radeon_hwmon_init(struct radeon_device *rdev)
|
||||||
case THERMAL_TYPE_KV:
|
case THERMAL_TYPE_KV:
|
||||||
if (rdev->asic->pm.get_temperature == NULL)
|
if (rdev->asic->pm.get_temperature == NULL)
|
||||||
return err;
|
return err;
|
||||||
rdev->pm.int_hwmon_dev = hwmon_device_register(rdev->dev);
|
hwmon_dev = hwmon_device_register_with_groups(rdev->dev,
|
||||||
if (IS_ERR(rdev->pm.int_hwmon_dev)) {
|
"radeon", rdev,
|
||||||
err = PTR_ERR(rdev->pm.int_hwmon_dev);
|
hwmon_groups);
|
||||||
|
if (IS_ERR(hwmon_dev)) {
|
||||||
|
err = PTR_ERR(hwmon_dev);
|
||||||
dev_err(rdev->dev,
|
dev_err(rdev->dev,
|
||||||
"Unable to register hwmon device: %d\n", err);
|
"Unable to register hwmon device: %d\n", err);
|
||||||
break;
|
|
||||||
}
|
|
||||||
dev_set_drvdata(rdev->pm.int_hwmon_dev, rdev->ddev);
|
|
||||||
err = sysfs_create_group(&rdev->pm.int_hwmon_dev->kobj,
|
|
||||||
&hwmon_attrgroup);
|
|
||||||
if (err) {
|
|
||||||
dev_err(rdev->dev,
|
|
||||||
"Unable to create hwmon sysfs file: %d\n", err);
|
|
||||||
hwmon_device_unregister(rdev->dev);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -647,14 +634,6 @@ static int radeon_hwmon_init(struct radeon_device *rdev)
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void radeon_hwmon_fini(struct radeon_device *rdev)
|
|
||||||
{
|
|
||||||
if (rdev->pm.int_hwmon_dev) {
|
|
||||||
sysfs_remove_group(&rdev->pm.int_hwmon_dev->kobj, &hwmon_attrgroup);
|
|
||||||
hwmon_device_unregister(rdev->pm.int_hwmon_dev);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void radeon_dpm_thermal_work_handler(struct work_struct *work)
|
static void radeon_dpm_thermal_work_handler(struct work_struct *work)
|
||||||
{
|
{
|
||||||
struct radeon_device *rdev =
|
struct radeon_device *rdev =
|
||||||
|
@ -1337,8 +1316,6 @@ static void radeon_pm_fini_old(struct radeon_device *rdev)
|
||||||
|
|
||||||
if (rdev->pm.power_state)
|
if (rdev->pm.power_state)
|
||||||
kfree(rdev->pm.power_state);
|
kfree(rdev->pm.power_state);
|
||||||
|
|
||||||
radeon_hwmon_fini(rdev);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void radeon_pm_fini_dpm(struct radeon_device *rdev)
|
static void radeon_pm_fini_dpm(struct radeon_device *rdev)
|
||||||
|
@ -1358,8 +1335,6 @@ static void radeon_pm_fini_dpm(struct radeon_device *rdev)
|
||||||
|
|
||||||
if (rdev->pm.power_state)
|
if (rdev->pm.power_state)
|
||||||
kfree(rdev->pm.power_state);
|
kfree(rdev->pm.power_state);
|
||||||
|
|
||||||
radeon_hwmon_fini(rdev);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void radeon_pm_fini(struct radeon_device *rdev)
|
void radeon_pm_fini(struct radeon_device *rdev)
|
||||||
|
|
|
@ -47,6 +47,39 @@ TRACE_EVENT(radeon_cs,
|
||||||
__entry->fences)
|
__entry->fences)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
TRACE_EVENT(radeon_vm_grab_id,
|
||||||
|
TP_PROTO(unsigned vmid, int ring),
|
||||||
|
TP_ARGS(vmid, ring),
|
||||||
|
TP_STRUCT__entry(
|
||||||
|
__field(u32, vmid)
|
||||||
|
__field(u32, ring)
|
||||||
|
),
|
||||||
|
|
||||||
|
TP_fast_assign(
|
||||||
|
__entry->vmid = vmid;
|
||||||
|
__entry->ring = ring;
|
||||||
|
),
|
||||||
|
TP_printk("vmid=%u, ring=%u", __entry->vmid, __entry->ring)
|
||||||
|
);
|
||||||
|
|
||||||
|
TRACE_EVENT(radeon_vm_bo_update,
|
||||||
|
TP_PROTO(struct radeon_bo_va *bo_va),
|
||||||
|
TP_ARGS(bo_va),
|
||||||
|
TP_STRUCT__entry(
|
||||||
|
__field(u64, soffset)
|
||||||
|
__field(u64, eoffset)
|
||||||
|
__field(u32, flags)
|
||||||
|
),
|
||||||
|
|
||||||
|
TP_fast_assign(
|
||||||
|
__entry->soffset = bo_va->soffset;
|
||||||
|
__entry->eoffset = bo_va->eoffset;
|
||||||
|
__entry->flags = bo_va->flags;
|
||||||
|
),
|
||||||
|
TP_printk("soffs=%010llx, eoffs=%010llx, flags=%08x",
|
||||||
|
__entry->soffset, __entry->eoffset, __entry->flags)
|
||||||
|
);
|
||||||
|
|
||||||
TRACE_EVENT(radeon_vm_set_page,
|
TRACE_EVENT(radeon_vm_set_page,
|
||||||
TP_PROTO(uint64_t pe, uint64_t addr, unsigned count,
|
TP_PROTO(uint64_t pe, uint64_t addr, unsigned count,
|
||||||
uint32_t incr, uint32_t flags),
|
uint32_t incr, uint32_t flags),
|
||||||
|
|
|
@ -21,7 +21,7 @@ cayman 0x9400
|
||||||
0x000089AC VGT_COMPUTE_THREAD_GOURP_SIZE
|
0x000089AC VGT_COMPUTE_THREAD_GOURP_SIZE
|
||||||
0x000089B0 VGT_HS_OFFCHIP_PARAM
|
0x000089B0 VGT_HS_OFFCHIP_PARAM
|
||||||
0x00008A14 PA_CL_ENHANCE
|
0x00008A14 PA_CL_ENHANCE
|
||||||
0x00008A60 PA_SC_LINE_STIPPLE_VALUE
|
0x00008A60 PA_SU_LINE_STIPPLE_VALUE
|
||||||
0x00008B10 PA_SC_LINE_STIPPLE_STATE
|
0x00008B10 PA_SC_LINE_STIPPLE_STATE
|
||||||
0x00008BF0 PA_SC_ENHANCE
|
0x00008BF0 PA_SC_ENHANCE
|
||||||
0x00008D8C SQ_DYN_GPR_CNTL_PS_FLUSH_REQ
|
0x00008D8C SQ_DYN_GPR_CNTL_PS_FLUSH_REQ
|
||||||
|
@ -532,7 +532,7 @@ cayman 0x9400
|
||||||
0x00028B84 PA_SU_POLY_OFFSET_FRONT_OFFSET
|
0x00028B84 PA_SU_POLY_OFFSET_FRONT_OFFSET
|
||||||
0x00028B88 PA_SU_POLY_OFFSET_BACK_SCALE
|
0x00028B88 PA_SU_POLY_OFFSET_BACK_SCALE
|
||||||
0x00028B8C PA_SU_POLY_OFFSET_BACK_OFFSET
|
0x00028B8C PA_SU_POLY_OFFSET_BACK_OFFSET
|
||||||
0x00028B74 VGT_GS_INSTANCE_CNT
|
0x00028B90 VGT_GS_INSTANCE_CNT
|
||||||
0x00028BD4 PA_SC_CENTROID_PRIORITY_0
|
0x00028BD4 PA_SC_CENTROID_PRIORITY_0
|
||||||
0x00028BD8 PA_SC_CENTROID_PRIORITY_1
|
0x00028BD8 PA_SC_CENTROID_PRIORITY_1
|
||||||
0x00028BDC PA_SC_LINE_CNTL
|
0x00028BDC PA_SC_LINE_CNTL
|
||||||
|
|
|
@ -22,7 +22,7 @@ evergreen 0x9400
|
||||||
0x000089A4 VGT_COMPUTE_START_Z
|
0x000089A4 VGT_COMPUTE_START_Z
|
||||||
0x000089AC VGT_COMPUTE_THREAD_GOURP_SIZE
|
0x000089AC VGT_COMPUTE_THREAD_GOURP_SIZE
|
||||||
0x00008A14 PA_CL_ENHANCE
|
0x00008A14 PA_CL_ENHANCE
|
||||||
0x00008A60 PA_SC_LINE_STIPPLE_VALUE
|
0x00008A60 PA_SU_LINE_STIPPLE_VALUE
|
||||||
0x00008B10 PA_SC_LINE_STIPPLE_STATE
|
0x00008B10 PA_SC_LINE_STIPPLE_STATE
|
||||||
0x00008BF0 PA_SC_ENHANCE
|
0x00008BF0 PA_SC_ENHANCE
|
||||||
0x00008D8C SQ_DYN_GPR_CNTL_PS_FLUSH_REQ
|
0x00008D8C SQ_DYN_GPR_CNTL_PS_FLUSH_REQ
|
||||||
|
@ -545,7 +545,7 @@ evergreen 0x9400
|
||||||
0x00028B84 PA_SU_POLY_OFFSET_FRONT_OFFSET
|
0x00028B84 PA_SU_POLY_OFFSET_FRONT_OFFSET
|
||||||
0x00028B88 PA_SU_POLY_OFFSET_BACK_SCALE
|
0x00028B88 PA_SU_POLY_OFFSET_BACK_SCALE
|
||||||
0x00028B8C PA_SU_POLY_OFFSET_BACK_OFFSET
|
0x00028B8C PA_SU_POLY_OFFSET_BACK_OFFSET
|
||||||
0x00028B74 VGT_GS_INSTANCE_CNT
|
0x00028B90 VGT_GS_INSTANCE_CNT
|
||||||
0x00028C00 PA_SC_LINE_CNTL
|
0x00028C00 PA_SC_LINE_CNTL
|
||||||
0x00028C08 PA_SU_VTX_CNTL
|
0x00028C08 PA_SU_VTX_CNTL
|
||||||
0x00028C0C PA_CL_GB_VERT_CLIP_ADJ
|
0x00028C0C PA_CL_GB_VERT_CLIP_ADJ
|
||||||
|
|
|
@ -3882,8 +3882,15 @@ static int si_mc_init(struct radeon_device *rdev)
|
||||||
rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0);
|
rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0);
|
||||||
rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0);
|
rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0);
|
||||||
/* size in MB on si */
|
/* size in MB on si */
|
||||||
rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE) * 1024ULL * 1024ULL;
|
tmp = RREG32(CONFIG_MEMSIZE);
|
||||||
rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE) * 1024ULL * 1024ULL;
|
/* some boards may have garbage in the upper 16 bits */
|
||||||
|
if (tmp & 0xffff0000) {
|
||||||
|
DRM_INFO("Probable bad vram size: 0x%08x\n", tmp);
|
||||||
|
if (tmp & 0xffff)
|
||||||
|
tmp &= 0xffff;
|
||||||
|
}
|
||||||
|
rdev->mc.mc_vram_size = tmp * 1024ULL * 1024ULL;
|
||||||
|
rdev->mc.real_vram_size = rdev->mc.mc_vram_size;
|
||||||
rdev->mc.visible_vram_size = rdev->mc.aper_size;
|
rdev->mc.visible_vram_size = rdev->mc.aper_size;
|
||||||
si_vram_gtt_location(rdev, &rdev->mc);
|
si_vram_gtt_location(rdev, &rdev->mc);
|
||||||
radeon_update_bandwidth_info(rdev);
|
radeon_update_bandwidth_info(rdev);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue