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
|
@ -44,7 +44,7 @@ static int radeon_process_i2c_ch(struct radeon_i2c_chan *chan,
|
|||
PROCESS_I2C_CHANNEL_TRANSACTION_PS_ALLOCATION args;
|
||||
int index = GetIndexIntoMasterTable(COMMAND, ProcessI2cChannelTransaction);
|
||||
unsigned char *base;
|
||||
u16 out;
|
||||
u16 out = cpu_to_le16(0);
|
||||
|
||||
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);
|
||||
return -EINVAL;
|
||||
}
|
||||
args.ucRegIndex = buf[0];
|
||||
if (num > 1) {
|
||||
if (buf == NULL)
|
||||
args.ucRegIndex = 0;
|
||||
else
|
||||
args.ucRegIndex = buf[0];
|
||||
if (num)
|
||||
num--;
|
||||
if (num)
|
||||
memcpy(&out, &buf[1], num);
|
||||
}
|
||||
args.lpI2CDataOut = cpu_to_le16(out);
|
||||
} else {
|
||||
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 i2c_msg *p;
|
||||
int i, remaining, current_count, buffer_offset, max_bytes, ret;
|
||||
u8 buf = 0, flags;
|
||||
u8 flags;
|
||||
|
||||
/* check for bus probe */
|
||||
p = &msgs[0];
|
||||
if ((num == 1) && (p->len == 0)) {
|
||||
ret = radeon_process_i2c_ch(i2c,
|
||||
p->addr, HW_I2C_WRITE,
|
||||
&buf, 1);
|
||||
NULL, 0);
|
||||
if (ret)
|
||||
return ret;
|
||||
else
|
||||
|
|
|
@ -93,11 +93,13 @@ void dce6_afmt_select_pin(struct drm_encoder *encoder)
|
|||
struct radeon_device *rdev = encoder->dev->dev_private;
|
||||
struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
|
||||
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;
|
||||
|
||||
offset = dig->afmt->offset;
|
||||
|
||||
WREG32(AFMT_AUDIO_SRC_CONTROL + offset,
|
||||
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;
|
||||
u32 tmp = 0, offset;
|
||||
|
||||
if (!dig->afmt->pin)
|
||||
if (!dig || !dig->afmt || !dig->afmt->pin)
|
||||
return;
|
||||
|
||||
offset = dig->afmt->pin->offset;
|
||||
|
@ -156,7 +158,7 @@ void dce6_afmt_write_speaker_allocation(struct drm_encoder *encoder)
|
|||
u8 *sadb;
|
||||
int sad_count;
|
||||
|
||||
if (!dig->afmt->pin)
|
||||
if (!dig || !dig->afmt || !dig->afmt->pin)
|
||||
return;
|
||||
|
||||
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 },
|
||||
};
|
||||
|
||||
if (!dig->afmt->pin)
|
||||
if (!dig || !dig->afmt || !dig->afmt->pin)
|
||||
return;
|
||||
|
||||
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 radeon_clock_and_voltage_limits *max_limits;
|
||||
bool disable_mclk_switching;
|
||||
u32 mclk, sclk;
|
||||
u16 vddc, vddci;
|
||||
u32 mclk;
|
||||
u16 vddci;
|
||||
u32 max_sclk_vddc, max_mclk_vddci, max_mclk_vddc;
|
||||
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 */
|
||||
|
||||
/* adjust low state */
|
||||
if (disable_mclk_switching) {
|
||||
mclk = ps->performance_levels[ps->performance_level_count - 1].mclk;
|
||||
sclk = ps->performance_levels[0].sclk;
|
||||
vddc = ps->performance_levels[0].vddc;
|
||||
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;
|
||||
ps->performance_levels[0].mclk =
|
||||
ps->performance_levels[ps->performance_level_count - 1].mclk;
|
||||
ps->performance_levels[0].vddci =
|
||||
ps->performance_levels[ps->performance_level_count - 1].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,
|
||||
&ps->performance_levels[0].sclk,
|
||||
&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;
|
||||
}
|
||||
|
||||
/* adjust remaining states */
|
||||
if (disable_mclk_switching) {
|
||||
mclk = ps->performance_levels[0].mclk;
|
||||
vddci = ps->performance_levels[0].vddci;
|
||||
for (i = 1; i < ps->performance_level_count; i++) {
|
||||
if (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++) {
|
||||
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_DTO_SELECT, 1); /* select DTO1 */
|
||||
}
|
||||
} else if (ASIC_IS_DCE3(rdev)) {
|
||||
} else {
|
||||
/* 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) {
|
||||
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_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_fence *fence);
|
||||
uint64_t radeon_vm_map_gart(struct radeon_device *rdev, uint64_t addr);
|
||||
int radeon_vm_bo_update_pte(struct radeon_device *rdev,
|
||||
struct radeon_vm *vm,
|
||||
struct radeon_bo *bo,
|
||||
struct ttm_mem_reg *mem);
|
||||
int radeon_vm_bo_update(struct radeon_device *rdev,
|
||||
struct radeon_vm *vm,
|
||||
struct radeon_bo *bo,
|
||||
struct ttm_mem_reg *mem);
|
||||
void radeon_vm_bo_invalidate(struct radeon_device *rdev,
|
||||
struct radeon_bo *bo);
|
||||
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->bwcntl = args.ucBWCntl;
|
||||
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 =
|
||||
(args.ucPllCntlFlag & MPLL_CNTL_FLAG_BYPASS_DQ_PLL) ? 1 : 0;
|
||||
mpll_param->qdr =
|
||||
|
|
|
@ -360,13 +360,13 @@ static int radeon_bo_vm_update_pte(struct radeon_cs_parser *parser,
|
|||
struct radeon_bo *bo;
|
||||
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) {
|
||||
return r;
|
||||
}
|
||||
list_for_each_entry(lobj, &parser->validated, tv.head) {
|
||||
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) {
|
||||
return r;
|
||||
}
|
||||
|
|
|
@ -108,9 +108,10 @@
|
|||
* 1.31- Add support for num Z pipes from GET_PARAM
|
||||
* 1.32- fixes for rv740 setup
|
||||
* 1.33- Add r6xx/r7xx const buffer support
|
||||
* 1.34- fix evergreen/cayman GS register
|
||||
*/
|
||||
#define DRIVER_MAJOR 1
|
||||
#define DRIVER_MINOR 33
|
||||
#define DRIVER_MINOR 34
|
||||
#define DRIVER_PATCHLEVEL 0
|
||||
|
||||
long radeon_drm_ioctl(struct file *filp,
|
||||
|
|
|
@ -29,6 +29,7 @@
|
|||
#include <drm/radeon_drm.h>
|
||||
#include "radeon.h"
|
||||
#include "radeon_reg.h"
|
||||
#include "radeon_trace.h"
|
||||
|
||||
/*
|
||||
* GART
|
||||
|
@ -737,6 +738,7 @@ struct radeon_fence *radeon_vm_grab_id(struct radeon_device *rdev,
|
|||
for (i = 0; i < 2; ++i) {
|
||||
if (choices[i]) {
|
||||
vm->id = choices[i];
|
||||
trace_radeon_vm_grab_id(vm->id, ring);
|
||||
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
|
||||
* @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!
|
||||
*/
|
||||
int radeon_vm_bo_update_pte(struct radeon_device *rdev,
|
||||
struct radeon_vm *vm,
|
||||
struct radeon_bo *bo,
|
||||
struct ttm_mem_reg *mem)
|
||||
int radeon_vm_bo_update(struct radeon_device *rdev,
|
||||
struct radeon_vm *vm,
|
||||
struct radeon_bo *bo,
|
||||
struct ttm_mem_reg *mem)
|
||||
{
|
||||
struct radeon_ib ib;
|
||||
struct radeon_bo_va *bo_va;
|
||||
|
@ -1176,6 +1178,8 @@ int radeon_vm_bo_update_pte(struct radeon_device *rdev,
|
|||
bo_va->valid = false;
|
||||
}
|
||||
|
||||
trace_radeon_vm_bo_update(bo_va);
|
||||
|
||||
nptes = radeon_bo_ngpu_pages(bo);
|
||||
|
||||
/* 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(&bo_va->vm->mutex);
|
||||
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);
|
||||
list_del(&bo_va->vm_list);
|
||||
|
|
|
@ -537,8 +537,7 @@ static ssize_t radeon_hwmon_show_temp(struct device *dev,
|
|||
struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct drm_device *ddev = dev_get_drvdata(dev);
|
||||
struct radeon_device *rdev = ddev->dev_private;
|
||||
struct radeon_device *rdev = dev_get_drvdata(dev);
|
||||
int temp;
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
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_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(name, S_IRUGO, radeon_hwmon_show_name, NULL, 0);
|
||||
|
||||
static struct attribute *hwmon_attributes[] = {
|
||||
&sensor_dev_attr_temp1_input.dev_attr.attr,
|
||||
&sensor_dev_attr_temp1_crit.dev_attr.attr,
|
||||
&sensor_dev_attr_temp1_crit_hyst.dev_attr.attr,
|
||||
&sensor_dev_attr_name.dev_attr.attr,
|
||||
NULL
|
||||
};
|
||||
|
||||
|
@ -607,11 +597,15 @@ static const struct attribute_group hwmon_attrgroup = {
|
|||
.is_visible = hwmon_attributes_visible,
|
||||
};
|
||||
|
||||
static const struct attribute_group *hwmon_groups[] = {
|
||||
&hwmon_attrgroup,
|
||||
NULL
|
||||
};
|
||||
|
||||
static int radeon_hwmon_init(struct radeon_device *rdev)
|
||||
{
|
||||
int err = 0;
|
||||
|
||||
rdev->pm.int_hwmon_dev = NULL;
|
||||
struct device *hwmon_dev;
|
||||
|
||||
switch (rdev->pm.int_thermal_type) {
|
||||
case THERMAL_TYPE_RV6XX:
|
||||
|
@ -624,20 +618,13 @@ static int radeon_hwmon_init(struct radeon_device *rdev)
|
|||
case THERMAL_TYPE_KV:
|
||||
if (rdev->asic->pm.get_temperature == NULL)
|
||||
return err;
|
||||
rdev->pm.int_hwmon_dev = hwmon_device_register(rdev->dev);
|
||||
if (IS_ERR(rdev->pm.int_hwmon_dev)) {
|
||||
err = PTR_ERR(rdev->pm.int_hwmon_dev);
|
||||
hwmon_dev = hwmon_device_register_with_groups(rdev->dev,
|
||||
"radeon", rdev,
|
||||
hwmon_groups);
|
||||
if (IS_ERR(hwmon_dev)) {
|
||||
err = PTR_ERR(hwmon_dev);
|
||||
dev_err(rdev->dev,
|
||||
"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;
|
||||
default:
|
||||
|
@ -647,14 +634,6 @@ static int radeon_hwmon_init(struct radeon_device *rdev)
|
|||
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)
|
||||
{
|
||||
struct radeon_device *rdev =
|
||||
|
@ -1337,8 +1316,6 @@ static void radeon_pm_fini_old(struct radeon_device *rdev)
|
|||
|
||||
if (rdev->pm.power_state)
|
||||
kfree(rdev->pm.power_state);
|
||||
|
||||
radeon_hwmon_fini(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)
|
||||
kfree(rdev->pm.power_state);
|
||||
|
||||
radeon_hwmon_fini(rdev);
|
||||
}
|
||||
|
||||
void radeon_pm_fini(struct radeon_device *rdev)
|
||||
|
|
|
@ -47,6 +47,39 @@ TRACE_EVENT(radeon_cs,
|
|||
__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,
|
||||
TP_PROTO(uint64_t pe, uint64_t addr, unsigned count,
|
||||
uint32_t incr, uint32_t flags),
|
||||
|
|
|
@ -21,7 +21,7 @@ cayman 0x9400
|
|||
0x000089AC VGT_COMPUTE_THREAD_GOURP_SIZE
|
||||
0x000089B0 VGT_HS_OFFCHIP_PARAM
|
||||
0x00008A14 PA_CL_ENHANCE
|
||||
0x00008A60 PA_SC_LINE_STIPPLE_VALUE
|
||||
0x00008A60 PA_SU_LINE_STIPPLE_VALUE
|
||||
0x00008B10 PA_SC_LINE_STIPPLE_STATE
|
||||
0x00008BF0 PA_SC_ENHANCE
|
||||
0x00008D8C SQ_DYN_GPR_CNTL_PS_FLUSH_REQ
|
||||
|
@ -532,7 +532,7 @@ cayman 0x9400
|
|||
0x00028B84 PA_SU_POLY_OFFSET_FRONT_OFFSET
|
||||
0x00028B88 PA_SU_POLY_OFFSET_BACK_SCALE
|
||||
0x00028B8C PA_SU_POLY_OFFSET_BACK_OFFSET
|
||||
0x00028B74 VGT_GS_INSTANCE_CNT
|
||||
0x00028B90 VGT_GS_INSTANCE_CNT
|
||||
0x00028BD4 PA_SC_CENTROID_PRIORITY_0
|
||||
0x00028BD8 PA_SC_CENTROID_PRIORITY_1
|
||||
0x00028BDC PA_SC_LINE_CNTL
|
||||
|
|
|
@ -22,7 +22,7 @@ evergreen 0x9400
|
|||
0x000089A4 VGT_COMPUTE_START_Z
|
||||
0x000089AC VGT_COMPUTE_THREAD_GOURP_SIZE
|
||||
0x00008A14 PA_CL_ENHANCE
|
||||
0x00008A60 PA_SC_LINE_STIPPLE_VALUE
|
||||
0x00008A60 PA_SU_LINE_STIPPLE_VALUE
|
||||
0x00008B10 PA_SC_LINE_STIPPLE_STATE
|
||||
0x00008BF0 PA_SC_ENHANCE
|
||||
0x00008D8C SQ_DYN_GPR_CNTL_PS_FLUSH_REQ
|
||||
|
@ -545,7 +545,7 @@ evergreen 0x9400
|
|||
0x00028B84 PA_SU_POLY_OFFSET_FRONT_OFFSET
|
||||
0x00028B88 PA_SU_POLY_OFFSET_BACK_SCALE
|
||||
0x00028B8C PA_SU_POLY_OFFSET_BACK_OFFSET
|
||||
0x00028B74 VGT_GS_INSTANCE_CNT
|
||||
0x00028B90 VGT_GS_INSTANCE_CNT
|
||||
0x00028C00 PA_SC_LINE_CNTL
|
||||
0x00028C08 PA_SU_VTX_CNTL
|
||||
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_size = pci_resource_len(rdev->pdev, 0);
|
||||
/* size in MB on si */
|
||||
rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE) * 1024ULL * 1024ULL;
|
||||
rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE) * 1024ULL * 1024ULL;
|
||||
tmp = RREG32(CONFIG_MEMSIZE);
|
||||
/* 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;
|
||||
si_vram_gtt_location(rdev, &rdev->mc);
|
||||
radeon_update_bandwidth_info(rdev);
|
||||
|
|
Loading…
Reference in New Issue