mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-09 23:39:18 +00:00
Merge branch 'drm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6
* 'drm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6: (27 commits) drm/radeon/kms: hopefully fix pll issues for real (v3) drm/radeon/kms: add bounds checking to avivo pll algo drm: fix wrong usages of drm_device in DRM Developer's Guide drm/radeon/kms: fix a few more atombios endian issues drm/radeon/kms: improve 6xx/7xx CS error output drm/radeon/kms: check AA resolve registers on r300 drm/radeon/kms: fix tracking of BLENDCNTL, COLOR_CHANNEL_MASK, and GB_Z on r300 drm/radeon/kms: use linear aligned for evergreen/ni bo blits drm/radeon/kms: use linear aligned for 6xx/7xx bo blits drm/radeon: fix race between GPU reset and TTM delayed delete thread. drm/radeon/kms: evergreen/ni big endian fixes (v2) drm/radeon/kms: 6xx/7xx big endian fixes drm/radeon/kms: atombios big endian fixes drm/radeon: 6xx/7xx non-kms endian fixes drm/radeon/kms: optimize CS state checking for r100->r500 drm: do not leak kernel addresses via /proc/dri/*/vma drm/radeon/kms: add connector table for mac g5 9600 radeon mkregtable: Add missing fclose() calls drm/radeon/kms: fix interlaced modes on dce4+ drm/radeon: fix memory debugging since d961db75ce86a84f1f04e91ad1014653ed7d9f46 ...
This commit is contained in:
commit
b90be8662b
@ -73,8 +73,8 @@
|
||||
services.
|
||||
</para>
|
||||
<para>
|
||||
The core of every DRM driver is struct drm_device. Drivers
|
||||
will typically statically initialize a drm_device structure,
|
||||
The core of every DRM driver is struct drm_driver. Drivers
|
||||
will typically statically initialize a drm_driver structure,
|
||||
then pass it to drm_init() at load time.
|
||||
</para>
|
||||
|
||||
@ -84,7 +84,7 @@
|
||||
<title>Driver initialization</title>
|
||||
<para>
|
||||
Before calling the DRM initialization routines, the driver must
|
||||
first create and fill out a struct drm_device structure.
|
||||
first create and fill out a struct drm_driver structure.
|
||||
</para>
|
||||
<programlisting>
|
||||
static struct drm_driver driver = {
|
||||
|
@ -283,17 +283,18 @@ int drm_vma_info(struct seq_file *m, void *data)
|
||||
#endif
|
||||
|
||||
mutex_lock(&dev->struct_mutex);
|
||||
seq_printf(m, "vma use count: %d, high_memory = %p, 0x%08llx\n",
|
||||
seq_printf(m, "vma use count: %d, high_memory = %pK, 0x%pK\n",
|
||||
atomic_read(&dev->vma_count),
|
||||
high_memory, (u64)virt_to_phys(high_memory));
|
||||
high_memory, (void *)virt_to_phys(high_memory));
|
||||
|
||||
list_for_each_entry(pt, &dev->vmalist, head) {
|
||||
vma = pt->vma;
|
||||
if (!vma)
|
||||
continue;
|
||||
seq_printf(m,
|
||||
"\n%5d 0x%08lx-0x%08lx %c%c%c%c%c%c 0x%08lx000",
|
||||
pt->pid, vma->vm_start, vma->vm_end,
|
||||
"\n%5d 0x%pK-0x%pK %c%c%c%c%c%c 0x%08lx000",
|
||||
pt->pid,
|
||||
(void *)vma->vm_start, (void *)vma->vm_end,
|
||||
vma->vm_flags & VM_READ ? 'r' : '-',
|
||||
vma->vm_flags & VM_WRITE ? 'w' : '-',
|
||||
vma->vm_flags & VM_EXEC ? 'x' : '-',
|
||||
|
@ -46,6 +46,9 @@ module_param_named(fbpercrtc, i915_fbpercrtc, int, 0400);
|
||||
unsigned int i915_powersave = 1;
|
||||
module_param_named(powersave, i915_powersave, int, 0600);
|
||||
|
||||
unsigned int i915_enable_rc6 = 0;
|
||||
module_param_named(i915_enable_rc6, i915_enable_rc6, int, 0600);
|
||||
|
||||
unsigned int i915_lvds_downclock = 0;
|
||||
module_param_named(lvds_downclock, i915_lvds_downclock, int, 0400);
|
||||
|
||||
@ -360,7 +363,7 @@ static int i915_drm_thaw(struct drm_device *dev)
|
||||
/* Resume the modeset for every activated CRTC */
|
||||
drm_helper_resume_force_mode(dev);
|
||||
|
||||
if (dev_priv->renderctx && dev_priv->pwrctx)
|
||||
if (IS_IRONLAKE_M(dev))
|
||||
ironlake_enable_rc6(dev);
|
||||
}
|
||||
|
||||
|
@ -958,6 +958,7 @@ extern unsigned int i915_fbpercrtc;
|
||||
extern unsigned int i915_powersave;
|
||||
extern unsigned int i915_lvds_downclock;
|
||||
extern unsigned int i915_panel_use_ssc;
|
||||
extern unsigned int i915_enable_rc6;
|
||||
|
||||
extern int i915_suspend(struct drm_device *dev, pm_message_t state);
|
||||
extern int i915_resume(struct drm_device *dev);
|
||||
|
@ -174,7 +174,9 @@
|
||||
* address/value pairs. Don't overdue it, though, x <= 2^4 must hold!
|
||||
*/
|
||||
#define MI_LOAD_REGISTER_IMM(x) MI_INSTR(0x22, 2*x-1)
|
||||
#define MI_FLUSH_DW MI_INSTR(0x26, 2) /* for GEN6 */
|
||||
#define MI_FLUSH_DW MI_INSTR(0x26, 1) /* for GEN6 */
|
||||
#define MI_INVALIDATE_TLB (1<<18)
|
||||
#define MI_INVALIDATE_BSD (1<<7)
|
||||
#define MI_BATCH_BUFFER MI_INSTR(0x30, 1)
|
||||
#define MI_BATCH_NON_SECURE (1)
|
||||
#define MI_BATCH_NON_SECURE_I965 (1<<8)
|
||||
|
@ -5558,9 +5558,7 @@ static void intel_crtc_reset(struct drm_crtc *crtc)
|
||||
/* Reset flags back to the 'unknown' status so that they
|
||||
* will be correctly set on the initial modeset.
|
||||
*/
|
||||
intel_crtc->cursor_addr = 0;
|
||||
intel_crtc->dpms_mode = -1;
|
||||
intel_crtc->active = true; /* force the pipe off on setup_init_config */
|
||||
}
|
||||
|
||||
static struct drm_crtc_helper_funcs intel_helper_funcs = {
|
||||
@ -5666,6 +5664,7 @@ static void intel_crtc_init(struct drm_device *dev, int pipe)
|
||||
dev_priv->pipe_to_crtc_mapping[intel_crtc->pipe] = &intel_crtc->base;
|
||||
|
||||
intel_crtc_reset(&intel_crtc->base);
|
||||
intel_crtc->active = true; /* force the pipe off on setup_init_config */
|
||||
|
||||
if (HAS_PCH_SPLIT(dev)) {
|
||||
intel_helper_funcs.prepare = ironlake_crtc_prepare;
|
||||
@ -6463,29 +6462,19 @@ void intel_enable_clock_gating(struct drm_device *dev)
|
||||
}
|
||||
}
|
||||
|
||||
void intel_disable_clock_gating(struct drm_device *dev)
|
||||
static void ironlake_teardown_rc6(struct drm_device *dev)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||
|
||||
if (dev_priv->renderctx) {
|
||||
struct drm_i915_gem_object *obj = dev_priv->renderctx;
|
||||
|
||||
I915_WRITE(CCID, 0);
|
||||
POSTING_READ(CCID);
|
||||
|
||||
i915_gem_object_unpin(obj);
|
||||
drm_gem_object_unreference(&obj->base);
|
||||
i915_gem_object_unpin(dev_priv->renderctx);
|
||||
drm_gem_object_unreference(&dev_priv->renderctx->base);
|
||||
dev_priv->renderctx = NULL;
|
||||
}
|
||||
|
||||
if (dev_priv->pwrctx) {
|
||||
struct drm_i915_gem_object *obj = dev_priv->pwrctx;
|
||||
|
||||
I915_WRITE(PWRCTXA, 0);
|
||||
POSTING_READ(PWRCTXA);
|
||||
|
||||
i915_gem_object_unpin(obj);
|
||||
drm_gem_object_unreference(&obj->base);
|
||||
i915_gem_object_unpin(dev_priv->pwrctx);
|
||||
drm_gem_object_unreference(&dev_priv->pwrctx->base);
|
||||
dev_priv->pwrctx = NULL;
|
||||
}
|
||||
}
|
||||
@ -6494,21 +6483,39 @@ static void ironlake_disable_rc6(struct drm_device *dev)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||
|
||||
/* Wake the GPU, prevent RC6, then restore RSTDBYCTL */
|
||||
I915_WRITE(RSTDBYCTL, I915_READ(RSTDBYCTL) | RCX_SW_EXIT);
|
||||
wait_for(((I915_READ(RSTDBYCTL) & RSX_STATUS_MASK) == RSX_STATUS_ON),
|
||||
10);
|
||||
POSTING_READ(CCID);
|
||||
I915_WRITE(PWRCTXA, 0);
|
||||
POSTING_READ(PWRCTXA);
|
||||
I915_WRITE(RSTDBYCTL, I915_READ(RSTDBYCTL) & ~RCX_SW_EXIT);
|
||||
POSTING_READ(RSTDBYCTL);
|
||||
i915_gem_object_unpin(dev_priv->renderctx);
|
||||
drm_gem_object_unreference(&dev_priv->renderctx->base);
|
||||
dev_priv->renderctx = NULL;
|
||||
i915_gem_object_unpin(dev_priv->pwrctx);
|
||||
drm_gem_object_unreference(&dev_priv->pwrctx->base);
|
||||
dev_priv->pwrctx = NULL;
|
||||
if (I915_READ(PWRCTXA)) {
|
||||
/* Wake the GPU, prevent RC6, then restore RSTDBYCTL */
|
||||
I915_WRITE(RSTDBYCTL, I915_READ(RSTDBYCTL) | RCX_SW_EXIT);
|
||||
wait_for(((I915_READ(RSTDBYCTL) & RSX_STATUS_MASK) == RSX_STATUS_ON),
|
||||
50);
|
||||
|
||||
I915_WRITE(PWRCTXA, 0);
|
||||
POSTING_READ(PWRCTXA);
|
||||
|
||||
I915_WRITE(RSTDBYCTL, I915_READ(RSTDBYCTL) & ~RCX_SW_EXIT);
|
||||
POSTING_READ(RSTDBYCTL);
|
||||
}
|
||||
|
||||
ironlake_disable_rc6(dev);
|
||||
}
|
||||
|
||||
static int ironlake_setup_rc6(struct drm_device *dev)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||
|
||||
if (dev_priv->renderctx == NULL)
|
||||
dev_priv->renderctx = intel_alloc_context_page(dev);
|
||||
if (!dev_priv->renderctx)
|
||||
return -ENOMEM;
|
||||
|
||||
if (dev_priv->pwrctx == NULL)
|
||||
dev_priv->pwrctx = intel_alloc_context_page(dev);
|
||||
if (!dev_priv->pwrctx) {
|
||||
ironlake_teardown_rc6(dev);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void ironlake_enable_rc6(struct drm_device *dev)
|
||||
@ -6516,15 +6523,26 @@ void ironlake_enable_rc6(struct drm_device *dev)
|
||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||
int ret;
|
||||
|
||||
/* rc6 disabled by default due to repeated reports of hanging during
|
||||
* boot and resume.
|
||||
*/
|
||||
if (!i915_enable_rc6)
|
||||
return;
|
||||
|
||||
ret = ironlake_setup_rc6(dev);
|
||||
if (ret)
|
||||
return;
|
||||
|
||||
/*
|
||||
* GPU can automatically power down the render unit if given a page
|
||||
* to save state.
|
||||
*/
|
||||
ret = BEGIN_LP_RING(6);
|
||||
if (ret) {
|
||||
ironlake_disable_rc6(dev);
|
||||
ironlake_teardown_rc6(dev);
|
||||
return;
|
||||
}
|
||||
|
||||
OUT_RING(MI_SUSPEND_FLUSH | MI_SUSPEND_FLUSH_EN);
|
||||
OUT_RING(MI_SET_CONTEXT);
|
||||
OUT_RING(dev_priv->renderctx->gtt_offset |
|
||||
@ -6541,6 +6559,7 @@ void ironlake_enable_rc6(struct drm_device *dev)
|
||||
I915_WRITE(RSTDBYCTL, I915_READ(RSTDBYCTL) & ~RCX_SW_EXIT);
|
||||
}
|
||||
|
||||
|
||||
/* Set up chip specific display functions */
|
||||
static void intel_init_display(struct drm_device *dev)
|
||||
{
|
||||
@ -6783,21 +6802,9 @@ void intel_modeset_init(struct drm_device *dev)
|
||||
if (IS_GEN6(dev))
|
||||
gen6_enable_rps(dev_priv);
|
||||
|
||||
if (IS_IRONLAKE_M(dev)) {
|
||||
dev_priv->renderctx = intel_alloc_context_page(dev);
|
||||
if (!dev_priv->renderctx)
|
||||
goto skip_rc6;
|
||||
dev_priv->pwrctx = intel_alloc_context_page(dev);
|
||||
if (!dev_priv->pwrctx) {
|
||||
i915_gem_object_unpin(dev_priv->renderctx);
|
||||
drm_gem_object_unreference(&dev_priv->renderctx->base);
|
||||
dev_priv->renderctx = NULL;
|
||||
goto skip_rc6;
|
||||
}
|
||||
if (IS_IRONLAKE_M(dev))
|
||||
ironlake_enable_rc6(dev);
|
||||
}
|
||||
|
||||
skip_rc6:
|
||||
INIT_WORK(&dev_priv->idle_work, intel_idle_update);
|
||||
setup_timer(&dev_priv->idle_timer, intel_gpu_idle_timer,
|
||||
(unsigned long)dev);
|
||||
|
@ -1639,6 +1639,24 @@ static int intel_dp_get_modes(struct drm_connector *connector)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static bool
|
||||
intel_dp_detect_audio(struct drm_connector *connector)
|
||||
{
|
||||
struct intel_dp *intel_dp = intel_attached_dp(connector);
|
||||
struct edid *edid;
|
||||
bool has_audio = false;
|
||||
|
||||
edid = drm_get_edid(connector, &intel_dp->adapter);
|
||||
if (edid) {
|
||||
has_audio = drm_detect_monitor_audio(edid);
|
||||
|
||||
connector->display_info.raw_edid = NULL;
|
||||
kfree(edid);
|
||||
}
|
||||
|
||||
return has_audio;
|
||||
}
|
||||
|
||||
static int
|
||||
intel_dp_set_property(struct drm_connector *connector,
|
||||
struct drm_property *property,
|
||||
@ -1652,17 +1670,23 @@ intel_dp_set_property(struct drm_connector *connector,
|
||||
return ret;
|
||||
|
||||
if (property == intel_dp->force_audio_property) {
|
||||
if (val == intel_dp->force_audio)
|
||||
int i = val;
|
||||
bool has_audio;
|
||||
|
||||
if (i == intel_dp->force_audio)
|
||||
return 0;
|
||||
|
||||
intel_dp->force_audio = val;
|
||||
intel_dp->force_audio = i;
|
||||
|
||||
if (val > 0 && intel_dp->has_audio)
|
||||
return 0;
|
||||
if (val < 0 && !intel_dp->has_audio)
|
||||
if (i == 0)
|
||||
has_audio = intel_dp_detect_audio(connector);
|
||||
else
|
||||
has_audio = i > 0;
|
||||
|
||||
if (has_audio == intel_dp->has_audio)
|
||||
return 0;
|
||||
|
||||
intel_dp->has_audio = val > 0;
|
||||
intel_dp->has_audio = has_audio;
|
||||
goto done;
|
||||
}
|
||||
|
||||
|
@ -298,7 +298,6 @@ extern void intel_crtc_fb_gamma_set(struct drm_crtc *crtc, u16 red, u16 green,
|
||||
extern void intel_crtc_fb_gamma_get(struct drm_crtc *crtc, u16 *red, u16 *green,
|
||||
u16 *blue, int regno);
|
||||
extern void intel_enable_clock_gating(struct drm_device *dev);
|
||||
extern void intel_disable_clock_gating(struct drm_device *dev);
|
||||
extern void ironlake_enable_drps(struct drm_device *dev);
|
||||
extern void ironlake_disable_drps(struct drm_device *dev);
|
||||
extern void gen6_enable_rps(struct drm_i915_private *dev_priv);
|
||||
|
@ -251,6 +251,27 @@ static int intel_hdmi_get_modes(struct drm_connector *connector)
|
||||
&dev_priv->gmbus[intel_hdmi->ddc_bus].adapter);
|
||||
}
|
||||
|
||||
static bool
|
||||
intel_hdmi_detect_audio(struct drm_connector *connector)
|
||||
{
|
||||
struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
|
||||
struct drm_i915_private *dev_priv = connector->dev->dev_private;
|
||||
struct edid *edid;
|
||||
bool has_audio = false;
|
||||
|
||||
edid = drm_get_edid(connector,
|
||||
&dev_priv->gmbus[intel_hdmi->ddc_bus].adapter);
|
||||
if (edid) {
|
||||
if (edid->input & DRM_EDID_INPUT_DIGITAL)
|
||||
has_audio = drm_detect_monitor_audio(edid);
|
||||
|
||||
connector->display_info.raw_edid = NULL;
|
||||
kfree(edid);
|
||||
}
|
||||
|
||||
return has_audio;
|
||||
}
|
||||
|
||||
static int
|
||||
intel_hdmi_set_property(struct drm_connector *connector,
|
||||
struct drm_property *property,
|
||||
@ -264,17 +285,23 @@ intel_hdmi_set_property(struct drm_connector *connector,
|
||||
return ret;
|
||||
|
||||
if (property == intel_hdmi->force_audio_property) {
|
||||
if (val == intel_hdmi->force_audio)
|
||||
int i = val;
|
||||
bool has_audio;
|
||||
|
||||
if (i == intel_hdmi->force_audio)
|
||||
return 0;
|
||||
|
||||
intel_hdmi->force_audio = val;
|
||||
intel_hdmi->force_audio = i;
|
||||
|
||||
if (val > 0 && intel_hdmi->has_audio)
|
||||
return 0;
|
||||
if (val < 0 && !intel_hdmi->has_audio)
|
||||
if (i == 0)
|
||||
has_audio = intel_hdmi_detect_audio(connector);
|
||||
else
|
||||
has_audio = i > 0;
|
||||
|
||||
if (has_audio == intel_hdmi->has_audio)
|
||||
return 0;
|
||||
|
||||
intel_hdmi->has_audio = val > 0;
|
||||
intel_hdmi->has_audio = has_audio;
|
||||
goto done;
|
||||
}
|
||||
|
||||
|
@ -261,12 +261,6 @@ static bool intel_lvds_mode_fixup(struct drm_encoder *encoder,
|
||||
return true;
|
||||
}
|
||||
|
||||
/* Make sure pre-965s set dither correctly */
|
||||
if (INTEL_INFO(dev)->gen < 4) {
|
||||
if (dev_priv->lvds_dither)
|
||||
pfit_control |= PANEL_8TO6_DITHER_ENABLE;
|
||||
}
|
||||
|
||||
/* Native modes don't need fitting */
|
||||
if (adjusted_mode->hdisplay == mode->hdisplay &&
|
||||
adjusted_mode->vdisplay == mode->vdisplay)
|
||||
@ -374,10 +368,16 @@ static bool intel_lvds_mode_fixup(struct drm_encoder *encoder,
|
||||
}
|
||||
|
||||
out:
|
||||
/* If not enabling scaling, be consistent and always use 0. */
|
||||
if ((pfit_control & PFIT_ENABLE) == 0) {
|
||||
pfit_control = 0;
|
||||
pfit_pgm_ratios = 0;
|
||||
}
|
||||
|
||||
/* Make sure pre-965 set dither correctly */
|
||||
if (INTEL_INFO(dev)->gen < 4 && dev_priv->lvds_dither)
|
||||
pfit_control |= PANEL_8TO6_DITHER_ENABLE;
|
||||
|
||||
if (pfit_control != intel_lvds->pfit_control ||
|
||||
pfit_pgm_ratios != intel_lvds->pfit_pgm_ratios) {
|
||||
intel_lvds->pfit_control = pfit_control;
|
||||
|
@ -1059,22 +1059,25 @@ static void gen6_bsd_ring_write_tail(struct intel_ring_buffer *ring,
|
||||
}
|
||||
|
||||
static int gen6_ring_flush(struct intel_ring_buffer *ring,
|
||||
u32 invalidate_domains,
|
||||
u32 flush_domains)
|
||||
u32 invalidate, u32 flush)
|
||||
{
|
||||
uint32_t cmd;
|
||||
int ret;
|
||||
|
||||
if ((flush_domains & I915_GEM_DOMAIN_RENDER) == 0)
|
||||
if (((invalidate | flush) & I915_GEM_GPU_DOMAINS) == 0)
|
||||
return 0;
|
||||
|
||||
ret = intel_ring_begin(ring, 4);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
intel_ring_emit(ring, MI_FLUSH_DW);
|
||||
intel_ring_emit(ring, 0);
|
||||
cmd = MI_FLUSH_DW;
|
||||
if (invalidate & I915_GEM_GPU_DOMAINS)
|
||||
cmd |= MI_INVALIDATE_TLB | MI_INVALIDATE_BSD;
|
||||
intel_ring_emit(ring, cmd);
|
||||
intel_ring_emit(ring, 0);
|
||||
intel_ring_emit(ring, 0);
|
||||
intel_ring_emit(ring, MI_NOOP);
|
||||
intel_ring_advance(ring);
|
||||
return 0;
|
||||
}
|
||||
@ -1230,22 +1233,25 @@ static int blt_ring_begin(struct intel_ring_buffer *ring,
|
||||
}
|
||||
|
||||
static int blt_ring_flush(struct intel_ring_buffer *ring,
|
||||
u32 invalidate_domains,
|
||||
u32 flush_domains)
|
||||
u32 invalidate, u32 flush)
|
||||
{
|
||||
uint32_t cmd;
|
||||
int ret;
|
||||
|
||||
if ((flush_domains & I915_GEM_DOMAIN_RENDER) == 0)
|
||||
if (((invalidate | flush) & I915_GEM_DOMAIN_RENDER) == 0)
|
||||
return 0;
|
||||
|
||||
ret = blt_ring_begin(ring, 4);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
intel_ring_emit(ring, MI_FLUSH_DW);
|
||||
intel_ring_emit(ring, 0);
|
||||
cmd = MI_FLUSH_DW;
|
||||
if (invalidate & I915_GEM_DOMAIN_RENDER)
|
||||
cmd |= MI_INVALIDATE_TLB;
|
||||
intel_ring_emit(ring, cmd);
|
||||
intel_ring_emit(ring, 0);
|
||||
intel_ring_emit(ring, 0);
|
||||
intel_ring_emit(ring, MI_NOOP);
|
||||
intel_ring_advance(ring);
|
||||
return 0;
|
||||
}
|
||||
|
@ -46,6 +46,7 @@
|
||||
SDVO_TV_MASK)
|
||||
|
||||
#define IS_TV(c) (c->output_flag & SDVO_TV_MASK)
|
||||
#define IS_TMDS(c) (c->output_flag & SDVO_TMDS_MASK)
|
||||
#define IS_LVDS(c) (c->output_flag & SDVO_LVDS_MASK)
|
||||
#define IS_TV_OR_LVDS(c) (c->output_flag & (SDVO_TV_MASK | SDVO_LVDS_MASK))
|
||||
|
||||
@ -1359,7 +1360,8 @@ intel_sdvo_hdmi_sink_detect(struct drm_connector *connector)
|
||||
intel_sdvo->has_hdmi_monitor = drm_detect_hdmi_monitor(edid);
|
||||
intel_sdvo->has_hdmi_audio = drm_detect_monitor_audio(edid);
|
||||
}
|
||||
}
|
||||
} else
|
||||
status = connector_status_disconnected;
|
||||
connector->display_info.raw_edid = NULL;
|
||||
kfree(edid);
|
||||
}
|
||||
@ -1407,10 +1409,25 @@ intel_sdvo_detect(struct drm_connector *connector, bool force)
|
||||
|
||||
if ((intel_sdvo_connector->output_flag & response) == 0)
|
||||
ret = connector_status_disconnected;
|
||||
else if (response & SDVO_TMDS_MASK)
|
||||
else if (IS_TMDS(intel_sdvo_connector))
|
||||
ret = intel_sdvo_hdmi_sink_detect(connector);
|
||||
else
|
||||
ret = connector_status_connected;
|
||||
else {
|
||||
struct edid *edid;
|
||||
|
||||
/* if we have an edid check it matches the connection */
|
||||
edid = intel_sdvo_get_edid(connector);
|
||||
if (edid == NULL)
|
||||
edid = intel_sdvo_get_analog_edid(connector);
|
||||
if (edid != NULL) {
|
||||
if (edid->input & DRM_EDID_INPUT_DIGITAL)
|
||||
ret = connector_status_disconnected;
|
||||
else
|
||||
ret = connector_status_connected;
|
||||
connector->display_info.raw_edid = NULL;
|
||||
kfree(edid);
|
||||
} else
|
||||
ret = connector_status_connected;
|
||||
}
|
||||
|
||||
/* May update encoder flag for like clock for SDVO TV, etc.*/
|
||||
if (ret == connector_status_connected) {
|
||||
@ -1446,10 +1463,15 @@ static void intel_sdvo_get_ddc_modes(struct drm_connector *connector)
|
||||
edid = intel_sdvo_get_analog_edid(connector);
|
||||
|
||||
if (edid != NULL) {
|
||||
if (edid->input & DRM_EDID_INPUT_DIGITAL) {
|
||||
struct intel_sdvo_connector *intel_sdvo_connector = to_intel_sdvo_connector(connector);
|
||||
bool monitor_is_digital = !!(edid->input & DRM_EDID_INPUT_DIGITAL);
|
||||
bool connector_is_digital = !!IS_TMDS(intel_sdvo_connector);
|
||||
|
||||
if (connector_is_digital == monitor_is_digital) {
|
||||
drm_mode_connector_update_edid_property(connector, edid);
|
||||
drm_add_edid_modes(connector, edid);
|
||||
}
|
||||
|
||||
connector->display_info.raw_edid = NULL;
|
||||
kfree(edid);
|
||||
}
|
||||
@ -1668,6 +1690,22 @@ static void intel_sdvo_destroy(struct drm_connector *connector)
|
||||
kfree(connector);
|
||||
}
|
||||
|
||||
static bool intel_sdvo_detect_hdmi_audio(struct drm_connector *connector)
|
||||
{
|
||||
struct intel_sdvo *intel_sdvo = intel_attached_sdvo(connector);
|
||||
struct edid *edid;
|
||||
bool has_audio = false;
|
||||
|
||||
if (!intel_sdvo->is_hdmi)
|
||||
return false;
|
||||
|
||||
edid = intel_sdvo_get_edid(connector);
|
||||
if (edid != NULL && edid->input & DRM_EDID_INPUT_DIGITAL)
|
||||
has_audio = drm_detect_monitor_audio(edid);
|
||||
|
||||
return has_audio;
|
||||
}
|
||||
|
||||
static int
|
||||
intel_sdvo_set_property(struct drm_connector *connector,
|
||||
struct drm_property *property,
|
||||
@ -1684,17 +1722,23 @@ intel_sdvo_set_property(struct drm_connector *connector,
|
||||
return ret;
|
||||
|
||||
if (property == intel_sdvo_connector->force_audio_property) {
|
||||
if (val == intel_sdvo_connector->force_audio)
|
||||
int i = val;
|
||||
bool has_audio;
|
||||
|
||||
if (i == intel_sdvo_connector->force_audio)
|
||||
return 0;
|
||||
|
||||
intel_sdvo_connector->force_audio = val;
|
||||
intel_sdvo_connector->force_audio = i;
|
||||
|
||||
if (val > 0 && intel_sdvo->has_hdmi_audio)
|
||||
return 0;
|
||||
if (val < 0 && !intel_sdvo->has_hdmi_audio)
|
||||
if (i == 0)
|
||||
has_audio = intel_sdvo_detect_hdmi_audio(connector);
|
||||
else
|
||||
has_audio = i > 0;
|
||||
|
||||
if (has_audio == intel_sdvo->has_hdmi_audio)
|
||||
return 0;
|
||||
|
||||
intel_sdvo->has_hdmi_audio = val > 0;
|
||||
intel_sdvo->has_hdmi_audio = has_audio;
|
||||
goto done;
|
||||
}
|
||||
|
||||
|
@ -1234,7 +1234,8 @@ static const struct drm_display_mode reported_modes[] = {
|
||||
* \return false if TV is disconnected.
|
||||
*/
|
||||
static int
|
||||
intel_tv_detect_type (struct intel_tv *intel_tv)
|
||||
intel_tv_detect_type (struct intel_tv *intel_tv,
|
||||
struct drm_connector *connector)
|
||||
{
|
||||
struct drm_encoder *encoder = &intel_tv->base.base;
|
||||
struct drm_device *dev = encoder->dev;
|
||||
@ -1245,11 +1246,13 @@ intel_tv_detect_type (struct intel_tv *intel_tv)
|
||||
int type;
|
||||
|
||||
/* Disable TV interrupts around load detect or we'll recurse */
|
||||
spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
|
||||
i915_disable_pipestat(dev_priv, 0,
|
||||
PIPE_HOTPLUG_INTERRUPT_ENABLE |
|
||||
PIPE_HOTPLUG_TV_INTERRUPT_ENABLE);
|
||||
spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
|
||||
if (connector->polled & DRM_CONNECTOR_POLL_HPD) {
|
||||
spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
|
||||
i915_disable_pipestat(dev_priv, 0,
|
||||
PIPE_HOTPLUG_INTERRUPT_ENABLE |
|
||||
PIPE_HOTPLUG_TV_INTERRUPT_ENABLE);
|
||||
spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
|
||||
}
|
||||
|
||||
save_tv_dac = tv_dac = I915_READ(TV_DAC);
|
||||
save_tv_ctl = tv_ctl = I915_READ(TV_CTL);
|
||||
@ -1302,11 +1305,13 @@ intel_tv_detect_type (struct intel_tv *intel_tv)
|
||||
I915_WRITE(TV_CTL, save_tv_ctl);
|
||||
|
||||
/* Restore interrupt config */
|
||||
spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
|
||||
i915_enable_pipestat(dev_priv, 0,
|
||||
PIPE_HOTPLUG_INTERRUPT_ENABLE |
|
||||
PIPE_HOTPLUG_TV_INTERRUPT_ENABLE);
|
||||
spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
|
||||
if (connector->polled & DRM_CONNECTOR_POLL_HPD) {
|
||||
spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
|
||||
i915_enable_pipestat(dev_priv, 0,
|
||||
PIPE_HOTPLUG_INTERRUPT_ENABLE |
|
||||
PIPE_HOTPLUG_TV_INTERRUPT_ENABLE);
|
||||
spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
|
||||
}
|
||||
|
||||
return type;
|
||||
}
|
||||
@ -1356,7 +1361,7 @@ intel_tv_detect(struct drm_connector *connector, bool force)
|
||||
drm_mode_set_crtcinfo(&mode, CRTC_INTERLACE_HALVE_V);
|
||||
|
||||
if (intel_tv->base.base.crtc && intel_tv->base.base.crtc->enabled) {
|
||||
type = intel_tv_detect_type(intel_tv);
|
||||
type = intel_tv_detect_type(intel_tv, connector);
|
||||
} else if (force) {
|
||||
struct drm_crtc *crtc;
|
||||
int dpms_mode;
|
||||
@ -1364,7 +1369,7 @@ intel_tv_detect(struct drm_connector *connector, bool force)
|
||||
crtc = intel_get_load_detect_pipe(&intel_tv->base, connector,
|
||||
&mode, &dpms_mode);
|
||||
if (crtc) {
|
||||
type = intel_tv_detect_type(intel_tv);
|
||||
type = intel_tv_detect_type(intel_tv, connector);
|
||||
intel_release_load_detect_pipe(&intel_tv->base, connector,
|
||||
dpms_mode);
|
||||
} else
|
||||
@ -1658,6 +1663,18 @@ intel_tv_init(struct drm_device *dev)
|
||||
intel_encoder = &intel_tv->base;
|
||||
connector = &intel_connector->base;
|
||||
|
||||
/* The documentation, for the older chipsets at least, recommend
|
||||
* using a polling method rather than hotplug detection for TVs.
|
||||
* This is because in order to perform the hotplug detection, the PLLs
|
||||
* for the TV must be kept alive increasing power drain and starving
|
||||
* bandwidth from other encoders. Notably for instance, it causes
|
||||
* pipe underruns on Crestline when this encoder is supposedly idle.
|
||||
*
|
||||
* More recent chipsets favour HDMI rather than integrated S-Video.
|
||||
*/
|
||||
connector->polled =
|
||||
DRM_CONNECTOR_POLL_CONNECT | DRM_CONNECTOR_POLL_DISCONNECT;
|
||||
|
||||
drm_connector_init(dev, connector, &intel_tv_connector_funcs,
|
||||
DRM_MODE_CONNECTOR_SVIDEO);
|
||||
|
||||
|
@ -48,29 +48,29 @@ static void atombios_overscan_setup(struct drm_crtc *crtc,
|
||||
|
||||
switch (radeon_crtc->rmx_type) {
|
||||
case RMX_CENTER:
|
||||
args.usOverscanTop = (adjusted_mode->crtc_vdisplay - mode->crtc_vdisplay) / 2;
|
||||
args.usOverscanBottom = (adjusted_mode->crtc_vdisplay - mode->crtc_vdisplay) / 2;
|
||||
args.usOverscanLeft = (adjusted_mode->crtc_hdisplay - mode->crtc_hdisplay) / 2;
|
||||
args.usOverscanRight = (adjusted_mode->crtc_hdisplay - mode->crtc_hdisplay) / 2;
|
||||
args.usOverscanTop = cpu_to_le16((adjusted_mode->crtc_vdisplay - mode->crtc_vdisplay) / 2);
|
||||
args.usOverscanBottom = cpu_to_le16((adjusted_mode->crtc_vdisplay - mode->crtc_vdisplay) / 2);
|
||||
args.usOverscanLeft = cpu_to_le16((adjusted_mode->crtc_hdisplay - mode->crtc_hdisplay) / 2);
|
||||
args.usOverscanRight = cpu_to_le16((adjusted_mode->crtc_hdisplay - mode->crtc_hdisplay) / 2);
|
||||
break;
|
||||
case RMX_ASPECT:
|
||||
a1 = mode->crtc_vdisplay * adjusted_mode->crtc_hdisplay;
|
||||
a2 = adjusted_mode->crtc_vdisplay * mode->crtc_hdisplay;
|
||||
|
||||
if (a1 > a2) {
|
||||
args.usOverscanLeft = (adjusted_mode->crtc_hdisplay - (a2 / mode->crtc_vdisplay)) / 2;
|
||||
args.usOverscanRight = (adjusted_mode->crtc_hdisplay - (a2 / mode->crtc_vdisplay)) / 2;
|
||||
args.usOverscanLeft = cpu_to_le16((adjusted_mode->crtc_hdisplay - (a2 / mode->crtc_vdisplay)) / 2);
|
||||
args.usOverscanRight = cpu_to_le16((adjusted_mode->crtc_hdisplay - (a2 / mode->crtc_vdisplay)) / 2);
|
||||
} else if (a2 > a1) {
|
||||
args.usOverscanLeft = (adjusted_mode->crtc_vdisplay - (a1 / mode->crtc_hdisplay)) / 2;
|
||||
args.usOverscanRight = (adjusted_mode->crtc_vdisplay - (a1 / mode->crtc_hdisplay)) / 2;
|
||||
args.usOverscanLeft = cpu_to_le16((adjusted_mode->crtc_vdisplay - (a1 / mode->crtc_hdisplay)) / 2);
|
||||
args.usOverscanRight = cpu_to_le16((adjusted_mode->crtc_vdisplay - (a1 / mode->crtc_hdisplay)) / 2);
|
||||
}
|
||||
break;
|
||||
case RMX_FULL:
|
||||
default:
|
||||
args.usOverscanRight = radeon_crtc->h_border;
|
||||
args.usOverscanLeft = radeon_crtc->h_border;
|
||||
args.usOverscanBottom = radeon_crtc->v_border;
|
||||
args.usOverscanTop = radeon_crtc->v_border;
|
||||
args.usOverscanRight = cpu_to_le16(radeon_crtc->h_border);
|
||||
args.usOverscanLeft = cpu_to_le16(radeon_crtc->h_border);
|
||||
args.usOverscanBottom = cpu_to_le16(radeon_crtc->v_border);
|
||||
args.usOverscanTop = cpu_to_le16(radeon_crtc->v_border);
|
||||
break;
|
||||
}
|
||||
atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
|
||||
@ -419,23 +419,23 @@ static void atombios_crtc_program_ss(struct drm_crtc *crtc,
|
||||
memset(&args, 0, sizeof(args));
|
||||
|
||||
if (ASIC_IS_DCE5(rdev)) {
|
||||
args.v3.usSpreadSpectrumAmountFrac = 0;
|
||||
args.v3.usSpreadSpectrumAmountFrac = cpu_to_le16(0);
|
||||
args.v3.ucSpreadSpectrumType = ss->type;
|
||||
switch (pll_id) {
|
||||
case ATOM_PPLL1:
|
||||
args.v3.ucSpreadSpectrumType |= ATOM_PPLL_SS_TYPE_V3_P1PLL;
|
||||
args.v3.usSpreadSpectrumAmount = ss->amount;
|
||||
args.v3.usSpreadSpectrumStep = ss->step;
|
||||
args.v3.usSpreadSpectrumAmount = cpu_to_le16(ss->amount);
|
||||
args.v3.usSpreadSpectrumStep = cpu_to_le16(ss->step);
|
||||
break;
|
||||
case ATOM_PPLL2:
|
||||
args.v3.ucSpreadSpectrumType |= ATOM_PPLL_SS_TYPE_V3_P2PLL;
|
||||
args.v3.usSpreadSpectrumAmount = ss->amount;
|
||||
args.v3.usSpreadSpectrumStep = ss->step;
|
||||
args.v3.usSpreadSpectrumAmount = cpu_to_le16(ss->amount);
|
||||
args.v3.usSpreadSpectrumStep = cpu_to_le16(ss->step);
|
||||
break;
|
||||
case ATOM_DCPLL:
|
||||
args.v3.ucSpreadSpectrumType |= ATOM_PPLL_SS_TYPE_V3_DCPLL;
|
||||
args.v3.usSpreadSpectrumAmount = 0;
|
||||
args.v3.usSpreadSpectrumStep = 0;
|
||||
args.v3.usSpreadSpectrumAmount = cpu_to_le16(0);
|
||||
args.v3.usSpreadSpectrumStep = cpu_to_le16(0);
|
||||
break;
|
||||
case ATOM_PPLL_INVALID:
|
||||
return;
|
||||
@ -447,18 +447,18 @@ static void atombios_crtc_program_ss(struct drm_crtc *crtc,
|
||||
switch (pll_id) {
|
||||
case ATOM_PPLL1:
|
||||
args.v2.ucSpreadSpectrumType |= ATOM_PPLL_SS_TYPE_V2_P1PLL;
|
||||
args.v2.usSpreadSpectrumAmount = ss->amount;
|
||||
args.v2.usSpreadSpectrumStep = ss->step;
|
||||
args.v2.usSpreadSpectrumAmount = cpu_to_le16(ss->amount);
|
||||
args.v2.usSpreadSpectrumStep = cpu_to_le16(ss->step);
|
||||
break;
|
||||
case ATOM_PPLL2:
|
||||
args.v2.ucSpreadSpectrumType |= ATOM_PPLL_SS_TYPE_V2_P2PLL;
|
||||
args.v2.usSpreadSpectrumAmount = ss->amount;
|
||||
args.v2.usSpreadSpectrumStep = ss->step;
|
||||
args.v2.usSpreadSpectrumAmount = cpu_to_le16(ss->amount);
|
||||
args.v2.usSpreadSpectrumStep = cpu_to_le16(ss->step);
|
||||
break;
|
||||
case ATOM_DCPLL:
|
||||
args.v2.ucSpreadSpectrumType |= ATOM_PPLL_SS_TYPE_V2_DCPLL;
|
||||
args.v2.usSpreadSpectrumAmount = 0;
|
||||
args.v2.usSpreadSpectrumStep = 0;
|
||||
args.v2.usSpreadSpectrumAmount = cpu_to_le16(0);
|
||||
args.v2.usSpreadSpectrumStep = cpu_to_le16(0);
|
||||
break;
|
||||
case ATOM_PPLL_INVALID:
|
||||
return;
|
||||
@ -538,7 +538,6 @@ static u32 atombios_adjust_pll(struct drm_crtc *crtc,
|
||||
pll->flags |= RADEON_PLL_PREFER_HIGH_FB_DIV;
|
||||
else
|
||||
pll->flags |= RADEON_PLL_PREFER_LOW_REF_DIV;
|
||||
|
||||
}
|
||||
|
||||
list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
|
||||
@ -555,29 +554,28 @@ static u32 atombios_adjust_pll(struct drm_crtc *crtc,
|
||||
dp_clock = dig_connector->dp_clock;
|
||||
}
|
||||
}
|
||||
/* this might work properly with the new pll algo */
|
||||
#if 0 /* doesn't work properly on some laptops */
|
||||
|
||||
/* use recommended ref_div for ss */
|
||||
if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) {
|
||||
pll->flags |= RADEON_PLL_PREFER_MINM_OVER_MAXP;
|
||||
if (ss_enabled) {
|
||||
if (ss->refdiv) {
|
||||
pll->flags |= RADEON_PLL_USE_REF_DIV;
|
||||
pll->reference_div = ss->refdiv;
|
||||
if (ASIC_IS_AVIVO(rdev))
|
||||
pll->flags |= RADEON_PLL_USE_FRAC_FB_DIV;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
if (ASIC_IS_AVIVO(rdev)) {
|
||||
/* DVO wants 2x pixel clock if the DVO chip is in 12 bit mode */
|
||||
if (radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1)
|
||||
adjusted_clock = mode->clock * 2;
|
||||
if (radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT))
|
||||
pll->flags |= RADEON_PLL_PREFER_CLOSEST_LOWER;
|
||||
/* rv515 needs more testing with this option */
|
||||
if (rdev->family != CHIP_RV515) {
|
||||
if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT))
|
||||
pll->flags |= RADEON_PLL_IS_LCD;
|
||||
}
|
||||
if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT))
|
||||
pll->flags |= RADEON_PLL_IS_LCD;
|
||||
} else {
|
||||
if (encoder->encoder_type != DRM_MODE_ENCODER_DAC)
|
||||
pll->flags |= RADEON_PLL_NO_ODD_POST_DIV;
|
||||
@ -721,14 +719,14 @@ static void atombios_crtc_set_dcpll(struct drm_crtc *crtc,
|
||||
* SetPixelClock provides the dividers
|
||||
*/
|
||||
args.v5.ucCRTC = ATOM_CRTC_INVALID;
|
||||
args.v5.usPixelClock = dispclk;
|
||||
args.v5.usPixelClock = cpu_to_le16(dispclk);
|
||||
args.v5.ucPpll = ATOM_DCPLL;
|
||||
break;
|
||||
case 6:
|
||||
/* if the default dcpll clock is specified,
|
||||
* SetPixelClock provides the dividers
|
||||
*/
|
||||
args.v6.ulDispEngClkFreq = dispclk;
|
||||
args.v6.ulDispEngClkFreq = cpu_to_le32(dispclk);
|
||||
args.v6.ucPpll = ATOM_DCPLL;
|
||||
break;
|
||||
default:
|
||||
@ -957,11 +955,7 @@ static void atombios_crtc_set_pll(struct drm_crtc *crtc, struct drm_display_mode
|
||||
/* adjust pixel clock as needed */
|
||||
adjusted_clock = atombios_adjust_pll(crtc, mode, pll, ss_enabled, &ss);
|
||||
|
||||
/* rv515 seems happier with the old algo */
|
||||
if (rdev->family == CHIP_RV515)
|
||||
radeon_compute_pll_legacy(pll, adjusted_clock, &pll_clock, &fb_div, &frac_fb_div,
|
||||
&ref_div, &post_div);
|
||||
else if (ASIC_IS_AVIVO(rdev))
|
||||
if (ASIC_IS_AVIVO(rdev))
|
||||
radeon_compute_pll_avivo(pll, adjusted_clock, &pll_clock, &fb_div, &frac_fb_div,
|
||||
&ref_div, &post_div);
|
||||
else
|
||||
@ -995,9 +989,9 @@ static void atombios_crtc_set_pll(struct drm_crtc *crtc, struct drm_display_mode
|
||||
}
|
||||
}
|
||||
|
||||
static int evergreen_crtc_do_set_base(struct drm_crtc *crtc,
|
||||
struct drm_framebuffer *fb,
|
||||
int x, int y, int atomic)
|
||||
static int dce4_crtc_do_set_base(struct drm_crtc *crtc,
|
||||
struct drm_framebuffer *fb,
|
||||
int x, int y, int atomic)
|
||||
{
|
||||
struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
|
||||
struct drm_device *dev = crtc->dev;
|
||||
@ -1137,12 +1131,6 @@ static int evergreen_crtc_do_set_base(struct drm_crtc *crtc,
|
||||
WREG32(EVERGREEN_VIEWPORT_SIZE + radeon_crtc->crtc_offset,
|
||||
(crtc->mode.hdisplay << 16) | crtc->mode.vdisplay);
|
||||
|
||||
if (crtc->mode.flags & DRM_MODE_FLAG_INTERLACE)
|
||||
WREG32(EVERGREEN_DATA_FORMAT + radeon_crtc->crtc_offset,
|
||||
EVERGREEN_INTERLEAVE_EN);
|
||||
else
|
||||
WREG32(EVERGREEN_DATA_FORMAT + radeon_crtc->crtc_offset, 0);
|
||||
|
||||
if (!atomic && fb && fb != crtc->fb) {
|
||||
radeon_fb = to_radeon_framebuffer(fb);
|
||||
rbo = radeon_fb->obj->driver_private;
|
||||
@ -1300,12 +1288,6 @@ static int avivo_crtc_do_set_base(struct drm_crtc *crtc,
|
||||
WREG32(AVIVO_D1MODE_VIEWPORT_SIZE + radeon_crtc->crtc_offset,
|
||||
(crtc->mode.hdisplay << 16) | crtc->mode.vdisplay);
|
||||
|
||||
if (crtc->mode.flags & DRM_MODE_FLAG_INTERLACE)
|
||||
WREG32(AVIVO_D1MODE_DATA_FORMAT + radeon_crtc->crtc_offset,
|
||||
AVIVO_D1MODE_INTERLEAVE_EN);
|
||||
else
|
||||
WREG32(AVIVO_D1MODE_DATA_FORMAT + radeon_crtc->crtc_offset, 0);
|
||||
|
||||
if (!atomic && fb && fb != crtc->fb) {
|
||||
radeon_fb = to_radeon_framebuffer(fb);
|
||||
rbo = radeon_fb->obj->driver_private;
|
||||
@ -1329,7 +1311,7 @@ int atombios_crtc_set_base(struct drm_crtc *crtc, int x, int y,
|
||||
struct radeon_device *rdev = dev->dev_private;
|
||||
|
||||
if (ASIC_IS_DCE4(rdev))
|
||||
return evergreen_crtc_do_set_base(crtc, old_fb, x, y, 0);
|
||||
return dce4_crtc_do_set_base(crtc, old_fb, x, y, 0);
|
||||
else if (ASIC_IS_AVIVO(rdev))
|
||||
return avivo_crtc_do_set_base(crtc, old_fb, x, y, 0);
|
||||
else
|
||||
@ -1344,7 +1326,7 @@ int atombios_crtc_set_base_atomic(struct drm_crtc *crtc,
|
||||
struct radeon_device *rdev = dev->dev_private;
|
||||
|
||||
if (ASIC_IS_DCE4(rdev))
|
||||
return evergreen_crtc_do_set_base(crtc, fb, x, y, 1);
|
||||
return dce4_crtc_do_set_base(crtc, fb, x, y, 1);
|
||||
else if (ASIC_IS_AVIVO(rdev))
|
||||
return avivo_crtc_do_set_base(crtc, fb, x, y, 1);
|
||||
else
|
||||
|
@ -1192,7 +1192,11 @@ void evergreen_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib)
|
||||
radeon_ring_write(rdev, 1);
|
||||
/* FIXME: implement */
|
||||
radeon_ring_write(rdev, PACKET3(PACKET3_INDIRECT_BUFFER, 2));
|
||||
radeon_ring_write(rdev, ib->gpu_addr & 0xFFFFFFFC);
|
||||
radeon_ring_write(rdev,
|
||||
#ifdef __BIG_ENDIAN
|
||||
(2 << 0) |
|
||||
#endif
|
||||
(ib->gpu_addr & 0xFFFFFFFC));
|
||||
radeon_ring_write(rdev, upper_32_bits(ib->gpu_addr) & 0xFF);
|
||||
radeon_ring_write(rdev, ib->length_dw);
|
||||
}
|
||||
@ -1207,7 +1211,11 @@ static int evergreen_cp_load_microcode(struct radeon_device *rdev)
|
||||
return -EINVAL;
|
||||
|
||||
r700_cp_stop(rdev);
|
||||
WREG32(CP_RB_CNTL, RB_NO_UPDATE | (15 << 8) | (3 << 0));
|
||||
WREG32(CP_RB_CNTL,
|
||||
#ifdef __BIG_ENDIAN
|
||||
BUF_SWAP_32BIT |
|
||||
#endif
|
||||
RB_NO_UPDATE | RB_BLKSZ(15) | RB_BUFSZ(3));
|
||||
|
||||
fw_data = (const __be32 *)rdev->pfp_fw->data;
|
||||
WREG32(CP_PFP_UCODE_ADDR, 0);
|
||||
@ -1326,7 +1334,11 @@ int evergreen_cp_resume(struct radeon_device *rdev)
|
||||
WREG32(CP_RB_WPTR, 0);
|
||||
|
||||
/* set the wb address wether it's enabled or not */
|
||||
WREG32(CP_RB_RPTR_ADDR, (rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFFFFFFFC);
|
||||
WREG32(CP_RB_RPTR_ADDR,
|
||||
#ifdef __BIG_ENDIAN
|
||||
RB_RPTR_SWAP(2) |
|
||||
#endif
|
||||
((rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFFFFFFFC));
|
||||
WREG32(CP_RB_RPTR_ADDR_HI, upper_32_bits(rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFF);
|
||||
WREG32(SCRATCH_ADDR, ((rdev->wb.gpu_addr + RADEON_WB_SCRATCH_OFFSET) >> 8) & 0xFFFFFFFF);
|
||||
|
||||
@ -2627,8 +2639,8 @@ restart_ih:
|
||||
while (rptr != wptr) {
|
||||
/* wptr/rptr are in bytes! */
|
||||
ring_index = rptr / 4;
|
||||
src_id = rdev->ih.ring[ring_index] & 0xff;
|
||||
src_data = rdev->ih.ring[ring_index + 1] & 0xfffffff;
|
||||
src_id = le32_to_cpu(rdev->ih.ring[ring_index]) & 0xff;
|
||||
src_data = le32_to_cpu(rdev->ih.ring[ring_index + 1]) & 0xfffffff;
|
||||
|
||||
switch (src_id) {
|
||||
case 1: /* D1 vblank/vline */
|
||||
|
@ -55,7 +55,7 @@ set_render_target(struct radeon_device *rdev, int format,
|
||||
if (h < 8)
|
||||
h = 8;
|
||||
|
||||
cb_color_info = ((format << 2) | (1 << 24));
|
||||
cb_color_info = ((format << 2) | (1 << 24) | (1 << 8));
|
||||
pitch = (w / 8) - 1;
|
||||
slice = ((w * h) / 64) - 1;
|
||||
|
||||
@ -133,6 +133,9 @@ set_vtx_resource(struct radeon_device *rdev, u64 gpu_addr)
|
||||
|
||||
/* high addr, stride */
|
||||
sq_vtx_constant_word2 = ((upper_32_bits(gpu_addr) & 0xff) | (16 << 8));
|
||||
#ifdef __BIG_ENDIAN
|
||||
sq_vtx_constant_word2 |= (2 << 30);
|
||||
#endif
|
||||
/* xyzw swizzles */
|
||||
sq_vtx_constant_word3 = (0 << 3) | (1 << 6) | (2 << 9) | (3 << 12);
|
||||
|
||||
@ -173,7 +176,7 @@ set_tex_resource(struct radeon_device *rdev,
|
||||
sq_tex_resource_word0 = (1 << 0); /* 2D */
|
||||
sq_tex_resource_word0 |= ((((pitch >> 3) - 1) << 6) |
|
||||
((w - 1) << 18));
|
||||
sq_tex_resource_word1 = ((h - 1) << 0);
|
||||
sq_tex_resource_word1 = ((h - 1) << 0) | (1 << 28);
|
||||
/* xyzw swizzles */
|
||||
sq_tex_resource_word4 = (0 << 16) | (1 << 19) | (2 << 22) | (3 << 25);
|
||||
|
||||
@ -221,7 +224,11 @@ draw_auto(struct radeon_device *rdev)
|
||||
radeon_ring_write(rdev, DI_PT_RECTLIST);
|
||||
|
||||
radeon_ring_write(rdev, PACKET3(PACKET3_INDEX_TYPE, 0));
|
||||
radeon_ring_write(rdev, DI_INDEX_SIZE_16_BIT);
|
||||
radeon_ring_write(rdev,
|
||||
#ifdef __BIG_ENDIAN
|
||||
(2 << 2) |
|
||||
#endif
|
||||
DI_INDEX_SIZE_16_BIT);
|
||||
|
||||
radeon_ring_write(rdev, PACKET3(PACKET3_NUM_INSTANCES, 0));
|
||||
radeon_ring_write(rdev, 1);
|
||||
@ -541,7 +548,7 @@ static inline uint32_t i2f(uint32_t input)
|
||||
int evergreen_blit_init(struct radeon_device *rdev)
|
||||
{
|
||||
u32 obj_size;
|
||||
int r, dwords;
|
||||
int i, r, dwords;
|
||||
void *ptr;
|
||||
u32 packet2s[16];
|
||||
int num_packet2s = 0;
|
||||
@ -557,7 +564,7 @@ int evergreen_blit_init(struct radeon_device *rdev)
|
||||
|
||||
dwords = rdev->r600_blit.state_len;
|
||||
while (dwords & 0xf) {
|
||||
packet2s[num_packet2s++] = PACKET2(0);
|
||||
packet2s[num_packet2s++] = cpu_to_le32(PACKET2(0));
|
||||
dwords++;
|
||||
}
|
||||
|
||||
@ -598,8 +605,10 @@ int evergreen_blit_init(struct radeon_device *rdev)
|
||||
if (num_packet2s)
|
||||
memcpy_toio(ptr + rdev->r600_blit.state_offset + (rdev->r600_blit.state_len * 4),
|
||||
packet2s, num_packet2s * 4);
|
||||
memcpy(ptr + rdev->r600_blit.vs_offset, evergreen_vs, evergreen_vs_size * 4);
|
||||
memcpy(ptr + rdev->r600_blit.ps_offset, evergreen_ps, evergreen_ps_size * 4);
|
||||
for (i = 0; i < evergreen_vs_size; i++)
|
||||
*(u32 *)((unsigned long)ptr + rdev->r600_blit.vs_offset + i * 4) = cpu_to_le32(evergreen_vs[i]);
|
||||
for (i = 0; i < evergreen_ps_size; i++)
|
||||
*(u32 *)((unsigned long)ptr + rdev->r600_blit.ps_offset + i * 4) = cpu_to_le32(evergreen_ps[i]);
|
||||
radeon_bo_kunmap(rdev->r600_blit.shader_obj);
|
||||
radeon_bo_unreserve(rdev->r600_blit.shader_obj);
|
||||
|
||||
|
@ -311,11 +311,19 @@ const u32 evergreen_vs[] =
|
||||
0x00000000,
|
||||
0x3c000000,
|
||||
0x67961001,
|
||||
#ifdef __BIG_ENDIAN
|
||||
0x000a0000,
|
||||
#else
|
||||
0x00080000,
|
||||
#endif
|
||||
0x00000000,
|
||||
0x1c000000,
|
||||
0x67961000,
|
||||
#ifdef __BIG_ENDIAN
|
||||
0x00020008,
|
||||
#else
|
||||
0x00000008,
|
||||
#endif
|
||||
0x00000000,
|
||||
};
|
||||
|
||||
|
@ -98,6 +98,7 @@
|
||||
#define BUF_SWAP_32BIT (2 << 16)
|
||||
#define CP_RB_RPTR 0x8700
|
||||
#define CP_RB_RPTR_ADDR 0xC10C
|
||||
#define RB_RPTR_SWAP(x) ((x) << 0)
|
||||
#define CP_RB_RPTR_ADDR_HI 0xC110
|
||||
#define CP_RB_RPTR_WR 0xC108
|
||||
#define CP_RB_WPTR 0xC114
|
||||
|
@ -673,8 +673,10 @@ static int parser_auth(struct table *t, const char *filename)
|
||||
last_reg = strtol(last_reg_s, NULL, 16);
|
||||
|
||||
do {
|
||||
if (fgets(buf, 1024, file) == NULL)
|
||||
if (fgets(buf, 1024, file) == NULL) {
|
||||
fclose(file);
|
||||
return -1;
|
||||
}
|
||||
len = strlen(buf);
|
||||
if (ftell(file) == end)
|
||||
done = 1;
|
||||
@ -685,6 +687,7 @@ static int parser_auth(struct table *t, const char *filename)
|
||||
fprintf(stderr,
|
||||
"Error matching regular expression %d in %s\n",
|
||||
r, filename);
|
||||
fclose(file);
|
||||
return -1;
|
||||
} else {
|
||||
buf[match[0].rm_eo] = 0;
|
||||
|
@ -1427,6 +1427,7 @@ static int r100_packet0_check(struct radeon_cs_parser *p,
|
||||
}
|
||||
track->zb.robj = reloc->robj;
|
||||
track->zb.offset = idx_value;
|
||||
track->zb_dirty = true;
|
||||
ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset);
|
||||
break;
|
||||
case RADEON_RB3D_COLOROFFSET:
|
||||
@ -1439,6 +1440,7 @@ static int r100_packet0_check(struct radeon_cs_parser *p,
|
||||
}
|
||||
track->cb[0].robj = reloc->robj;
|
||||
track->cb[0].offset = idx_value;
|
||||
track->cb_dirty = true;
|
||||
ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset);
|
||||
break;
|
||||
case RADEON_PP_TXOFFSET_0:
|
||||
@ -1454,6 +1456,7 @@ static int r100_packet0_check(struct radeon_cs_parser *p,
|
||||
}
|
||||
ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset);
|
||||
track->textures[i].robj = reloc->robj;
|
||||
track->tex_dirty = true;
|
||||
break;
|
||||
case RADEON_PP_CUBIC_OFFSET_T0_0:
|
||||
case RADEON_PP_CUBIC_OFFSET_T0_1:
|
||||
@ -1471,6 +1474,7 @@ static int r100_packet0_check(struct radeon_cs_parser *p,
|
||||
track->textures[0].cube_info[i].offset = idx_value;
|
||||
ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset);
|
||||
track->textures[0].cube_info[i].robj = reloc->robj;
|
||||
track->tex_dirty = true;
|
||||
break;
|
||||
case RADEON_PP_CUBIC_OFFSET_T1_0:
|
||||
case RADEON_PP_CUBIC_OFFSET_T1_1:
|
||||
@ -1488,6 +1492,7 @@ static int r100_packet0_check(struct radeon_cs_parser *p,
|
||||
track->textures[1].cube_info[i].offset = idx_value;
|
||||
ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset);
|
||||
track->textures[1].cube_info[i].robj = reloc->robj;
|
||||
track->tex_dirty = true;
|
||||
break;
|
||||
case RADEON_PP_CUBIC_OFFSET_T2_0:
|
||||
case RADEON_PP_CUBIC_OFFSET_T2_1:
|
||||
@ -1505,9 +1510,12 @@ static int r100_packet0_check(struct radeon_cs_parser *p,
|
||||
track->textures[2].cube_info[i].offset = idx_value;
|
||||
ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset);
|
||||
track->textures[2].cube_info[i].robj = reloc->robj;
|
||||
track->tex_dirty = true;
|
||||
break;
|
||||
case RADEON_RE_WIDTH_HEIGHT:
|
||||
track->maxy = ((idx_value >> 16) & 0x7FF);
|
||||
track->cb_dirty = true;
|
||||
track->zb_dirty = true;
|
||||
break;
|
||||
case RADEON_RB3D_COLORPITCH:
|
||||
r = r100_cs_packet_next_reloc(p, &reloc);
|
||||
@ -1528,9 +1536,11 @@ static int r100_packet0_check(struct radeon_cs_parser *p,
|
||||
ib[idx] = tmp;
|
||||
|
||||
track->cb[0].pitch = idx_value & RADEON_COLORPITCH_MASK;
|
||||
track->cb_dirty = true;
|
||||
break;
|
||||
case RADEON_RB3D_DEPTHPITCH:
|
||||
track->zb.pitch = idx_value & RADEON_DEPTHPITCH_MASK;
|
||||
track->zb_dirty = true;
|
||||
break;
|
||||
case RADEON_RB3D_CNTL:
|
||||
switch ((idx_value >> RADEON_RB3D_COLOR_FORMAT_SHIFT) & 0x1f) {
|
||||
@ -1555,6 +1565,8 @@ static int r100_packet0_check(struct radeon_cs_parser *p,
|
||||
return -EINVAL;
|
||||
}
|
||||
track->z_enabled = !!(idx_value & RADEON_Z_ENABLE);
|
||||
track->cb_dirty = true;
|
||||
track->zb_dirty = true;
|
||||
break;
|
||||
case RADEON_RB3D_ZSTENCILCNTL:
|
||||
switch (idx_value & 0xf) {
|
||||
@ -1572,6 +1584,7 @@ static int r100_packet0_check(struct radeon_cs_parser *p,
|
||||
default:
|
||||
break;
|
||||
}
|
||||
track->zb_dirty = true;
|
||||
break;
|
||||
case RADEON_RB3D_ZPASS_ADDR:
|
||||
r = r100_cs_packet_next_reloc(p, &reloc);
|
||||
@ -1588,6 +1601,7 @@ static int r100_packet0_check(struct radeon_cs_parser *p,
|
||||
uint32_t temp = idx_value >> 4;
|
||||
for (i = 0; i < track->num_texture; i++)
|
||||
track->textures[i].enabled = !!(temp & (1 << i));
|
||||
track->tex_dirty = true;
|
||||
}
|
||||
break;
|
||||
case RADEON_SE_VF_CNTL:
|
||||
@ -1602,12 +1616,14 @@ static int r100_packet0_check(struct radeon_cs_parser *p,
|
||||
i = (reg - RADEON_PP_TEX_SIZE_0) / 8;
|
||||
track->textures[i].width = (idx_value & RADEON_TEX_USIZE_MASK) + 1;
|
||||
track->textures[i].height = ((idx_value & RADEON_TEX_VSIZE_MASK) >> RADEON_TEX_VSIZE_SHIFT) + 1;
|
||||
track->tex_dirty = true;
|
||||
break;
|
||||
case RADEON_PP_TEX_PITCH_0:
|
||||
case RADEON_PP_TEX_PITCH_1:
|
||||
case RADEON_PP_TEX_PITCH_2:
|
||||
i = (reg - RADEON_PP_TEX_PITCH_0) / 8;
|
||||
track->textures[i].pitch = idx_value + 32;
|
||||
track->tex_dirty = true;
|
||||
break;
|
||||
case RADEON_PP_TXFILTER_0:
|
||||
case RADEON_PP_TXFILTER_1:
|
||||
@ -1621,6 +1637,7 @@ static int r100_packet0_check(struct radeon_cs_parser *p,
|
||||
tmp = (idx_value >> 27) & 0x7;
|
||||
if (tmp == 2 || tmp == 6)
|
||||
track->textures[i].roundup_h = false;
|
||||
track->tex_dirty = true;
|
||||
break;
|
||||
case RADEON_PP_TXFORMAT_0:
|
||||
case RADEON_PP_TXFORMAT_1:
|
||||
@ -1673,6 +1690,7 @@ static int r100_packet0_check(struct radeon_cs_parser *p,
|
||||
}
|
||||
track->textures[i].cube_info[4].width = 1 << ((idx_value >> 16) & 0xf);
|
||||
track->textures[i].cube_info[4].height = 1 << ((idx_value >> 20) & 0xf);
|
||||
track->tex_dirty = true;
|
||||
break;
|
||||
case RADEON_PP_CUBIC_FACES_0:
|
||||
case RADEON_PP_CUBIC_FACES_1:
|
||||
@ -1683,6 +1701,7 @@ static int r100_packet0_check(struct radeon_cs_parser *p,
|
||||
track->textures[i].cube_info[face].width = 1 << ((tmp >> (face * 8)) & 0xf);
|
||||
track->textures[i].cube_info[face].height = 1 << ((tmp >> ((face * 8) + 4)) & 0xf);
|
||||
}
|
||||
track->tex_dirty = true;
|
||||
break;
|
||||
default:
|
||||
printk(KERN_ERR "Forbidden register 0x%04X in cs at %d\n",
|
||||
@ -3318,9 +3337,9 @@ int r100_cs_track_check(struct radeon_device *rdev, struct r100_cs_track *track)
|
||||
unsigned long size;
|
||||
unsigned prim_walk;
|
||||
unsigned nverts;
|
||||
unsigned num_cb = track->num_cb;
|
||||
unsigned num_cb = track->cb_dirty ? track->num_cb : 0;
|
||||
|
||||
if (!track->zb_cb_clear && !track->color_channel_mask &&
|
||||
if (num_cb && !track->zb_cb_clear && !track->color_channel_mask &&
|
||||
!track->blend_read_enable)
|
||||
num_cb = 0;
|
||||
|
||||
@ -3341,7 +3360,9 @@ int r100_cs_track_check(struct radeon_device *rdev, struct r100_cs_track *track)
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
if (track->z_enabled) {
|
||||
track->cb_dirty = false;
|
||||
|
||||
if (track->zb_dirty && track->z_enabled) {
|
||||
if (track->zb.robj == NULL) {
|
||||
DRM_ERROR("[drm] No buffer for z buffer !\n");
|
||||
return -EINVAL;
|
||||
@ -3358,6 +3379,28 @@ int r100_cs_track_check(struct radeon_device *rdev, struct r100_cs_track *track)
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
track->zb_dirty = false;
|
||||
|
||||
if (track->aa_dirty && track->aaresolve) {
|
||||
if (track->aa.robj == NULL) {
|
||||
DRM_ERROR("[drm] No buffer for AA resolve buffer %d !\n", i);
|
||||
return -EINVAL;
|
||||
}
|
||||
/* I believe the format comes from colorbuffer0. */
|
||||
size = track->aa.pitch * track->cb[0].cpp * track->maxy;
|
||||
size += track->aa.offset;
|
||||
if (size > radeon_bo_size(track->aa.robj)) {
|
||||
DRM_ERROR("[drm] Buffer too small for AA resolve buffer %d "
|
||||
"(need %lu have %lu) !\n", i, size,
|
||||
radeon_bo_size(track->aa.robj));
|
||||
DRM_ERROR("[drm] AA resolve buffer %d (%u %u %u %u)\n",
|
||||
i, track->aa.pitch, track->cb[0].cpp,
|
||||
track->aa.offset, track->maxy);
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
track->aa_dirty = false;
|
||||
|
||||
prim_walk = (track->vap_vf_cntl >> 4) & 0x3;
|
||||
if (track->vap_vf_cntl & (1 << 14)) {
|
||||
nverts = track->vap_alt_nverts;
|
||||
@ -3417,13 +3460,23 @@ int r100_cs_track_check(struct radeon_device *rdev, struct r100_cs_track *track)
|
||||
prim_walk);
|
||||
return -EINVAL;
|
||||
}
|
||||
return r100_cs_track_texture_check(rdev, track);
|
||||
|
||||
if (track->tex_dirty) {
|
||||
track->tex_dirty = false;
|
||||
return r100_cs_track_texture_check(rdev, track);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void r100_cs_track_clear(struct radeon_device *rdev, struct r100_cs_track *track)
|
||||
{
|
||||
unsigned i, face;
|
||||
|
||||
track->cb_dirty = true;
|
||||
track->zb_dirty = true;
|
||||
track->tex_dirty = true;
|
||||
track->aa_dirty = true;
|
||||
|
||||
if (rdev->family < CHIP_R300) {
|
||||
track->num_cb = 1;
|
||||
if (rdev->family <= CHIP_RS200)
|
||||
@ -3437,6 +3490,8 @@ void r100_cs_track_clear(struct radeon_device *rdev, struct r100_cs_track *track
|
||||
track->num_texture = 16;
|
||||
track->maxy = 4096;
|
||||
track->separate_cube = 0;
|
||||
track->aaresolve = true;
|
||||
track->aa.robj = NULL;
|
||||
}
|
||||
|
||||
for (i = 0; i < track->num_cb; i++) {
|
||||
|
@ -52,14 +52,7 @@ struct r100_cs_track_texture {
|
||||
unsigned compress_format;
|
||||
};
|
||||
|
||||
struct r100_cs_track_limits {
|
||||
unsigned num_cb;
|
||||
unsigned num_texture;
|
||||
unsigned max_levels;
|
||||
};
|
||||
|
||||
struct r100_cs_track {
|
||||
struct radeon_device *rdev;
|
||||
unsigned num_cb;
|
||||
unsigned num_texture;
|
||||
unsigned maxy;
|
||||
@ -73,11 +66,17 @@ struct r100_cs_track {
|
||||
struct r100_cs_track_array arrays[11];
|
||||
struct r100_cs_track_cb cb[R300_MAX_CB];
|
||||
struct r100_cs_track_cb zb;
|
||||
struct r100_cs_track_cb aa;
|
||||
struct r100_cs_track_texture textures[R300_TRACK_MAX_TEXTURE];
|
||||
bool z_enabled;
|
||||
bool separate_cube;
|
||||
bool zb_cb_clear;
|
||||
bool blend_read_enable;
|
||||
bool cb_dirty;
|
||||
bool zb_dirty;
|
||||
bool tex_dirty;
|
||||
bool aa_dirty;
|
||||
bool aaresolve;
|
||||
};
|
||||
|
||||
int r100_cs_track_check(struct radeon_device *rdev, struct r100_cs_track *track);
|
||||
|
@ -184,6 +184,7 @@ int r200_packet0_check(struct radeon_cs_parser *p,
|
||||
}
|
||||
track->zb.robj = reloc->robj;
|
||||
track->zb.offset = idx_value;
|
||||
track->zb_dirty = true;
|
||||
ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset);
|
||||
break;
|
||||
case RADEON_RB3D_COLOROFFSET:
|
||||
@ -196,6 +197,7 @@ int r200_packet0_check(struct radeon_cs_parser *p,
|
||||
}
|
||||
track->cb[0].robj = reloc->robj;
|
||||
track->cb[0].offset = idx_value;
|
||||
track->cb_dirty = true;
|
||||
ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset);
|
||||
break;
|
||||
case R200_PP_TXOFFSET_0:
|
||||
@ -214,6 +216,7 @@ int r200_packet0_check(struct radeon_cs_parser *p,
|
||||
}
|
||||
ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset);
|
||||
track->textures[i].robj = reloc->robj;
|
||||
track->tex_dirty = true;
|
||||
break;
|
||||
case R200_PP_CUBIC_OFFSET_F1_0:
|
||||
case R200_PP_CUBIC_OFFSET_F2_0:
|
||||
@ -257,9 +260,12 @@ int r200_packet0_check(struct radeon_cs_parser *p,
|
||||
track->textures[i].cube_info[face - 1].offset = idx_value;
|
||||
ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset);
|
||||
track->textures[i].cube_info[face - 1].robj = reloc->robj;
|
||||
track->tex_dirty = true;
|
||||
break;
|
||||
case RADEON_RE_WIDTH_HEIGHT:
|
||||
track->maxy = ((idx_value >> 16) & 0x7FF);
|
||||
track->cb_dirty = true;
|
||||
track->zb_dirty = true;
|
||||
break;
|
||||
case RADEON_RB3D_COLORPITCH:
|
||||
r = r100_cs_packet_next_reloc(p, &reloc);
|
||||
@ -280,9 +286,11 @@ int r200_packet0_check(struct radeon_cs_parser *p,
|
||||
ib[idx] = tmp;
|
||||
|
||||
track->cb[0].pitch = idx_value & RADEON_COLORPITCH_MASK;
|
||||
track->cb_dirty = true;
|
||||
break;
|
||||
case RADEON_RB3D_DEPTHPITCH:
|
||||
track->zb.pitch = idx_value & RADEON_DEPTHPITCH_MASK;
|
||||
track->zb_dirty = true;
|
||||
break;
|
||||
case RADEON_RB3D_CNTL:
|
||||
switch ((idx_value >> RADEON_RB3D_COLOR_FORMAT_SHIFT) & 0x1f) {
|
||||
@ -312,6 +320,8 @@ int r200_packet0_check(struct radeon_cs_parser *p,
|
||||
}
|
||||
|
||||
track->z_enabled = !!(idx_value & RADEON_Z_ENABLE);
|
||||
track->cb_dirty = true;
|
||||
track->zb_dirty = true;
|
||||
break;
|
||||
case RADEON_RB3D_ZSTENCILCNTL:
|
||||
switch (idx_value & 0xf) {
|
||||
@ -329,6 +339,7 @@ int r200_packet0_check(struct radeon_cs_parser *p,
|
||||
default:
|
||||
break;
|
||||
}
|
||||
track->zb_dirty = true;
|
||||
break;
|
||||
case RADEON_RB3D_ZPASS_ADDR:
|
||||
r = r100_cs_packet_next_reloc(p, &reloc);
|
||||
@ -345,6 +356,7 @@ int r200_packet0_check(struct radeon_cs_parser *p,
|
||||
uint32_t temp = idx_value >> 4;
|
||||
for (i = 0; i < track->num_texture; i++)
|
||||
track->textures[i].enabled = !!(temp & (1 << i));
|
||||
track->tex_dirty = true;
|
||||
}
|
||||
break;
|
||||
case RADEON_SE_VF_CNTL:
|
||||
@ -369,6 +381,7 @@ int r200_packet0_check(struct radeon_cs_parser *p,
|
||||
i = (reg - R200_PP_TXSIZE_0) / 32;
|
||||
track->textures[i].width = (idx_value & RADEON_TEX_USIZE_MASK) + 1;
|
||||
track->textures[i].height = ((idx_value & RADEON_TEX_VSIZE_MASK) >> RADEON_TEX_VSIZE_SHIFT) + 1;
|
||||
track->tex_dirty = true;
|
||||
break;
|
||||
case R200_PP_TXPITCH_0:
|
||||
case R200_PP_TXPITCH_1:
|
||||
@ -378,6 +391,7 @@ int r200_packet0_check(struct radeon_cs_parser *p,
|
||||
case R200_PP_TXPITCH_5:
|
||||
i = (reg - R200_PP_TXPITCH_0) / 32;
|
||||
track->textures[i].pitch = idx_value + 32;
|
||||
track->tex_dirty = true;
|
||||
break;
|
||||
case R200_PP_TXFILTER_0:
|
||||
case R200_PP_TXFILTER_1:
|
||||
@ -394,6 +408,7 @@ int r200_packet0_check(struct radeon_cs_parser *p,
|
||||
tmp = (idx_value >> 27) & 0x7;
|
||||
if (tmp == 2 || tmp == 6)
|
||||
track->textures[i].roundup_h = false;
|
||||
track->tex_dirty = true;
|
||||
break;
|
||||
case R200_PP_TXMULTI_CTL_0:
|
||||
case R200_PP_TXMULTI_CTL_1:
|
||||
@ -432,6 +447,7 @@ int r200_packet0_check(struct radeon_cs_parser *p,
|
||||
track->textures[i].tex_coord_type = 1;
|
||||
break;
|
||||
}
|
||||
track->tex_dirty = true;
|
||||
break;
|
||||
case R200_PP_TXFORMAT_0:
|
||||
case R200_PP_TXFORMAT_1:
|
||||
@ -488,6 +504,7 @@ int r200_packet0_check(struct radeon_cs_parser *p,
|
||||
}
|
||||
track->textures[i].cube_info[4].width = 1 << ((idx_value >> 16) & 0xf);
|
||||
track->textures[i].cube_info[4].height = 1 << ((idx_value >> 20) & 0xf);
|
||||
track->tex_dirty = true;
|
||||
break;
|
||||
case R200_PP_CUBIC_FACES_0:
|
||||
case R200_PP_CUBIC_FACES_1:
|
||||
@ -501,6 +518,7 @@ int r200_packet0_check(struct radeon_cs_parser *p,
|
||||
track->textures[i].cube_info[face].width = 1 << ((tmp >> (face * 8)) & 0xf);
|
||||
track->textures[i].cube_info[face].height = 1 << ((tmp >> ((face * 8) + 4)) & 0xf);
|
||||
}
|
||||
track->tex_dirty = true;
|
||||
break;
|
||||
default:
|
||||
printk(KERN_ERR "Forbidden register 0x%04X in cs at %d\n",
|
||||
|
@ -667,6 +667,7 @@ static int r300_packet0_check(struct radeon_cs_parser *p,
|
||||
}
|
||||
track->cb[i].robj = reloc->robj;
|
||||
track->cb[i].offset = idx_value;
|
||||
track->cb_dirty = true;
|
||||
ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset);
|
||||
break;
|
||||
case R300_ZB_DEPTHOFFSET:
|
||||
@ -679,6 +680,7 @@ static int r300_packet0_check(struct radeon_cs_parser *p,
|
||||
}
|
||||
track->zb.robj = reloc->robj;
|
||||
track->zb.offset = idx_value;
|
||||
track->zb_dirty = true;
|
||||
ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset);
|
||||
break;
|
||||
case R300_TX_OFFSET_0:
|
||||
@ -717,6 +719,7 @@ static int r300_packet0_check(struct radeon_cs_parser *p,
|
||||
tmp |= tile_flags;
|
||||
ib[idx] = tmp;
|
||||
track->textures[i].robj = reloc->robj;
|
||||
track->tex_dirty = true;
|
||||
break;
|
||||
/* Tracked registers */
|
||||
case 0x2084:
|
||||
@ -743,6 +746,8 @@ static int r300_packet0_check(struct radeon_cs_parser *p,
|
||||
if (p->rdev->family < CHIP_RV515) {
|
||||
track->maxy -= 1440;
|
||||
}
|
||||
track->cb_dirty = true;
|
||||
track->zb_dirty = true;
|
||||
break;
|
||||
case 0x4E00:
|
||||
/* RB3D_CCTL */
|
||||
@ -752,6 +757,7 @@ static int r300_packet0_check(struct radeon_cs_parser *p,
|
||||
return -EINVAL;
|
||||
}
|
||||
track->num_cb = ((idx_value >> 5) & 0x3) + 1;
|
||||
track->cb_dirty = true;
|
||||
break;
|
||||
case 0x4E38:
|
||||
case 0x4E3C:
|
||||
@ -814,6 +820,7 @@ static int r300_packet0_check(struct radeon_cs_parser *p,
|
||||
((idx_value >> 21) & 0xF));
|
||||
return -EINVAL;
|
||||
}
|
||||
track->cb_dirty = true;
|
||||
break;
|
||||
case 0x4F00:
|
||||
/* ZB_CNTL */
|
||||
@ -822,6 +829,7 @@ static int r300_packet0_check(struct radeon_cs_parser *p,
|
||||
} else {
|
||||
track->z_enabled = false;
|
||||
}
|
||||
track->zb_dirty = true;
|
||||
break;
|
||||
case 0x4F10:
|
||||
/* ZB_FORMAT */
|
||||
@ -838,6 +846,7 @@ static int r300_packet0_check(struct radeon_cs_parser *p,
|
||||
(idx_value & 0xF));
|
||||
return -EINVAL;
|
||||
}
|
||||
track->zb_dirty = true;
|
||||
break;
|
||||
case 0x4F24:
|
||||
/* ZB_DEPTHPITCH */
|
||||
@ -861,14 +870,17 @@ static int r300_packet0_check(struct radeon_cs_parser *p,
|
||||
ib[idx] = tmp;
|
||||
|
||||
track->zb.pitch = idx_value & 0x3FFC;
|
||||
track->zb_dirty = true;
|
||||
break;
|
||||
case 0x4104:
|
||||
/* TX_ENABLE */
|
||||
for (i = 0; i < 16; i++) {
|
||||
bool enabled;
|
||||
|
||||
enabled = !!(idx_value & (1 << i));
|
||||
track->textures[i].enabled = enabled;
|
||||
}
|
||||
track->tex_dirty = true;
|
||||
break;
|
||||
case 0x44C0:
|
||||
case 0x44C4:
|
||||
@ -951,8 +963,8 @@ static int r300_packet0_check(struct radeon_cs_parser *p,
|
||||
DRM_ERROR("Invalid texture format %u\n",
|
||||
(idx_value & 0x1F));
|
||||
return -EINVAL;
|
||||
break;
|
||||
}
|
||||
track->tex_dirty = true;
|
||||
break;
|
||||
case 0x4400:
|
||||
case 0x4404:
|
||||
@ -980,6 +992,7 @@ static int r300_packet0_check(struct radeon_cs_parser *p,
|
||||
if (tmp == 2 || tmp == 4 || tmp == 6) {
|
||||
track->textures[i].roundup_h = false;
|
||||
}
|
||||
track->tex_dirty = true;
|
||||
break;
|
||||
case 0x4500:
|
||||
case 0x4504:
|
||||
@ -1017,6 +1030,7 @@ static int r300_packet0_check(struct radeon_cs_parser *p,
|
||||
DRM_ERROR("Forbidden bit TXFORMAT_MSB\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
track->tex_dirty = true;
|
||||
break;
|
||||
case 0x4480:
|
||||
case 0x4484:
|
||||
@ -1046,6 +1060,7 @@ static int r300_packet0_check(struct radeon_cs_parser *p,
|
||||
track->textures[i].use_pitch = !!tmp;
|
||||
tmp = (idx_value >> 22) & 0xF;
|
||||
track->textures[i].txdepth = tmp;
|
||||
track->tex_dirty = true;
|
||||
break;
|
||||
case R300_ZB_ZPASS_ADDR:
|
||||
r = r100_cs_packet_next_reloc(p, &reloc);
|
||||
@ -1060,6 +1075,7 @@ static int r300_packet0_check(struct radeon_cs_parser *p,
|
||||
case 0x4e0c:
|
||||
/* RB3D_COLOR_CHANNEL_MASK */
|
||||
track->color_channel_mask = idx_value;
|
||||
track->cb_dirty = true;
|
||||
break;
|
||||
case 0x43a4:
|
||||
/* SC_HYPERZ_EN */
|
||||
@ -1073,6 +1089,8 @@ static int r300_packet0_check(struct radeon_cs_parser *p,
|
||||
case 0x4f1c:
|
||||
/* ZB_BW_CNTL */
|
||||
track->zb_cb_clear = !!(idx_value & (1 << 5));
|
||||
track->cb_dirty = true;
|
||||
track->zb_dirty = true;
|
||||
if (p->rdev->hyperz_filp != p->filp) {
|
||||
if (idx_value & (R300_HIZ_ENABLE |
|
||||
R300_RD_COMP_ENABLE |
|
||||
@ -1084,8 +1102,28 @@ static int r300_packet0_check(struct radeon_cs_parser *p,
|
||||
case 0x4e04:
|
||||
/* RB3D_BLENDCNTL */
|
||||
track->blend_read_enable = !!(idx_value & (1 << 2));
|
||||
track->cb_dirty = true;
|
||||
break;
|
||||
case 0x4f28: /* ZB_DEPTHCLEARVALUE */
|
||||
case R300_RB3D_AARESOLVE_OFFSET:
|
||||
r = r100_cs_packet_next_reloc(p, &reloc);
|
||||
if (r) {
|
||||
DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
|
||||
idx, reg);
|
||||
r100_cs_dump_packet(p, pkt);
|
||||
return r;
|
||||
}
|
||||
track->aa.robj = reloc->robj;
|
||||
track->aa.offset = idx_value;
|
||||
track->aa_dirty = true;
|
||||
ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset);
|
||||
break;
|
||||
case R300_RB3D_AARESOLVE_PITCH:
|
||||
track->aa.pitch = idx_value & 0x3FFE;
|
||||
track->aa_dirty = true;
|
||||
break;
|
||||
case R300_RB3D_AARESOLVE_CTL:
|
||||
track->aaresolve = idx_value & 0x1;
|
||||
track->aa_dirty = true;
|
||||
break;
|
||||
case 0x4f30: /* ZB_MASK_OFFSET */
|
||||
case 0x4f34: /* ZB_ZMASK_PITCH */
|
||||
|
@ -1371,6 +1371,8 @@
|
||||
#define R300_RB3D_COLORPITCH2 0x4E40 /* GUESS */
|
||||
#define R300_RB3D_COLORPITCH3 0x4E44 /* GUESS */
|
||||
|
||||
#define R300_RB3D_AARESOLVE_OFFSET 0x4E80
|
||||
#define R300_RB3D_AARESOLVE_PITCH 0x4E84
|
||||
#define R300_RB3D_AARESOLVE_CTL 0x4E88
|
||||
/* gap */
|
||||
|
||||
|
@ -2105,7 +2105,11 @@ static int r600_cp_load_microcode(struct radeon_device *rdev)
|
||||
|
||||
r600_cp_stop(rdev);
|
||||
|
||||
WREG32(CP_RB_CNTL, RB_NO_UPDATE | RB_BLKSZ(15) | RB_BUFSZ(3));
|
||||
WREG32(CP_RB_CNTL,
|
||||
#ifdef __BIG_ENDIAN
|
||||
BUF_SWAP_32BIT |
|
||||
#endif
|
||||
RB_NO_UPDATE | RB_BLKSZ(15) | RB_BUFSZ(3));
|
||||
|
||||
/* Reset cp */
|
||||
WREG32(GRBM_SOFT_RESET, SOFT_RESET_CP);
|
||||
@ -2192,7 +2196,11 @@ int r600_cp_resume(struct radeon_device *rdev)
|
||||
WREG32(CP_RB_WPTR, 0);
|
||||
|
||||
/* set the wb address whether it's enabled or not */
|
||||
WREG32(CP_RB_RPTR_ADDR, (rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFFFFFFFC);
|
||||
WREG32(CP_RB_RPTR_ADDR,
|
||||
#ifdef __BIG_ENDIAN
|
||||
RB_RPTR_SWAP(2) |
|
||||
#endif
|
||||
((rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFFFFFFFC));
|
||||
WREG32(CP_RB_RPTR_ADDR_HI, upper_32_bits(rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFF);
|
||||
WREG32(SCRATCH_ADDR, ((rdev->wb.gpu_addr + RADEON_WB_SCRATCH_OFFSET) >> 8) & 0xFFFFFFFF);
|
||||
|
||||
@ -2628,7 +2636,11 @@ void r600_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib)
|
||||
{
|
||||
/* FIXME: implement */
|
||||
radeon_ring_write(rdev, PACKET3(PACKET3_INDIRECT_BUFFER, 2));
|
||||
radeon_ring_write(rdev, ib->gpu_addr & 0xFFFFFFFC);
|
||||
radeon_ring_write(rdev,
|
||||
#ifdef __BIG_ENDIAN
|
||||
(2 << 0) |
|
||||
#endif
|
||||
(ib->gpu_addr & 0xFFFFFFFC));
|
||||
radeon_ring_write(rdev, upper_32_bits(ib->gpu_addr) & 0xFF);
|
||||
radeon_ring_write(rdev, ib->length_dw);
|
||||
}
|
||||
@ -3297,8 +3309,8 @@ restart_ih:
|
||||
while (rptr != wptr) {
|
||||
/* wptr/rptr are in bytes! */
|
||||
ring_index = rptr / 4;
|
||||
src_id = rdev->ih.ring[ring_index] & 0xff;
|
||||
src_data = rdev->ih.ring[ring_index + 1] & 0xfffffff;
|
||||
src_id = le32_to_cpu(rdev->ih.ring[ring_index]) & 0xff;
|
||||
src_data = le32_to_cpu(rdev->ih.ring[ring_index + 1]) & 0xfffffff;
|
||||
|
||||
switch (src_id) {
|
||||
case 1: /* D1 vblank/vline */
|
||||
|
@ -137,9 +137,9 @@ set_shaders(struct drm_device *dev)
|
||||
ps = (u32 *) ((char *)dev->agp_buffer_map->handle + dev_priv->blit_vb->offset + 256);
|
||||
|
||||
for (i = 0; i < r6xx_vs_size; i++)
|
||||
vs[i] = r6xx_vs[i];
|
||||
vs[i] = cpu_to_le32(r6xx_vs[i]);
|
||||
for (i = 0; i < r6xx_ps_size; i++)
|
||||
ps[i] = r6xx_ps[i];
|
||||
ps[i] = cpu_to_le32(r6xx_ps[i]);
|
||||
|
||||
dev_priv->blit_vb->used = 512;
|
||||
|
||||
@ -192,6 +192,9 @@ set_vtx_resource(drm_radeon_private_t *dev_priv, u64 gpu_addr)
|
||||
DRM_DEBUG("\n");
|
||||
|
||||
sq_vtx_constant_word2 = (((gpu_addr >> 32) & 0xff) | (16 << 8));
|
||||
#ifdef __BIG_ENDIAN
|
||||
sq_vtx_constant_word2 |= (2 << 30);
|
||||
#endif
|
||||
|
||||
BEGIN_RING(9);
|
||||
OUT_RING(CP_PACKET3(R600_IT_SET_RESOURCE, 7));
|
||||
@ -291,7 +294,11 @@ draw_auto(drm_radeon_private_t *dev_priv)
|
||||
OUT_RING(DI_PT_RECTLIST);
|
||||
|
||||
OUT_RING(CP_PACKET3(R600_IT_INDEX_TYPE, 0));
|
||||
#ifdef __BIG_ENDIAN
|
||||
OUT_RING((2 << 2) | DI_INDEX_SIZE_16_BIT);
|
||||
#else
|
||||
OUT_RING(DI_INDEX_SIZE_16_BIT);
|
||||
#endif
|
||||
|
||||
OUT_RING(CP_PACKET3(R600_IT_NUM_INSTANCES, 0));
|
||||
OUT_RING(1);
|
||||
|
@ -54,7 +54,7 @@ set_render_target(struct radeon_device *rdev, int format,
|
||||
if (h < 8)
|
||||
h = 8;
|
||||
|
||||
cb_color_info = ((format << 2) | (1 << 27));
|
||||
cb_color_info = ((format << 2) | (1 << 27) | (1 << 8));
|
||||
pitch = (w / 8) - 1;
|
||||
slice = ((w * h) / 64) - 1;
|
||||
|
||||
@ -165,6 +165,9 @@ set_vtx_resource(struct radeon_device *rdev, u64 gpu_addr)
|
||||
u32 sq_vtx_constant_word2;
|
||||
|
||||
sq_vtx_constant_word2 = ((upper_32_bits(gpu_addr) & 0xff) | (16 << 8));
|
||||
#ifdef __BIG_ENDIAN
|
||||
sq_vtx_constant_word2 |= (2 << 30);
|
||||
#endif
|
||||
|
||||
radeon_ring_write(rdev, PACKET3(PACKET3_SET_RESOURCE, 7));
|
||||
radeon_ring_write(rdev, 0x460);
|
||||
@ -199,7 +202,7 @@ set_tex_resource(struct radeon_device *rdev,
|
||||
if (h < 1)
|
||||
h = 1;
|
||||
|
||||
sq_tex_resource_word0 = (1 << 0);
|
||||
sq_tex_resource_word0 = (1 << 0) | (1 << 3);
|
||||
sq_tex_resource_word0 |= ((((pitch >> 3) - 1) << 8) |
|
||||
((w - 1) << 19));
|
||||
|
||||
@ -253,7 +256,11 @@ draw_auto(struct radeon_device *rdev)
|
||||
radeon_ring_write(rdev, DI_PT_RECTLIST);
|
||||
|
||||
radeon_ring_write(rdev, PACKET3(PACKET3_INDEX_TYPE, 0));
|
||||
radeon_ring_write(rdev, DI_INDEX_SIZE_16_BIT);
|
||||
radeon_ring_write(rdev,
|
||||
#ifdef __BIG_ENDIAN
|
||||
(2 << 2) |
|
||||
#endif
|
||||
DI_INDEX_SIZE_16_BIT);
|
||||
|
||||
radeon_ring_write(rdev, PACKET3(PACKET3_NUM_INSTANCES, 0));
|
||||
radeon_ring_write(rdev, 1);
|
||||
@ -424,7 +431,11 @@ set_default_state(struct radeon_device *rdev)
|
||||
dwords = ALIGN(rdev->r600_blit.state_len, 0x10);
|
||||
gpu_addr = rdev->r600_blit.shader_gpu_addr + rdev->r600_blit.state_offset;
|
||||
radeon_ring_write(rdev, PACKET3(PACKET3_INDIRECT_BUFFER, 2));
|
||||
radeon_ring_write(rdev, gpu_addr & 0xFFFFFFFC);
|
||||
radeon_ring_write(rdev,
|
||||
#ifdef __BIG_ENDIAN
|
||||
(2 << 0) |
|
||||
#endif
|
||||
(gpu_addr & 0xFFFFFFFC));
|
||||
radeon_ring_write(rdev, upper_32_bits(gpu_addr) & 0xFF);
|
||||
radeon_ring_write(rdev, dwords);
|
||||
|
||||
@ -467,7 +478,7 @@ static inline uint32_t i2f(uint32_t input)
|
||||
int r600_blit_init(struct radeon_device *rdev)
|
||||
{
|
||||
u32 obj_size;
|
||||
int r, dwords;
|
||||
int i, r, dwords;
|
||||
void *ptr;
|
||||
u32 packet2s[16];
|
||||
int num_packet2s = 0;
|
||||
@ -486,7 +497,7 @@ int r600_blit_init(struct radeon_device *rdev)
|
||||
|
||||
dwords = rdev->r600_blit.state_len;
|
||||
while (dwords & 0xf) {
|
||||
packet2s[num_packet2s++] = PACKET2(0);
|
||||
packet2s[num_packet2s++] = cpu_to_le32(PACKET2(0));
|
||||
dwords++;
|
||||
}
|
||||
|
||||
@ -529,8 +540,10 @@ int r600_blit_init(struct radeon_device *rdev)
|
||||
if (num_packet2s)
|
||||
memcpy_toio(ptr + rdev->r600_blit.state_offset + (rdev->r600_blit.state_len * 4),
|
||||
packet2s, num_packet2s * 4);
|
||||
memcpy(ptr + rdev->r600_blit.vs_offset, r6xx_vs, r6xx_vs_size * 4);
|
||||
memcpy(ptr + rdev->r600_blit.ps_offset, r6xx_ps, r6xx_ps_size * 4);
|
||||
for (i = 0; i < r6xx_vs_size; i++)
|
||||
*(u32 *)((unsigned long)ptr + rdev->r600_blit.vs_offset + i * 4) = cpu_to_le32(r6xx_vs[i]);
|
||||
for (i = 0; i < r6xx_ps_size; i++)
|
||||
*(u32 *)((unsigned long)ptr + rdev->r600_blit.ps_offset + i * 4) = cpu_to_le32(r6xx_ps[i]);
|
||||
radeon_bo_kunmap(rdev->r600_blit.shader_obj);
|
||||
radeon_bo_unreserve(rdev->r600_blit.shader_obj);
|
||||
|
||||
|
@ -684,7 +684,11 @@ const u32 r6xx_vs[] =
|
||||
0x00000000,
|
||||
0x3c000000,
|
||||
0x68cd1000,
|
||||
#ifdef __BIG_ENDIAN
|
||||
0x000a0000,
|
||||
#else
|
||||
0x00080000,
|
||||
#endif
|
||||
0x00000000,
|
||||
};
|
||||
|
||||
|
@ -396,6 +396,9 @@ static void r600_cp_load_microcode(drm_radeon_private_t *dev_priv)
|
||||
r600_do_cp_stop(dev_priv);
|
||||
|
||||
RADEON_WRITE(R600_CP_RB_CNTL,
|
||||
#ifdef __BIG_ENDIAN
|
||||
R600_BUF_SWAP_32BIT |
|
||||
#endif
|
||||
R600_RB_NO_UPDATE |
|
||||
R600_RB_BLKSZ(15) |
|
||||
R600_RB_BUFSZ(3));
|
||||
@ -486,9 +489,12 @@ static void r700_cp_load_microcode(drm_radeon_private_t *dev_priv)
|
||||
r600_do_cp_stop(dev_priv);
|
||||
|
||||
RADEON_WRITE(R600_CP_RB_CNTL,
|
||||
#ifdef __BIG_ENDIAN
|
||||
R600_BUF_SWAP_32BIT |
|
||||
#endif
|
||||
R600_RB_NO_UPDATE |
|
||||
(15 << 8) |
|
||||
(3 << 0));
|
||||
R600_RB_BLKSZ(15) |
|
||||
R600_RB_BUFSZ(3));
|
||||
|
||||
RADEON_WRITE(R600_GRBM_SOFT_RESET, R600_SOFT_RESET_CP);
|
||||
RADEON_READ(R600_GRBM_SOFT_RESET);
|
||||
@ -550,8 +556,12 @@ static void r600_test_writeback(drm_radeon_private_t *dev_priv)
|
||||
|
||||
if (!dev_priv->writeback_works) {
|
||||
/* Disable writeback to avoid unnecessary bus master transfer */
|
||||
RADEON_WRITE(R600_CP_RB_CNTL, RADEON_READ(R600_CP_RB_CNTL) |
|
||||
RADEON_RB_NO_UPDATE);
|
||||
RADEON_WRITE(R600_CP_RB_CNTL,
|
||||
#ifdef __BIG_ENDIAN
|
||||
R600_BUF_SWAP_32BIT |
|
||||
#endif
|
||||
RADEON_READ(R600_CP_RB_CNTL) |
|
||||
R600_RB_NO_UPDATE);
|
||||
RADEON_WRITE(R600_SCRATCH_UMSK, 0);
|
||||
}
|
||||
}
|
||||
@ -575,7 +585,11 @@ int r600_do_engine_reset(struct drm_device *dev)
|
||||
|
||||
RADEON_WRITE(R600_CP_RB_WPTR_DELAY, 0);
|
||||
cp_rb_cntl = RADEON_READ(R600_CP_RB_CNTL);
|
||||
RADEON_WRITE(R600_CP_RB_CNTL, R600_RB_RPTR_WR_ENA);
|
||||
RADEON_WRITE(R600_CP_RB_CNTL,
|
||||
#ifdef __BIG_ENDIAN
|
||||
R600_BUF_SWAP_32BIT |
|
||||
#endif
|
||||
R600_RB_RPTR_WR_ENA);
|
||||
|
||||
RADEON_WRITE(R600_CP_RB_RPTR_WR, cp_ptr);
|
||||
RADEON_WRITE(R600_CP_RB_WPTR, cp_ptr);
|
||||
@ -1838,7 +1852,10 @@ static void r600_cp_init_ring_buffer(struct drm_device *dev,
|
||||
+ dev_priv->gart_vm_start;
|
||||
}
|
||||
RADEON_WRITE(R600_CP_RB_RPTR_ADDR,
|
||||
rptr_addr & 0xffffffff);
|
||||
#ifdef __BIG_ENDIAN
|
||||
(2 << 0) |
|
||||
#endif
|
||||
(rptr_addr & 0xfffffffc));
|
||||
RADEON_WRITE(R600_CP_RB_RPTR_ADDR_HI,
|
||||
upper_32_bits(rptr_addr));
|
||||
|
||||
@ -1889,7 +1906,7 @@ static void r600_cp_init_ring_buffer(struct drm_device *dev,
|
||||
{
|
||||
u64 scratch_addr;
|
||||
|
||||
scratch_addr = RADEON_READ(R600_CP_RB_RPTR_ADDR);
|
||||
scratch_addr = RADEON_READ(R600_CP_RB_RPTR_ADDR) & 0xFFFFFFFC;
|
||||
scratch_addr |= ((u64)RADEON_READ(R600_CP_RB_RPTR_ADDR_HI)) << 32;
|
||||
scratch_addr += R600_SCRATCH_REG_OFFSET;
|
||||
scratch_addr >>= 8;
|
||||
|
@ -295,17 +295,18 @@ static inline int r600_cs_track_validate_cb(struct radeon_cs_parser *p, int i)
|
||||
}
|
||||
|
||||
if (!IS_ALIGNED(pitch, pitch_align)) {
|
||||
dev_warn(p->dev, "%s:%d cb pitch (%d) invalid\n",
|
||||
__func__, __LINE__, pitch);
|
||||
dev_warn(p->dev, "%s:%d cb pitch (%d, 0x%x, %d) invalid\n",
|
||||
__func__, __LINE__, pitch, pitch_align, array_mode);
|
||||
return -EINVAL;
|
||||
}
|
||||
if (!IS_ALIGNED(height, height_align)) {
|
||||
dev_warn(p->dev, "%s:%d cb height (%d) invalid\n",
|
||||
__func__, __LINE__, height);
|
||||
dev_warn(p->dev, "%s:%d cb height (%d, 0x%x, %d) invalid\n",
|
||||
__func__, __LINE__, height, height_align, array_mode);
|
||||
return -EINVAL;
|
||||
}
|
||||
if (!IS_ALIGNED(base_offset, base_align)) {
|
||||
dev_warn(p->dev, "%s offset[%d] 0x%llx not aligned\n", __func__, i, base_offset);
|
||||
dev_warn(p->dev, "%s offset[%d] 0x%llx 0x%llx, %d not aligned\n", __func__, i,
|
||||
base_offset, base_align, array_mode);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@ -320,7 +321,10 @@ static inline int r600_cs_track_validate_cb(struct radeon_cs_parser *p, int i)
|
||||
* broken userspace.
|
||||
*/
|
||||
} else {
|
||||
dev_warn(p->dev, "%s offset[%d] %d %d %lu too big\n", __func__, i, track->cb_color_bo_offset[i], tmp, radeon_bo_size(track->cb_color_bo[i]));
|
||||
dev_warn(p->dev, "%s offset[%d] %d %d %d %lu too big\n", __func__, i,
|
||||
array_mode,
|
||||
track->cb_color_bo_offset[i], tmp,
|
||||
radeon_bo_size(track->cb_color_bo[i]));
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
@ -455,17 +459,18 @@ static int r600_cs_track_check(struct radeon_cs_parser *p)
|
||||
}
|
||||
|
||||
if (!IS_ALIGNED(pitch, pitch_align)) {
|
||||
dev_warn(p->dev, "%s:%d db pitch (%d) invalid\n",
|
||||
__func__, __LINE__, pitch);
|
||||
dev_warn(p->dev, "%s:%d db pitch (%d, 0x%x, %d) invalid\n",
|
||||
__func__, __LINE__, pitch, pitch_align, array_mode);
|
||||
return -EINVAL;
|
||||
}
|
||||
if (!IS_ALIGNED(height, height_align)) {
|
||||
dev_warn(p->dev, "%s:%d db height (%d) invalid\n",
|
||||
__func__, __LINE__, height);
|
||||
dev_warn(p->dev, "%s:%d db height (%d, 0x%x, %d) invalid\n",
|
||||
__func__, __LINE__, height, height_align, array_mode);
|
||||
return -EINVAL;
|
||||
}
|
||||
if (!IS_ALIGNED(base_offset, base_align)) {
|
||||
dev_warn(p->dev, "%s offset[%d] 0x%llx not aligned\n", __func__, i, base_offset);
|
||||
dev_warn(p->dev, "%s offset[%d] 0x%llx, 0x%llx, %d not aligned\n", __func__, i,
|
||||
base_offset, base_align, array_mode);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@ -473,9 +478,10 @@ static int r600_cs_track_check(struct radeon_cs_parser *p)
|
||||
nviews = G_028004_SLICE_MAX(track->db_depth_view) + 1;
|
||||
tmp = ntiles * bpe * 64 * nviews;
|
||||
if ((tmp + track->db_offset) > radeon_bo_size(track->db_bo)) {
|
||||
dev_warn(p->dev, "z/stencil buffer too small (0x%08X %d %d %d -> %u have %lu)\n",
|
||||
track->db_depth_size, ntiles, nviews, bpe, tmp + track->db_offset,
|
||||
radeon_bo_size(track->db_bo));
|
||||
dev_warn(p->dev, "z/stencil buffer (%d) too small (0x%08X %d %d %d -> %u have %lu)\n",
|
||||
array_mode,
|
||||
track->db_depth_size, ntiles, nviews, bpe, tmp + track->db_offset,
|
||||
radeon_bo_size(track->db_bo));
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
@ -1227,18 +1233,18 @@ static inline int r600_check_texture_resource(struct radeon_cs_parser *p, u32 i
|
||||
/* XXX check height as well... */
|
||||
|
||||
if (!IS_ALIGNED(pitch, pitch_align)) {
|
||||
dev_warn(p->dev, "%s:%d tex pitch (%d) invalid\n",
|
||||
__func__, __LINE__, pitch);
|
||||
dev_warn(p->dev, "%s:%d tex pitch (%d, 0x%x, %d) invalid\n",
|
||||
__func__, __LINE__, pitch, pitch_align, G_038000_TILE_MODE(word0));
|
||||
return -EINVAL;
|
||||
}
|
||||
if (!IS_ALIGNED(base_offset, base_align)) {
|
||||
dev_warn(p->dev, "%s:%d tex base offset (0x%llx) invalid\n",
|
||||
__func__, __LINE__, base_offset);
|
||||
dev_warn(p->dev, "%s:%d tex base offset (0x%llx, 0x%llx, %d) invalid\n",
|
||||
__func__, __LINE__, base_offset, base_align, G_038000_TILE_MODE(word0));
|
||||
return -EINVAL;
|
||||
}
|
||||
if (!IS_ALIGNED(mip_offset, base_align)) {
|
||||
dev_warn(p->dev, "%s:%d tex mip offset (0x%llx) invalid\n",
|
||||
__func__, __LINE__, mip_offset);
|
||||
dev_warn(p->dev, "%s:%d tex mip offset (0x%llx, 0x%llx, %d) invalid\n",
|
||||
__func__, __LINE__, mip_offset, base_align, G_038000_TILE_MODE(word0));
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
@ -154,13 +154,14 @@
|
||||
#define ROQ_IB2_START(x) ((x) << 8)
|
||||
#define CP_RB_BASE 0xC100
|
||||
#define CP_RB_CNTL 0xC104
|
||||
#define RB_BUFSZ(x) ((x)<<0)
|
||||
#define RB_BLKSZ(x) ((x)<<8)
|
||||
#define RB_NO_UPDATE (1<<27)
|
||||
#define RB_RPTR_WR_ENA (1<<31)
|
||||
#define RB_BUFSZ(x) ((x) << 0)
|
||||
#define RB_BLKSZ(x) ((x) << 8)
|
||||
#define RB_NO_UPDATE (1 << 27)
|
||||
#define RB_RPTR_WR_ENA (1 << 31)
|
||||
#define BUF_SWAP_32BIT (2 << 16)
|
||||
#define CP_RB_RPTR 0x8700
|
||||
#define CP_RB_RPTR_ADDR 0xC10C
|
||||
#define RB_RPTR_SWAP(x) ((x) << 0)
|
||||
#define CP_RB_RPTR_ADDR_HI 0xC110
|
||||
#define CP_RB_RPTR_WR 0xC108
|
||||
#define CP_RB_WPTR 0xC114
|
||||
|
@ -88,7 +88,7 @@ static inline struct radeon_i2c_bus_rec radeon_lookup_i2c_gpio(struct radeon_dev
|
||||
/* some evergreen boards have bad data for this entry */
|
||||
if (ASIC_IS_DCE4(rdev)) {
|
||||
if ((i == 7) &&
|
||||
(gpio->usClkMaskRegisterIndex == 0x1936) &&
|
||||
(le16_to_cpu(gpio->usClkMaskRegisterIndex) == 0x1936) &&
|
||||
(gpio->sucI2cId.ucAccess == 0)) {
|
||||
gpio->sucI2cId.ucAccess = 0x97;
|
||||
gpio->ucDataMaskShift = 8;
|
||||
@ -101,7 +101,7 @@ static inline struct radeon_i2c_bus_rec radeon_lookup_i2c_gpio(struct radeon_dev
|
||||
/* some DCE3 boards have bad data for this entry */
|
||||
if (ASIC_IS_DCE3(rdev)) {
|
||||
if ((i == 4) &&
|
||||
(gpio->usClkMaskRegisterIndex == 0x1fda) &&
|
||||
(le16_to_cpu(gpio->usClkMaskRegisterIndex) == 0x1fda) &&
|
||||
(gpio->sucI2cId.ucAccess == 0x94))
|
||||
gpio->sucI2cId.ucAccess = 0x14;
|
||||
}
|
||||
@ -172,7 +172,7 @@ void radeon_atombios_i2c_init(struct radeon_device *rdev)
|
||||
/* some evergreen boards have bad data for this entry */
|
||||
if (ASIC_IS_DCE4(rdev)) {
|
||||
if ((i == 7) &&
|
||||
(gpio->usClkMaskRegisterIndex == 0x1936) &&
|
||||
(le16_to_cpu(gpio->usClkMaskRegisterIndex) == 0x1936) &&
|
||||
(gpio->sucI2cId.ucAccess == 0)) {
|
||||
gpio->sucI2cId.ucAccess = 0x97;
|
||||
gpio->ucDataMaskShift = 8;
|
||||
@ -185,7 +185,7 @@ void radeon_atombios_i2c_init(struct radeon_device *rdev)
|
||||
/* some DCE3 boards have bad data for this entry */
|
||||
if (ASIC_IS_DCE3(rdev)) {
|
||||
if ((i == 4) &&
|
||||
(gpio->usClkMaskRegisterIndex == 0x1fda) &&
|
||||
(le16_to_cpu(gpio->usClkMaskRegisterIndex) == 0x1fda) &&
|
||||
(gpio->sucI2cId.ucAccess == 0x94))
|
||||
gpio->sucI2cId.ucAccess = 0x14;
|
||||
}
|
||||
@ -252,7 +252,7 @@ static inline struct radeon_gpio_rec radeon_lookup_gpio(struct radeon_device *rd
|
||||
pin = &gpio_info->asGPIO_Pin[i];
|
||||
if (id == pin->ucGPIO_ID) {
|
||||
gpio.id = pin->ucGPIO_ID;
|
||||
gpio.reg = pin->usGpioPin_AIndex * 4;
|
||||
gpio.reg = le16_to_cpu(pin->usGpioPin_AIndex) * 4;
|
||||
gpio.mask = (1 << pin->ucGpioPinBitShift);
|
||||
gpio.valid = true;
|
||||
break;
|
||||
@ -1274,11 +1274,11 @@ bool radeon_atombios_sideport_present(struct radeon_device *rdev)
|
||||
data_offset);
|
||||
switch (crev) {
|
||||
case 1:
|
||||
if (igp_info->info.ulBootUpMemoryClock)
|
||||
if (le32_to_cpu(igp_info->info.ulBootUpMemoryClock))
|
||||
return true;
|
||||
break;
|
||||
case 2:
|
||||
if (igp_info->info_2.ulBootUpSidePortClock)
|
||||
if (le32_to_cpu(igp_info->info_2.ulBootUpSidePortClock))
|
||||
return true;
|
||||
break;
|
||||
default:
|
||||
@ -1442,7 +1442,7 @@ bool radeon_atombios_get_asic_ss_info(struct radeon_device *rdev,
|
||||
|
||||
for (i = 0; i < num_indices; i++) {
|
||||
if ((ss_info->info.asSpreadSpectrum[i].ucClockIndication == id) &&
|
||||
(clock <= ss_info->info.asSpreadSpectrum[i].ulTargetClockRange)) {
|
||||
(clock <= le32_to_cpu(ss_info->info.asSpreadSpectrum[i].ulTargetClockRange))) {
|
||||
ss->percentage =
|
||||
le16_to_cpu(ss_info->info.asSpreadSpectrum[i].usSpreadSpectrumPercentage);
|
||||
ss->type = ss_info->info.asSpreadSpectrum[i].ucSpreadSpectrumMode;
|
||||
@ -1456,7 +1456,7 @@ bool radeon_atombios_get_asic_ss_info(struct radeon_device *rdev,
|
||||
sizeof(ATOM_ASIC_SS_ASSIGNMENT_V2);
|
||||
for (i = 0; i < num_indices; i++) {
|
||||
if ((ss_info->info_2.asSpreadSpectrum[i].ucClockIndication == id) &&
|
||||
(clock <= ss_info->info_2.asSpreadSpectrum[i].ulTargetClockRange)) {
|
||||
(clock <= le32_to_cpu(ss_info->info_2.asSpreadSpectrum[i].ulTargetClockRange))) {
|
||||
ss->percentage =
|
||||
le16_to_cpu(ss_info->info_2.asSpreadSpectrum[i].usSpreadSpectrumPercentage);
|
||||
ss->type = ss_info->info_2.asSpreadSpectrum[i].ucSpreadSpectrumMode;
|
||||
@ -1470,7 +1470,7 @@ bool radeon_atombios_get_asic_ss_info(struct radeon_device *rdev,
|
||||
sizeof(ATOM_ASIC_SS_ASSIGNMENT_V3);
|
||||
for (i = 0; i < num_indices; i++) {
|
||||
if ((ss_info->info_3.asSpreadSpectrum[i].ucClockIndication == id) &&
|
||||
(clock <= ss_info->info_3.asSpreadSpectrum[i].ulTargetClockRange)) {
|
||||
(clock <= le32_to_cpu(ss_info->info_3.asSpreadSpectrum[i].ulTargetClockRange))) {
|
||||
ss->percentage =
|
||||
le16_to_cpu(ss_info->info_3.asSpreadSpectrum[i].usSpreadSpectrumPercentage);
|
||||
ss->type = ss_info->info_3.asSpreadSpectrum[i].ucSpreadSpectrumMode;
|
||||
@ -1553,8 +1553,8 @@ struct radeon_encoder_atom_dig *radeon_atombios_get_lvds_info(struct
|
||||
if (misc & ATOM_DOUBLE_CLOCK_MODE)
|
||||
lvds->native_mode.flags |= DRM_MODE_FLAG_DBLSCAN;
|
||||
|
||||
lvds->native_mode.width_mm = lvds_info->info.sLCDTiming.usImageHSize;
|
||||
lvds->native_mode.height_mm = lvds_info->info.sLCDTiming.usImageVSize;
|
||||
lvds->native_mode.width_mm = le16_to_cpu(lvds_info->info.sLCDTiming.usImageHSize);
|
||||
lvds->native_mode.height_mm = le16_to_cpu(lvds_info->info.sLCDTiming.usImageVSize);
|
||||
|
||||
/* set crtc values */
|
||||
drm_mode_set_crtcinfo(&lvds->native_mode, CRTC_INTERLACE_HALVE_V);
|
||||
@ -1569,13 +1569,13 @@ struct radeon_encoder_atom_dig *radeon_atombios_get_lvds_info(struct
|
||||
lvds->linkb = false;
|
||||
|
||||
/* parse the lcd record table */
|
||||
if (lvds_info->info.usModePatchTableOffset) {
|
||||
if (le16_to_cpu(lvds_info->info.usModePatchTableOffset)) {
|
||||
ATOM_FAKE_EDID_PATCH_RECORD *fake_edid_record;
|
||||
ATOM_PANEL_RESOLUTION_PATCH_RECORD *panel_res_record;
|
||||
bool bad_record = false;
|
||||
u8 *record = (u8 *)(mode_info->atom_context->bios +
|
||||
data_offset +
|
||||
lvds_info->info.usModePatchTableOffset);
|
||||
le16_to_cpu(lvds_info->info.usModePatchTableOffset));
|
||||
while (*record != ATOM_RECORD_END_TYPE) {
|
||||
switch (*record) {
|
||||
case LCD_MODE_PATCH_RECORD_MODE_TYPE:
|
||||
@ -2189,7 +2189,7 @@ static u16 radeon_atombios_get_default_vddc(struct radeon_device *rdev)
|
||||
firmware_info =
|
||||
(union firmware_info *)(mode_info->atom_context->bios +
|
||||
data_offset);
|
||||
vddc = firmware_info->info_14.usBootUpVDDCVoltage;
|
||||
vddc = le16_to_cpu(firmware_info->info_14.usBootUpVDDCVoltage);
|
||||
}
|
||||
|
||||
return vddc;
|
||||
@ -2284,7 +2284,7 @@ static bool radeon_atombios_parse_pplib_clock_info(struct radeon_device *rdev,
|
||||
rdev->pm.power_state[state_index].clock_info[mode_index].voltage.type =
|
||||
VOLTAGE_SW;
|
||||
rdev->pm.power_state[state_index].clock_info[mode_index].voltage.voltage =
|
||||
clock_info->evergreen.usVDDC;
|
||||
le16_to_cpu(clock_info->evergreen.usVDDC);
|
||||
} else {
|
||||
sclk = le16_to_cpu(clock_info->r600.usEngineClockLow);
|
||||
sclk |= clock_info->r600.ucEngineClockHigh << 16;
|
||||
@ -2295,7 +2295,7 @@ static bool radeon_atombios_parse_pplib_clock_info(struct radeon_device *rdev,
|
||||
rdev->pm.power_state[state_index].clock_info[mode_index].voltage.type =
|
||||
VOLTAGE_SW;
|
||||
rdev->pm.power_state[state_index].clock_info[mode_index].voltage.voltage =
|
||||
clock_info->r600.usVDDC;
|
||||
le16_to_cpu(clock_info->r600.usVDDC);
|
||||
}
|
||||
|
||||
if (rdev->flags & RADEON_IS_IGP) {
|
||||
@ -2408,13 +2408,13 @@ static int radeon_atombios_parse_power_table_6(struct radeon_device *rdev)
|
||||
radeon_atombios_add_pplib_thermal_controller(rdev, &power_info->pplib.sThermalController);
|
||||
state_array = (struct StateArray *)
|
||||
(mode_info->atom_context->bios + data_offset +
|
||||
power_info->pplib.usStateArrayOffset);
|
||||
le16_to_cpu(power_info->pplib.usStateArrayOffset));
|
||||
clock_info_array = (struct ClockInfoArray *)
|
||||
(mode_info->atom_context->bios + data_offset +
|
||||
power_info->pplib.usClockInfoArrayOffset);
|
||||
le16_to_cpu(power_info->pplib.usClockInfoArrayOffset));
|
||||
non_clock_info_array = (struct NonClockInfoArray *)
|
||||
(mode_info->atom_context->bios + data_offset +
|
||||
power_info->pplib.usNonClockInfoArrayOffset);
|
||||
le16_to_cpu(power_info->pplib.usNonClockInfoArrayOffset));
|
||||
rdev->pm.power_state = kzalloc(sizeof(struct radeon_power_state) *
|
||||
state_array->ucNumEntries, GFP_KERNEL);
|
||||
if (!rdev->pm.power_state)
|
||||
@ -2533,7 +2533,7 @@ uint32_t radeon_atom_get_engine_clock(struct radeon_device *rdev)
|
||||
int index = GetIndexIntoMasterTable(COMMAND, GetEngineClock);
|
||||
|
||||
atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
|
||||
return args.ulReturnEngineClock;
|
||||
return le32_to_cpu(args.ulReturnEngineClock);
|
||||
}
|
||||
|
||||
uint32_t radeon_atom_get_memory_clock(struct radeon_device *rdev)
|
||||
@ -2542,7 +2542,7 @@ uint32_t radeon_atom_get_memory_clock(struct radeon_device *rdev)
|
||||
int index = GetIndexIntoMasterTable(COMMAND, GetMemoryClock);
|
||||
|
||||
atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
|
||||
return args.ulReturnMemoryClock;
|
||||
return le32_to_cpu(args.ulReturnMemoryClock);
|
||||
}
|
||||
|
||||
void radeon_atom_set_engine_clock(struct radeon_device *rdev,
|
||||
@ -2551,7 +2551,7 @@ void radeon_atom_set_engine_clock(struct radeon_device *rdev,
|
||||
SET_ENGINE_CLOCK_PS_ALLOCATION args;
|
||||
int index = GetIndexIntoMasterTable(COMMAND, SetEngineClock);
|
||||
|
||||
args.ulTargetEngineClock = eng_clock; /* 10 khz */
|
||||
args.ulTargetEngineClock = cpu_to_le32(eng_clock); /* 10 khz */
|
||||
|
||||
atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
|
||||
}
|
||||
@ -2565,7 +2565,7 @@ void radeon_atom_set_memory_clock(struct radeon_device *rdev,
|
||||
if (rdev->flags & RADEON_IS_IGP)
|
||||
return;
|
||||
|
||||
args.ulTargetMemoryClock = mem_clock; /* 10 khz */
|
||||
args.ulTargetMemoryClock = cpu_to_le32(mem_clock); /* 10 khz */
|
||||
|
||||
atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
|
||||
}
|
||||
|
@ -1504,6 +1504,11 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
|
||||
(rdev->pdev->subsystem_device == 0x4a48)) {
|
||||
/* Mac X800 */
|
||||
rdev->mode_info.connector_table = CT_MAC_X800;
|
||||
} else if ((rdev->pdev->device == 0x4150) &&
|
||||
(rdev->pdev->subsystem_vendor == 0x1002) &&
|
||||
(rdev->pdev->subsystem_device == 0x4150)) {
|
||||
/* Mac G5 9600 */
|
||||
rdev->mode_info.connector_table = CT_MAC_G5_9600;
|
||||
} else
|
||||
#endif /* CONFIG_PPC_PMAC */
|
||||
#ifdef CONFIG_PPC64
|
||||
@ -2022,6 +2027,48 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
|
||||
CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_I,
|
||||
&hpd);
|
||||
break;
|
||||
case CT_MAC_G5_9600:
|
||||
DRM_INFO("Connector Table: %d (mac g5 9600)\n",
|
||||
rdev->mode_info.connector_table);
|
||||
/* DVI - tv dac, dvo */
|
||||
ddc_i2c = combios_setup_i2c_bus(rdev, DDC_DVI, 0, 0);
|
||||
hpd.hpd = RADEON_HPD_1; /* ??? */
|
||||
radeon_add_legacy_encoder(dev,
|
||||
radeon_get_encoder_enum(dev,
|
||||
ATOM_DEVICE_DFP2_SUPPORT,
|
||||
0),
|
||||
ATOM_DEVICE_DFP2_SUPPORT);
|
||||
radeon_add_legacy_encoder(dev,
|
||||
radeon_get_encoder_enum(dev,
|
||||
ATOM_DEVICE_CRT2_SUPPORT,
|
||||
2),
|
||||
ATOM_DEVICE_CRT2_SUPPORT);
|
||||
radeon_add_legacy_connector(dev, 0,
|
||||
ATOM_DEVICE_DFP2_SUPPORT |
|
||||
ATOM_DEVICE_CRT2_SUPPORT,
|
||||
DRM_MODE_CONNECTOR_DVII, &ddc_i2c,
|
||||
CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I,
|
||||
&hpd);
|
||||
/* ADC - primary dac, internal tmds */
|
||||
ddc_i2c = combios_setup_i2c_bus(rdev, DDC_VGA, 0, 0);
|
||||
hpd.hpd = RADEON_HPD_2; /* ??? */
|
||||
radeon_add_legacy_encoder(dev,
|
||||
radeon_get_encoder_enum(dev,
|
||||
ATOM_DEVICE_DFP1_SUPPORT,
|
||||
0),
|
||||
ATOM_DEVICE_DFP1_SUPPORT);
|
||||
radeon_add_legacy_encoder(dev,
|
||||
radeon_get_encoder_enum(dev,
|
||||
ATOM_DEVICE_CRT1_SUPPORT,
|
||||
1),
|
||||
ATOM_DEVICE_CRT1_SUPPORT);
|
||||
radeon_add_legacy_connector(dev, 1,
|
||||
ATOM_DEVICE_DFP1_SUPPORT |
|
||||
ATOM_DEVICE_CRT1_SUPPORT,
|
||||
DRM_MODE_CONNECTOR_DVII, &ddc_i2c,
|
||||
CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I,
|
||||
&hpd);
|
||||
break;
|
||||
default:
|
||||
DRM_INFO("Connector table: %d (invalid)\n",
|
||||
rdev->mode_info.connector_table);
|
||||
|
@ -936,8 +936,11 @@ int radeon_resume_kms(struct drm_device *dev)
|
||||
int radeon_gpu_reset(struct radeon_device *rdev)
|
||||
{
|
||||
int r;
|
||||
int resched;
|
||||
|
||||
radeon_save_bios_scratch_regs(rdev);
|
||||
/* block TTM */
|
||||
resched = ttm_bo_lock_delayed_workqueue(&rdev->mman.bdev);
|
||||
radeon_suspend(rdev);
|
||||
|
||||
r = radeon_asic_reset(rdev);
|
||||
@ -946,6 +949,7 @@ int radeon_gpu_reset(struct radeon_device *rdev)
|
||||
radeon_resume(rdev);
|
||||
radeon_restore_bios_scratch_regs(rdev);
|
||||
drm_helper_resume_force_mode(rdev->ddev);
|
||||
ttm_bo_unlock_delayed_workqueue(&rdev->mman.bdev, resched);
|
||||
return 0;
|
||||
}
|
||||
/* bad news, how to tell it to userspace ? */
|
||||
|
@ -793,6 +793,11 @@ static void avivo_get_fb_div(struct radeon_pll *pll,
|
||||
tmp *= target_clock;
|
||||
*fb_div = tmp / pll->reference_freq;
|
||||
*frac_fb_div = tmp % pll->reference_freq;
|
||||
|
||||
if (*fb_div > pll->max_feedback_div)
|
||||
*fb_div = pll->max_feedback_div;
|
||||
else if (*fb_div < pll->min_feedback_div)
|
||||
*fb_div = pll->min_feedback_div;
|
||||
}
|
||||
|
||||
static u32 avivo_get_post_div(struct radeon_pll *pll,
|
||||
@ -826,6 +831,11 @@ static u32 avivo_get_post_div(struct radeon_pll *pll,
|
||||
post_div--;
|
||||
}
|
||||
|
||||
if (post_div > pll->max_post_div)
|
||||
post_div = pll->max_post_div;
|
||||
else if (post_div < pll->min_post_div)
|
||||
post_div = pll->min_post_div;
|
||||
|
||||
return post_div;
|
||||
}
|
||||
|
||||
|
@ -1524,6 +1524,7 @@ extern u32 radeon_get_scratch(drm_radeon_private_t *dev_priv, int index);
|
||||
#define R600_CP_RB_CNTL 0xc104
|
||||
# define R600_RB_BUFSZ(x) ((x) << 0)
|
||||
# define R600_RB_BLKSZ(x) ((x) << 8)
|
||||
# define R600_BUF_SWAP_32BIT (2 << 16)
|
||||
# define R600_RB_NO_UPDATE (1 << 27)
|
||||
# define R600_RB_RPTR_WR_ENA (1 << 31)
|
||||
#define R600_CP_RB_RPTR_WR 0xc108
|
||||
|
@ -910,7 +910,7 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t
|
||||
|
||||
args.v1.ucAction = action;
|
||||
if (action == ATOM_TRANSMITTER_ACTION_INIT) {
|
||||
args.v1.usInitInfo = connector_object_id;
|
||||
args.v1.usInitInfo = cpu_to_le16(connector_object_id);
|
||||
} else if (action == ATOM_TRANSMITTER_ACTION_SETUP_VSEMPH) {
|
||||
args.v1.asMode.ucLaneSel = lane_num;
|
||||
args.v1.asMode.ucLaneSet = lane_set;
|
||||
@ -1140,7 +1140,7 @@ atombios_external_encoder_setup(struct drm_encoder *encoder,
|
||||
case 3:
|
||||
args.v3.sExtEncoder.ucAction = action;
|
||||
if (action == EXTERNAL_ENCODER_ACTION_V3_ENCODER_INIT)
|
||||
args.v3.sExtEncoder.usConnectorId = connector_object_id;
|
||||
args.v3.sExtEncoder.usConnectorId = cpu_to_le16(connector_object_id);
|
||||
else
|
||||
args.v3.sExtEncoder.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10);
|
||||
args.v3.sExtEncoder.ucEncoderMode = atombios_get_encoder_mode(encoder);
|
||||
@ -1570,11 +1570,21 @@ atombios_apply_encoder_quirks(struct drm_encoder *encoder,
|
||||
}
|
||||
|
||||
/* set scaler clears this on some chips */
|
||||
/* XXX check DCE4 */
|
||||
if (!(radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT))) {
|
||||
if (ASIC_IS_AVIVO(rdev) && (mode->flags & DRM_MODE_FLAG_INTERLACE))
|
||||
WREG32(AVIVO_D1MODE_DATA_FORMAT + radeon_crtc->crtc_offset,
|
||||
AVIVO_D1MODE_INTERLEAVE_EN);
|
||||
if (ASIC_IS_AVIVO(rdev) &&
|
||||
(!(radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT)))) {
|
||||
if (ASIC_IS_DCE4(rdev)) {
|
||||
if (mode->flags & DRM_MODE_FLAG_INTERLACE)
|
||||
WREG32(EVERGREEN_DATA_FORMAT + radeon_crtc->crtc_offset,
|
||||
EVERGREEN_INTERLEAVE_EN);
|
||||
else
|
||||
WREG32(EVERGREEN_DATA_FORMAT + radeon_crtc->crtc_offset, 0);
|
||||
} else {
|
||||
if (mode->flags & DRM_MODE_FLAG_INTERLACE)
|
||||
WREG32(AVIVO_D1MODE_DATA_FORMAT + radeon_crtc->crtc_offset,
|
||||
AVIVO_D1MODE_INTERLEAVE_EN);
|
||||
else
|
||||
WREG32(AVIVO_D1MODE_DATA_FORMAT + radeon_crtc->crtc_offset, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -209,6 +209,7 @@ enum radeon_connector_table {
|
||||
CT_EMAC,
|
||||
CT_RN50_POWER,
|
||||
CT_MAC_X800,
|
||||
CT_MAC_G5_9600,
|
||||
};
|
||||
|
||||
enum radeon_dvo_chip {
|
||||
|
@ -787,9 +787,9 @@ static int radeon_ttm_debugfs_init(struct radeon_device *rdev)
|
||||
radeon_mem_types_list[i].show = &radeon_mm_dump_table;
|
||||
radeon_mem_types_list[i].driver_features = 0;
|
||||
if (i == 0)
|
||||
radeon_mem_types_list[i].data = &rdev->mman.bdev.man[TTM_PL_VRAM].priv;
|
||||
radeon_mem_types_list[i].data = rdev->mman.bdev.man[TTM_PL_VRAM].priv;
|
||||
else
|
||||
radeon_mem_types_list[i].data = &rdev->mman.bdev.man[TTM_PL_TT].priv;
|
||||
radeon_mem_types_list[i].data = rdev->mman.bdev.man[TTM_PL_TT].priv;
|
||||
|
||||
}
|
||||
/* Add ttm page pool to debugfs */
|
||||
|
@ -683,9 +683,7 @@ r300 0x4f60
|
||||
0x4DF4 US_ALU_CONST_G_31
|
||||
0x4DF8 US_ALU_CONST_B_31
|
||||
0x4DFC US_ALU_CONST_A_31
|
||||
0x4E04 RB3D_BLENDCNTL_R3
|
||||
0x4E08 RB3D_ABLENDCNTL_R3
|
||||
0x4E0C RB3D_COLOR_CHANNEL_MASK
|
||||
0x4E10 RB3D_CONSTANT_COLOR
|
||||
0x4E14 RB3D_COLOR_CLEAR_VALUE
|
||||
0x4E18 RB3D_ROPCNTL_R3
|
||||
@ -706,13 +704,11 @@ r300 0x4f60
|
||||
0x4E74 RB3D_CMASK_WRINDEX
|
||||
0x4E78 RB3D_CMASK_DWORD
|
||||
0x4E7C RB3D_CMASK_RDINDEX
|
||||
0x4E80 RB3D_AARESOLVE_OFFSET
|
||||
0x4E84 RB3D_AARESOLVE_PITCH
|
||||
0x4E88 RB3D_AARESOLVE_CTL
|
||||
0x4EA0 RB3D_DISCARD_SRC_PIXEL_LTE_THRESHOLD
|
||||
0x4EA4 RB3D_DISCARD_SRC_PIXEL_GTE_THRESHOLD
|
||||
0x4F04 ZB_ZSTENCILCNTL
|
||||
0x4F08 ZB_STENCILREFMASK
|
||||
0x4F14 ZB_ZTOP
|
||||
0x4F18 ZB_ZCACHE_CTLSTAT
|
||||
0x4F28 ZB_DEPTHCLEARVALUE
|
||||
0x4F58 ZB_ZPASS_DATA
|
||||
|
@ -130,7 +130,6 @@ r420 0x4f60
|
||||
0x401C GB_SELECT
|
||||
0x4020 GB_AA_CONFIG
|
||||
0x4024 GB_FIFO_SIZE
|
||||
0x4028 GB_Z_PEQ_CONFIG
|
||||
0x4100 TX_INVALTAGS
|
||||
0x4200 GA_POINT_S0
|
||||
0x4204 GA_POINT_T0
|
||||
@ -750,9 +749,7 @@ r420 0x4f60
|
||||
0x4DF4 US_ALU_CONST_G_31
|
||||
0x4DF8 US_ALU_CONST_B_31
|
||||
0x4DFC US_ALU_CONST_A_31
|
||||
0x4E04 RB3D_BLENDCNTL_R3
|
||||
0x4E08 RB3D_ABLENDCNTL_R3
|
||||
0x4E0C RB3D_COLOR_CHANNEL_MASK
|
||||
0x4E10 RB3D_CONSTANT_COLOR
|
||||
0x4E14 RB3D_COLOR_CLEAR_VALUE
|
||||
0x4E18 RB3D_ROPCNTL_R3
|
||||
@ -773,13 +770,11 @@ r420 0x4f60
|
||||
0x4E74 RB3D_CMASK_WRINDEX
|
||||
0x4E78 RB3D_CMASK_DWORD
|
||||
0x4E7C RB3D_CMASK_RDINDEX
|
||||
0x4E80 RB3D_AARESOLVE_OFFSET
|
||||
0x4E84 RB3D_AARESOLVE_PITCH
|
||||
0x4E88 RB3D_AARESOLVE_CTL
|
||||
0x4EA0 RB3D_DISCARD_SRC_PIXEL_LTE_THRESHOLD
|
||||
0x4EA4 RB3D_DISCARD_SRC_PIXEL_GTE_THRESHOLD
|
||||
0x4F04 ZB_ZSTENCILCNTL
|
||||
0x4F08 ZB_STENCILREFMASK
|
||||
0x4F14 ZB_ZTOP
|
||||
0x4F18 ZB_ZCACHE_CTLSTAT
|
||||
0x4F28 ZB_DEPTHCLEARVALUE
|
||||
0x4F58 ZB_ZPASS_DATA
|
||||
|
@ -749,9 +749,7 @@ rs600 0x6d40
|
||||
0x4DF4 US_ALU_CONST_G_31
|
||||
0x4DF8 US_ALU_CONST_B_31
|
||||
0x4DFC US_ALU_CONST_A_31
|
||||
0x4E04 RB3D_BLENDCNTL_R3
|
||||
0x4E08 RB3D_ABLENDCNTL_R3
|
||||
0x4E0C RB3D_COLOR_CHANNEL_MASK
|
||||
0x4E10 RB3D_CONSTANT_COLOR
|
||||
0x4E14 RB3D_COLOR_CLEAR_VALUE
|
||||
0x4E18 RB3D_ROPCNTL_R3
|
||||
@ -772,13 +770,11 @@ rs600 0x6d40
|
||||
0x4E74 RB3D_CMASK_WRINDEX
|
||||
0x4E78 RB3D_CMASK_DWORD
|
||||
0x4E7C RB3D_CMASK_RDINDEX
|
||||
0x4E80 RB3D_AARESOLVE_OFFSET
|
||||
0x4E84 RB3D_AARESOLVE_PITCH
|
||||
0x4E88 RB3D_AARESOLVE_CTL
|
||||
0x4EA0 RB3D_DISCARD_SRC_PIXEL_LTE_THRESHOLD
|
||||
0x4EA4 RB3D_DISCARD_SRC_PIXEL_GTE_THRESHOLD
|
||||
0x4F04 ZB_ZSTENCILCNTL
|
||||
0x4F08 ZB_STENCILREFMASK
|
||||
0x4F14 ZB_ZTOP
|
||||
0x4F18 ZB_ZCACHE_CTLSTAT
|
||||
0x4F28 ZB_DEPTHCLEARVALUE
|
||||
0x4F58 ZB_ZPASS_DATA
|
||||
|
@ -164,7 +164,6 @@ rv515 0x6d40
|
||||
0x401C GB_SELECT
|
||||
0x4020 GB_AA_CONFIG
|
||||
0x4024 GB_FIFO_SIZE
|
||||
0x4028 GB_Z_PEQ_CONFIG
|
||||
0x4100 TX_INVALTAGS
|
||||
0x4114 SU_TEX_WRAP_PS3
|
||||
0x4118 PS3_ENABLE
|
||||
@ -461,9 +460,7 @@ rv515 0x6d40
|
||||
0x4DF4 US_ALU_CONST_G_31
|
||||
0x4DF8 US_ALU_CONST_B_31
|
||||
0x4DFC US_ALU_CONST_A_31
|
||||
0x4E04 RB3D_BLENDCNTL_R3
|
||||
0x4E08 RB3D_ABLENDCNTL_R3
|
||||
0x4E0C RB3D_COLOR_CHANNEL_MASK
|
||||
0x4E10 RB3D_CONSTANT_COLOR
|
||||
0x4E14 RB3D_COLOR_CLEAR_VALUE
|
||||
0x4E18 RB3D_ROPCNTL_R3
|
||||
@ -484,9 +481,6 @@ rv515 0x6d40
|
||||
0x4E74 RB3D_CMASK_WRINDEX
|
||||
0x4E78 RB3D_CMASK_DWORD
|
||||
0x4E7C RB3D_CMASK_RDINDEX
|
||||
0x4E80 RB3D_AARESOLVE_OFFSET
|
||||
0x4E84 RB3D_AARESOLVE_PITCH
|
||||
0x4E88 RB3D_AARESOLVE_CTL
|
||||
0x4EA0 RB3D_DISCARD_SRC_PIXEL_LTE_THRESHOLD
|
||||
0x4EA4 RB3D_DISCARD_SRC_PIXEL_GTE_THRESHOLD
|
||||
0x4EF8 RB3D_CONSTANT_COLOR_AR
|
||||
@ -496,4 +490,5 @@ rv515 0x6d40
|
||||
0x4F14 ZB_ZTOP
|
||||
0x4F18 ZB_ZCACHE_CTLSTAT
|
||||
0x4F58 ZB_ZPASS_DATA
|
||||
0x4F28 ZB_DEPTHCLEARVALUE
|
||||
0x4FD4 ZB_STENCILREFMASK_BF
|
||||
|
@ -77,9 +77,9 @@ void rs690_pm_info(struct radeon_device *rdev)
|
||||
switch (crev) {
|
||||
case 1:
|
||||
tmp.full = dfixed_const(100);
|
||||
rdev->pm.igp_sideport_mclk.full = dfixed_const(info->info.ulBootUpMemoryClock);
|
||||
rdev->pm.igp_sideport_mclk.full = dfixed_const(le32_to_cpu(info->info.ulBootUpMemoryClock));
|
||||
rdev->pm.igp_sideport_mclk.full = dfixed_div(rdev->pm.igp_sideport_mclk, tmp);
|
||||
if (info->info.usK8MemoryClock)
|
||||
if (le16_to_cpu(info->info.usK8MemoryClock))
|
||||
rdev->pm.igp_system_mclk.full = dfixed_const(le16_to_cpu(info->info.usK8MemoryClock));
|
||||
else if (rdev->clock.default_mclk) {
|
||||
rdev->pm.igp_system_mclk.full = dfixed_const(rdev->clock.default_mclk);
|
||||
@ -91,16 +91,16 @@ void rs690_pm_info(struct radeon_device *rdev)
|
||||
break;
|
||||
case 2:
|
||||
tmp.full = dfixed_const(100);
|
||||
rdev->pm.igp_sideport_mclk.full = dfixed_const(info->info_v2.ulBootUpSidePortClock);
|
||||
rdev->pm.igp_sideport_mclk.full = dfixed_const(le32_to_cpu(info->info_v2.ulBootUpSidePortClock));
|
||||
rdev->pm.igp_sideport_mclk.full = dfixed_div(rdev->pm.igp_sideport_mclk, tmp);
|
||||
if (info->info_v2.ulBootUpUMAClock)
|
||||
rdev->pm.igp_system_mclk.full = dfixed_const(info->info_v2.ulBootUpUMAClock);
|
||||
if (le32_to_cpu(info->info_v2.ulBootUpUMAClock))
|
||||
rdev->pm.igp_system_mclk.full = dfixed_const(le32_to_cpu(info->info_v2.ulBootUpUMAClock));
|
||||
else if (rdev->clock.default_mclk)
|
||||
rdev->pm.igp_system_mclk.full = dfixed_const(rdev->clock.default_mclk);
|
||||
else
|
||||
rdev->pm.igp_system_mclk.full = dfixed_const(66700);
|
||||
rdev->pm.igp_system_mclk.full = dfixed_div(rdev->pm.igp_system_mclk, tmp);
|
||||
rdev->pm.igp_ht_link_clk.full = dfixed_const(info->info_v2.ulHTLinkFreq);
|
||||
rdev->pm.igp_ht_link_clk.full = dfixed_const(le32_to_cpu(info->info_v2.ulHTLinkFreq));
|
||||
rdev->pm.igp_ht_link_clk.full = dfixed_div(rdev->pm.igp_ht_link_clk, tmp);
|
||||
rdev->pm.igp_ht_link_width.full = dfixed_const(le16_to_cpu(info->info_v2.usMinHTLinkWidth));
|
||||
break;
|
||||
|
@ -321,7 +321,11 @@ static int rv770_cp_load_microcode(struct radeon_device *rdev)
|
||||
return -EINVAL;
|
||||
|
||||
r700_cp_stop(rdev);
|
||||
WREG32(CP_RB_CNTL, RB_NO_UPDATE | (15 << 8) | (3 << 0));
|
||||
WREG32(CP_RB_CNTL,
|
||||
#ifdef __BIG_ENDIAN
|
||||
BUF_SWAP_32BIT |
|
||||
#endif
|
||||
RB_NO_UPDATE | RB_BLKSZ(15) | RB_BUFSZ(3));
|
||||
|
||||
/* Reset cp */
|
||||
WREG32(GRBM_SOFT_RESET, SOFT_RESET_CP);
|
||||
|
@ -76,10 +76,10 @@
|
||||
#define ROQ_IB1_START(x) ((x) << 0)
|
||||
#define ROQ_IB2_START(x) ((x) << 8)
|
||||
#define CP_RB_CNTL 0xC104
|
||||
#define RB_BUFSZ(x) ((x)<<0)
|
||||
#define RB_BLKSZ(x) ((x)<<8)
|
||||
#define RB_NO_UPDATE (1<<27)
|
||||
#define RB_RPTR_WR_ENA (1<<31)
|
||||
#define RB_BUFSZ(x) ((x) << 0)
|
||||
#define RB_BLKSZ(x) ((x) << 8)
|
||||
#define RB_NO_UPDATE (1 << 27)
|
||||
#define RB_RPTR_WR_ENA (1 << 31)
|
||||
#define BUF_SWAP_32BIT (2 << 16)
|
||||
#define CP_RB_RPTR 0x8700
|
||||
#define CP_RB_RPTR_ADDR 0xC10C
|
||||
|
Loading…
x
Reference in New Issue
Block a user