mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 10:41:38 -04:00
Merge branch 'drm-radeon-next' of ../drm-radeon-next into drm-core-next
* 'drm-radeon-next' of ../drm-radeon-next: (333 commits) drm/radeon/kms: trivial code style fixes for audio drm/radeon: remove viewport transform from r6xx/r7xx blit emit drm/radeon: group r6xx/r7xx newly sequential blit state drm/radeon: reorder r6xx/r7xx blit state emit to make more regs sequential drm/radeon: r6xx/r7xx move vport clipping to a single packet drm/radeon: group r6xx/r7xx sequential blit state drm/radeon: remove duplicate state emit in r6xx/r7xx blit drm/radeon: add comments to r6xx/r7xx blit state drm/radeon/kms/r7xx: add workaround for hw issue with HDP flush drm/radeon/kms: remove rs4xx gart limit drm: radeon: fix sign bug drm/radeon/kms: check/restore sanity before doing anything else with GPU. drm/radeon: fall back to GTT if bo creation/validation in VRAM fails. drm/radeon/kms: add ioport register access drm/radeon/kms: enable HDMI audio on RS600/RS690/RS740 drm/radeon/kms: track audio engine state, do not use not setup timer drm/radeon/kms/r6xx+: add query for tile config (v2) drm/radeon/kms: fix CS alignment checking for tiling (v2) drm/radeon/kms: add tiling support to the cs checker for r6xx/r7xx drm/radeon/kms: Add crtc tiling setup support for evergreen ...
This commit is contained in:
commit
7827627107
620 changed files with 7287 additions and 199104 deletions
|
|
@ -61,6 +61,7 @@ config DRM_RADEON
|
|||
select DRM_KMS_HELPER
|
||||
select DRM_TTM
|
||||
select POWER_SUPPLY
|
||||
select HWMON
|
||||
help
|
||||
Choose this option if you have an ATI Radeon graphics card. There
|
||||
are both PCI and AGP versions. You don't need to choose this to
|
||||
|
|
|
|||
|
|
@ -2241,6 +2241,7 @@ i915_gem_object_get_pages(struct drm_gem_object *obj,
|
|||
page = read_cache_page_gfp(mapping, i,
|
||||
GFP_HIGHUSER |
|
||||
__GFP_COLD |
|
||||
__GFP_RECLAIMABLE |
|
||||
gfpmask);
|
||||
if (IS_ERR(page))
|
||||
goto err_pages;
|
||||
|
|
@ -4739,6 +4740,16 @@ i915_gem_load(struct drm_device *dev)
|
|||
list_add(&dev_priv->mm.shrink_list, &shrink_list);
|
||||
spin_unlock(&shrink_list_lock);
|
||||
|
||||
/* On GEN3 we really need to make sure the ARB C3 LP bit is set */
|
||||
if (IS_GEN3(dev)) {
|
||||
u32 tmp = I915_READ(MI_ARB_STATE);
|
||||
if (!(tmp & MI_ARB_C3_LP_WRITE_ENABLE)) {
|
||||
/* arb state is a masked write, so set bit + bit in mask */
|
||||
tmp = MI_ARB_C3_LP_WRITE_ENABLE | (MI_ARB_C3_LP_WRITE_ENABLE << MI_ARB_MASK_SHIFT);
|
||||
I915_WRITE(MI_ARB_STATE, tmp);
|
||||
}
|
||||
}
|
||||
|
||||
/* Old X drivers will take 0-2 for front, back, depth buffers */
|
||||
if (!drm_core_check_feature(dev, DRIVER_MODESET))
|
||||
dev_priv->fence_reg_start = 3;
|
||||
|
|
@ -4975,7 +4986,7 @@ i915_gpu_is_active(struct drm_device *dev)
|
|||
}
|
||||
|
||||
static int
|
||||
i915_gem_shrink(int nr_to_scan, gfp_t gfp_mask)
|
||||
i915_gem_shrink(struct shrinker *shrink, int nr_to_scan, gfp_t gfp_mask)
|
||||
{
|
||||
drm_i915_private_t *dev_priv, *next_dev;
|
||||
struct drm_i915_gem_object *obj_priv, *next_obj;
|
||||
|
|
|
|||
|
|
@ -359,6 +359,70 @@
|
|||
#define LM_BURST_LENGTH 0x00000700
|
||||
#define LM_FIFO_WATERMARK 0x0000001F
|
||||
#define MI_ARB_STATE 0x020e4 /* 915+ only */
|
||||
#define MI_ARB_MASK_SHIFT 16 /* shift for enable bits */
|
||||
|
||||
/* Make render/texture TLB fetches lower priorty than associated data
|
||||
* fetches. This is not turned on by default
|
||||
*/
|
||||
#define MI_ARB_RENDER_TLB_LOW_PRIORITY (1 << 15)
|
||||
|
||||
/* Isoch request wait on GTT enable (Display A/B/C streams).
|
||||
* Make isoch requests stall on the TLB update. May cause
|
||||
* display underruns (test mode only)
|
||||
*/
|
||||
#define MI_ARB_ISOCH_WAIT_GTT (1 << 14)
|
||||
|
||||
/* Block grant count for isoch requests when block count is
|
||||
* set to a finite value.
|
||||
*/
|
||||
#define MI_ARB_BLOCK_GRANT_MASK (3 << 12)
|
||||
#define MI_ARB_BLOCK_GRANT_8 (0 << 12) /* for 3 display planes */
|
||||
#define MI_ARB_BLOCK_GRANT_4 (1 << 12) /* for 2 display planes */
|
||||
#define MI_ARB_BLOCK_GRANT_2 (2 << 12) /* for 1 display plane */
|
||||
#define MI_ARB_BLOCK_GRANT_0 (3 << 12) /* don't use */
|
||||
|
||||
/* Enable render writes to complete in C2/C3/C4 power states.
|
||||
* If this isn't enabled, render writes are prevented in low
|
||||
* power states. That seems bad to me.
|
||||
*/
|
||||
#define MI_ARB_C3_LP_WRITE_ENABLE (1 << 11)
|
||||
|
||||
/* This acknowledges an async flip immediately instead
|
||||
* of waiting for 2TLB fetches.
|
||||
*/
|
||||
#define MI_ARB_ASYNC_FLIP_ACK_IMMEDIATE (1 << 10)
|
||||
|
||||
/* Enables non-sequential data reads through arbiter
|
||||
*/
|
||||
#define MI_ARB_DUAL_DATA_PHASE_DISABLE (1 << 9)
|
||||
|
||||
/* Disable FSB snooping of cacheable write cycles from binner/render
|
||||
* command stream
|
||||
*/
|
||||
#define MI_ARB_CACHE_SNOOP_DISABLE (1 << 8)
|
||||
|
||||
/* Arbiter time slice for non-isoch streams */
|
||||
#define MI_ARB_TIME_SLICE_MASK (7 << 5)
|
||||
#define MI_ARB_TIME_SLICE_1 (0 << 5)
|
||||
#define MI_ARB_TIME_SLICE_2 (1 << 5)
|
||||
#define MI_ARB_TIME_SLICE_4 (2 << 5)
|
||||
#define MI_ARB_TIME_SLICE_6 (3 << 5)
|
||||
#define MI_ARB_TIME_SLICE_8 (4 << 5)
|
||||
#define MI_ARB_TIME_SLICE_10 (5 << 5)
|
||||
#define MI_ARB_TIME_SLICE_14 (6 << 5)
|
||||
#define MI_ARB_TIME_SLICE_16 (7 << 5)
|
||||
|
||||
/* Low priority grace period page size */
|
||||
#define MI_ARB_LOW_PRIORITY_GRACE_4KB (0 << 4) /* default */
|
||||
#define MI_ARB_LOW_PRIORITY_GRACE_8KB (1 << 4)
|
||||
|
||||
/* Disable display A/B trickle feed */
|
||||
#define MI_ARB_DISPLAY_TRICKLE_FEED_DISABLE (1 << 2)
|
||||
|
||||
/* Set display plane priority */
|
||||
#define MI_ARB_DISPLAY_PRIORITY_A_B (0 << 0) /* display A > display B */
|
||||
#define MI_ARB_DISPLAY_PRIORITY_B_A (1 << 0) /* display B > display A */
|
||||
|
||||
#define CACHE_MODE_0 0x02120 /* 915+ only */
|
||||
#define CM0_MASK_SHIFT 16
|
||||
#define CM0_IZ_OPT_DISABLE (1<<6)
|
||||
|
|
|
|||
|
|
@ -203,36 +203,26 @@ struct methods {
|
|||
const bool rw;
|
||||
};
|
||||
|
||||
static struct methods nv04_methods[] = {
|
||||
{ "PROM", load_vbios_prom, false },
|
||||
static struct methods shadow_methods[] = {
|
||||
{ "PRAMIN", load_vbios_pramin, true },
|
||||
{ "PROM", load_vbios_prom, false },
|
||||
{ "PCIROM", load_vbios_pci, true },
|
||||
};
|
||||
|
||||
static struct methods nv50_methods[] = {
|
||||
{ "ACPI", load_vbios_acpi, true },
|
||||
{ "PRAMIN", load_vbios_pramin, true },
|
||||
{ "PROM", load_vbios_prom, false },
|
||||
{ "PCIROM", load_vbios_pci, true },
|
||||
};
|
||||
|
||||
#define METHODCNT 3
|
||||
|
||||
static bool NVShadowVBIOS(struct drm_device *dev, uint8_t *data)
|
||||
{
|
||||
struct drm_nouveau_private *dev_priv = dev->dev_private;
|
||||
struct methods *methods;
|
||||
int i;
|
||||
const int nr_methods = ARRAY_SIZE(shadow_methods);
|
||||
struct methods *methods = shadow_methods;
|
||||
int testscore = 3;
|
||||
int scores[METHODCNT];
|
||||
int scores[nr_methods], i;
|
||||
|
||||
if (nouveau_vbios) {
|
||||
methods = nv04_methods;
|
||||
for (i = 0; i < METHODCNT; i++)
|
||||
for (i = 0; i < nr_methods; i++)
|
||||
if (!strcasecmp(nouveau_vbios, methods[i].desc))
|
||||
break;
|
||||
|
||||
if (i < METHODCNT) {
|
||||
if (i < nr_methods) {
|
||||
NV_INFO(dev, "Attempting to use BIOS image from %s\n",
|
||||
methods[i].desc);
|
||||
|
||||
|
|
@ -244,12 +234,7 @@ static bool NVShadowVBIOS(struct drm_device *dev, uint8_t *data)
|
|||
NV_ERROR(dev, "VBIOS source \'%s\' invalid\n", nouveau_vbios);
|
||||
}
|
||||
|
||||
if (dev_priv->card_type < NV_50)
|
||||
methods = nv04_methods;
|
||||
else
|
||||
methods = nv50_methods;
|
||||
|
||||
for (i = 0; i < METHODCNT; i++) {
|
||||
for (i = 0; i < nr_methods; i++) {
|
||||
NV_TRACE(dev, "Attempting to load BIOS image from %s\n",
|
||||
methods[i].desc);
|
||||
data[0] = data[1] = 0; /* avoid reuse of previous image */
|
||||
|
|
@ -260,7 +245,7 @@ static bool NVShadowVBIOS(struct drm_device *dev, uint8_t *data)
|
|||
}
|
||||
|
||||
while (--testscore > 0) {
|
||||
for (i = 0; i < METHODCNT; i++) {
|
||||
for (i = 0; i < nr_methods; i++) {
|
||||
if (scores[i] == testscore) {
|
||||
NV_TRACE(dev, "Using BIOS image from %s\n",
|
||||
methods[i].desc);
|
||||
|
|
|
|||
|
|
@ -387,7 +387,8 @@ int nouveau_fbcon_init(struct drm_device *dev)
|
|||
dev_priv->nfbdev = nfbdev;
|
||||
nfbdev->helper.funcs = &nouveau_fbcon_helper_funcs;
|
||||
|
||||
ret = drm_fb_helper_init(dev, &nfbdev->helper, 2, 4);
|
||||
ret = drm_fb_helper_init(dev, &nfbdev->helper,
|
||||
nv_two_heads(dev) ? 2 : 1, 4);
|
||||
if (ret) {
|
||||
kfree(nfbdev);
|
||||
return ret;
|
||||
|
|
|
|||
|
|
@ -69,5 +69,6 @@ radeon-y += radeon_device.o radeon_asic.o radeon_kms.o \
|
|||
|
||||
radeon-$(CONFIG_COMPAT) += radeon_ioc32.o
|
||||
radeon-$(CONFIG_VGA_SWITCHEROO) += radeon_atpx_handler.o
|
||||
radeon-$(CONFIG_ACPI) += radeon_acpi.o
|
||||
|
||||
obj-$(CONFIG_DRM_RADEON)+= radeon.o
|
||||
|
|
|
|||
|
|
@ -108,12 +108,11 @@ static uint32_t atom_iio_execute(struct atom_context *ctx, int base,
|
|||
base++;
|
||||
break;
|
||||
case ATOM_IIO_READ:
|
||||
temp = ctx->card->reg_read(ctx->card, CU16(base + 1));
|
||||
temp = ctx->card->ioreg_read(ctx->card, CU16(base + 1));
|
||||
base += 3;
|
||||
break;
|
||||
case ATOM_IIO_WRITE:
|
||||
(void)ctx->card->reg_read(ctx->card, CU16(base + 1));
|
||||
ctx->card->reg_write(ctx->card, CU16(base + 1), temp);
|
||||
ctx->card->ioreg_write(ctx->card, CU16(base + 1), temp);
|
||||
base += 3;
|
||||
break;
|
||||
case ATOM_IIO_CLEAR:
|
||||
|
|
@ -715,8 +714,8 @@ static void atom_op_jump(atom_exec_context *ctx, int *ptr, int arg)
|
|||
cjiffies = jiffies;
|
||||
if (time_after(cjiffies, ctx->last_jump_jiffies)) {
|
||||
cjiffies -= ctx->last_jump_jiffies;
|
||||
if ((jiffies_to_msecs(cjiffies) > 1000)) {
|
||||
DRM_ERROR("atombios stuck in loop for more than 1sec aborting\n");
|
||||
if ((jiffies_to_msecs(cjiffies) > 5000)) {
|
||||
DRM_ERROR("atombios stuck in loop for more than 5secs aborting\n");
|
||||
ctx->abort = true;
|
||||
}
|
||||
} else {
|
||||
|
|
|
|||
|
|
@ -113,6 +113,8 @@ struct card_info {
|
|||
struct drm_device *dev;
|
||||
void (* reg_write)(struct card_info *, uint32_t, uint32_t); /* filled by driver */
|
||||
uint32_t (* reg_read)(struct card_info *, uint32_t); /* filled by driver */
|
||||
void (* ioreg_write)(struct card_info *, uint32_t, uint32_t); /* filled by driver */
|
||||
uint32_t (* ioreg_read)(struct card_info *, uint32_t); /* filled by driver */
|
||||
void (* mc_write)(struct card_info *, uint32_t, uint32_t); /* filled by driver */
|
||||
uint32_t (* mc_read)(struct card_info *, uint32_t); /* filled by driver */
|
||||
void (* pll_write)(struct card_info *, uint32_t, uint32_t); /* filled by driver */
|
||||
|
|
|
|||
|
|
@ -669,6 +669,90 @@ static void atombios_crtc_set_dcpll(struct drm_crtc *crtc)
|
|||
atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
|
||||
}
|
||||
|
||||
static void atombios_crtc_program_pll(struct drm_crtc *crtc,
|
||||
int crtc_id,
|
||||
int pll_id,
|
||||
u32 encoder_mode,
|
||||
u32 encoder_id,
|
||||
u32 clock,
|
||||
u32 ref_div,
|
||||
u32 fb_div,
|
||||
u32 frac_fb_div,
|
||||
u32 post_div)
|
||||
{
|
||||
struct drm_device *dev = crtc->dev;
|
||||
struct radeon_device *rdev = dev->dev_private;
|
||||
u8 frev, crev;
|
||||
int index = GetIndexIntoMasterTable(COMMAND, SetPixelClock);
|
||||
union set_pixel_clock args;
|
||||
|
||||
memset(&args, 0, sizeof(args));
|
||||
|
||||
if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev,
|
||||
&crev))
|
||||
return;
|
||||
|
||||
switch (frev) {
|
||||
case 1:
|
||||
switch (crev) {
|
||||
case 1:
|
||||
if (clock == ATOM_DISABLE)
|
||||
return;
|
||||
args.v1.usPixelClock = cpu_to_le16(clock / 10);
|
||||
args.v1.usRefDiv = cpu_to_le16(ref_div);
|
||||
args.v1.usFbDiv = cpu_to_le16(fb_div);
|
||||
args.v1.ucFracFbDiv = frac_fb_div;
|
||||
args.v1.ucPostDiv = post_div;
|
||||
args.v1.ucPpll = pll_id;
|
||||
args.v1.ucCRTC = crtc_id;
|
||||
args.v1.ucRefDivSrc = 1;
|
||||
break;
|
||||
case 2:
|
||||
args.v2.usPixelClock = cpu_to_le16(clock / 10);
|
||||
args.v2.usRefDiv = cpu_to_le16(ref_div);
|
||||
args.v2.usFbDiv = cpu_to_le16(fb_div);
|
||||
args.v2.ucFracFbDiv = frac_fb_div;
|
||||
args.v2.ucPostDiv = post_div;
|
||||
args.v2.ucPpll = pll_id;
|
||||
args.v2.ucCRTC = crtc_id;
|
||||
args.v2.ucRefDivSrc = 1;
|
||||
break;
|
||||
case 3:
|
||||
args.v3.usPixelClock = cpu_to_le16(clock / 10);
|
||||
args.v3.usRefDiv = cpu_to_le16(ref_div);
|
||||
args.v3.usFbDiv = cpu_to_le16(fb_div);
|
||||
args.v3.ucFracFbDiv = frac_fb_div;
|
||||
args.v3.ucPostDiv = post_div;
|
||||
args.v3.ucPpll = pll_id;
|
||||
args.v3.ucMiscInfo = (pll_id << 2);
|
||||
args.v3.ucTransmitterId = encoder_id;
|
||||
args.v3.ucEncoderMode = encoder_mode;
|
||||
break;
|
||||
case 5:
|
||||
args.v5.ucCRTC = crtc_id;
|
||||
args.v5.usPixelClock = cpu_to_le16(clock / 10);
|
||||
args.v5.ucRefDiv = ref_div;
|
||||
args.v5.usFbDiv = cpu_to_le16(fb_div);
|
||||
args.v5.ulFbDivDecFrac = cpu_to_le32(frac_fb_div * 100000);
|
||||
args.v5.ucPostDiv = post_div;
|
||||
args.v5.ucMiscInfo = 0; /* HDMI depth, etc. */
|
||||
args.v5.ucTransmitterID = encoder_id;
|
||||
args.v5.ucEncoderMode = encoder_mode;
|
||||
args.v5.ucPpll = pll_id;
|
||||
break;
|
||||
default:
|
||||
DRM_ERROR("Unknown table version %d %d\n", frev, crev);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
DRM_ERROR("Unknown table version %d %d\n", frev, crev);
|
||||
return;
|
||||
}
|
||||
|
||||
atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
|
||||
}
|
||||
|
||||
static void atombios_crtc_set_pll(struct drm_crtc *crtc, struct drm_display_mode *mode)
|
||||
{
|
||||
struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
|
||||
|
|
@ -676,17 +760,12 @@ static void atombios_crtc_set_pll(struct drm_crtc *crtc, struct drm_display_mode
|
|||
struct radeon_device *rdev = dev->dev_private;
|
||||
struct drm_encoder *encoder = NULL;
|
||||
struct radeon_encoder *radeon_encoder = NULL;
|
||||
u8 frev, crev;
|
||||
int index;
|
||||
union set_pixel_clock args;
|
||||
u32 pll_clock = mode->clock;
|
||||
u32 ref_div = 0, fb_div = 0, frac_fb_div = 0, post_div = 0;
|
||||
struct radeon_pll *pll;
|
||||
u32 adjusted_clock;
|
||||
int encoder_mode = 0;
|
||||
|
||||
memset(&args, 0, sizeof(args));
|
||||
|
||||
list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
|
||||
if (encoder->crtc == crtc) {
|
||||
radeon_encoder = to_radeon_encoder(encoder);
|
||||
|
|
@ -718,68 +797,10 @@ static void atombios_crtc_set_pll(struct drm_crtc *crtc, struct drm_display_mode
|
|||
radeon_compute_pll(pll, adjusted_clock, &pll_clock, &fb_div, &frac_fb_div,
|
||||
&ref_div, &post_div);
|
||||
|
||||
index = GetIndexIntoMasterTable(COMMAND, SetPixelClock);
|
||||
if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev,
|
||||
&crev))
|
||||
return;
|
||||
atombios_crtc_program_pll(crtc, radeon_crtc->crtc_id, radeon_crtc->pll_id,
|
||||
encoder_mode, radeon_encoder->encoder_id, mode->clock,
|
||||
ref_div, fb_div, frac_fb_div, post_div);
|
||||
|
||||
switch (frev) {
|
||||
case 1:
|
||||
switch (crev) {
|
||||
case 1:
|
||||
args.v1.usPixelClock = cpu_to_le16(mode->clock / 10);
|
||||
args.v1.usRefDiv = cpu_to_le16(ref_div);
|
||||
args.v1.usFbDiv = cpu_to_le16(fb_div);
|
||||
args.v1.ucFracFbDiv = frac_fb_div;
|
||||
args.v1.ucPostDiv = post_div;
|
||||
args.v1.ucPpll = radeon_crtc->pll_id;
|
||||
args.v1.ucCRTC = radeon_crtc->crtc_id;
|
||||
args.v1.ucRefDivSrc = 1;
|
||||
break;
|
||||
case 2:
|
||||
args.v2.usPixelClock = cpu_to_le16(mode->clock / 10);
|
||||
args.v2.usRefDiv = cpu_to_le16(ref_div);
|
||||
args.v2.usFbDiv = cpu_to_le16(fb_div);
|
||||
args.v2.ucFracFbDiv = frac_fb_div;
|
||||
args.v2.ucPostDiv = post_div;
|
||||
args.v2.ucPpll = radeon_crtc->pll_id;
|
||||
args.v2.ucCRTC = radeon_crtc->crtc_id;
|
||||
args.v2.ucRefDivSrc = 1;
|
||||
break;
|
||||
case 3:
|
||||
args.v3.usPixelClock = cpu_to_le16(mode->clock / 10);
|
||||
args.v3.usRefDiv = cpu_to_le16(ref_div);
|
||||
args.v3.usFbDiv = cpu_to_le16(fb_div);
|
||||
args.v3.ucFracFbDiv = frac_fb_div;
|
||||
args.v3.ucPostDiv = post_div;
|
||||
args.v3.ucPpll = radeon_crtc->pll_id;
|
||||
args.v3.ucMiscInfo = (radeon_crtc->pll_id << 2);
|
||||
args.v3.ucTransmitterId = radeon_encoder->encoder_id;
|
||||
args.v3.ucEncoderMode = encoder_mode;
|
||||
break;
|
||||
case 5:
|
||||
args.v5.ucCRTC = radeon_crtc->crtc_id;
|
||||
args.v5.usPixelClock = cpu_to_le16(mode->clock / 10);
|
||||
args.v5.ucRefDiv = ref_div;
|
||||
args.v5.usFbDiv = cpu_to_le16(fb_div);
|
||||
args.v5.ulFbDivDecFrac = cpu_to_le32(frac_fb_div * 100000);
|
||||
args.v5.ucPostDiv = post_div;
|
||||
args.v5.ucMiscInfo = 0; /* HDMI depth, etc. */
|
||||
args.v5.ucTransmitterID = radeon_encoder->encoder_id;
|
||||
args.v5.ucEncoderMode = encoder_mode;
|
||||
args.v5.ucPpll = radeon_crtc->pll_id;
|
||||
break;
|
||||
default:
|
||||
DRM_ERROR("Unknown table version %d %d\n", frev, crev);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
DRM_ERROR("Unknown table version %d %d\n", frev, crev);
|
||||
return;
|
||||
}
|
||||
|
||||
atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
|
||||
}
|
||||
|
||||
static int evergreen_crtc_set_base(struct drm_crtc *crtc, int x, int y,
|
||||
|
|
@ -841,6 +862,11 @@ static int evergreen_crtc_set_base(struct drm_crtc *crtc, int x, int y,
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (tiling_flags & RADEON_TILING_MACRO)
|
||||
fb_format |= EVERGREEN_GRPH_ARRAY_MODE(EVERGREEN_GRPH_ARRAY_2D_TILED_THIN1);
|
||||
else if (tiling_flags & RADEON_TILING_MICRO)
|
||||
fb_format |= EVERGREEN_GRPH_ARRAY_MODE(EVERGREEN_GRPH_ARRAY_1D_TILED_THIN1);
|
||||
|
||||
switch (radeon_crtc->crtc_id) {
|
||||
case 0:
|
||||
WREG32(AVIVO_D1VGA_CONTROL, 0);
|
||||
|
|
@ -979,11 +1005,18 @@ static int avivo_crtc_set_base(struct drm_crtc *crtc, int x, int y,
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (tiling_flags & RADEON_TILING_MACRO)
|
||||
fb_format |= AVIVO_D1GRPH_MACRO_ADDRESS_MODE;
|
||||
if (rdev->family >= CHIP_R600) {
|
||||
if (tiling_flags & RADEON_TILING_MACRO)
|
||||
fb_format |= R600_D1GRPH_ARRAY_MODE_2D_TILED_THIN1;
|
||||
else if (tiling_flags & RADEON_TILING_MICRO)
|
||||
fb_format |= R600_D1GRPH_ARRAY_MODE_1D_TILED_THIN1;
|
||||
} else {
|
||||
if (tiling_flags & RADEON_TILING_MACRO)
|
||||
fb_format |= AVIVO_D1GRPH_MACRO_ADDRESS_MODE;
|
||||
|
||||
if (tiling_flags & RADEON_TILING_MICRO)
|
||||
fb_format |= AVIVO_D1GRPH_TILED;
|
||||
if (tiling_flags & RADEON_TILING_MICRO)
|
||||
fb_format |= AVIVO_D1GRPH_TILED;
|
||||
}
|
||||
|
||||
if (radeon_crtc->crtc_id == 0)
|
||||
WREG32(AVIVO_D1VGA_CONTROL, 0);
|
||||
|
|
@ -1191,6 +1224,24 @@ static void atombios_crtc_commit(struct drm_crtc *crtc)
|
|||
atombios_lock_crtc(crtc, ATOM_DISABLE);
|
||||
}
|
||||
|
||||
static void atombios_crtc_disable(struct drm_crtc *crtc)
|
||||
{
|
||||
struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
|
||||
atombios_crtc_dpms(crtc, DRM_MODE_DPMS_OFF);
|
||||
|
||||
switch (radeon_crtc->pll_id) {
|
||||
case ATOM_PPLL1:
|
||||
case ATOM_PPLL2:
|
||||
/* disable the ppll */
|
||||
atombios_crtc_program_pll(crtc, radeon_crtc->crtc_id, radeon_crtc->pll_id,
|
||||
0, 0, ATOM_DISABLE, 0, 0, 0, 0);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
radeon_crtc->pll_id = -1;
|
||||
}
|
||||
|
||||
static const struct drm_crtc_helper_funcs atombios_helper_funcs = {
|
||||
.dpms = atombios_crtc_dpms,
|
||||
.mode_fixup = atombios_crtc_mode_fixup,
|
||||
|
|
@ -1199,6 +1250,7 @@ static const struct drm_crtc_helper_funcs atombios_helper_funcs = {
|
|||
.prepare = atombios_crtc_prepare,
|
||||
.commit = atombios_crtc_commit,
|
||||
.load_lut = radeon_crtc_load_lut,
|
||||
.disable = atombios_crtc_disable,
|
||||
};
|
||||
|
||||
void radeon_atombios_init_crtc(struct drm_device *dev,
|
||||
|
|
|
|||
|
|
@ -39,6 +39,23 @@
|
|||
static void evergreen_gpu_init(struct radeon_device *rdev);
|
||||
void evergreen_fini(struct radeon_device *rdev);
|
||||
|
||||
/* get temperature in millidegrees */
|
||||
u32 evergreen_get_temp(struct radeon_device *rdev)
|
||||
{
|
||||
u32 temp = (RREG32(CG_MULT_THERMAL_STATUS) & ASIC_T_MASK) >>
|
||||
ASIC_T_SHIFT;
|
||||
u32 actual_temp = 0;
|
||||
|
||||
if ((temp >> 10) & 1)
|
||||
actual_temp = 0;
|
||||
else if ((temp >> 9) & 1)
|
||||
actual_temp = 255;
|
||||
else
|
||||
actual_temp = (temp >> 1) & 0xff;
|
||||
|
||||
return actual_temp * 1000;
|
||||
}
|
||||
|
||||
void evergreen_pm_misc(struct radeon_device *rdev)
|
||||
{
|
||||
int req_ps_idx = rdev->pm.requested_power_state_index;
|
||||
|
|
@ -1115,6 +1132,7 @@ static void evergreen_gpu_init(struct radeon_device *rdev)
|
|||
rdev->config.evergreen.max_backends) &
|
||||
EVERGREEN_MAX_BACKENDS_MASK));
|
||||
|
||||
rdev->config.evergreen.tile_config = gb_addr_config;
|
||||
WREG32(GB_BACKEND_MAP, gb_backend_map);
|
||||
WREG32(GB_ADDR_CONFIG, gb_addr_config);
|
||||
WREG32(DMIF_ADDR_CONFIG, gb_addr_config);
|
||||
|
|
|
|||
|
|
@ -333,7 +333,6 @@ static int evergreen_cs_packet_parse_vline(struct radeon_cs_parser *p)
|
|||
header = radeon_get_ib_value(p, h_idx);
|
||||
crtc_id = radeon_get_ib_value(p, h_idx + 2 + 7 + 1);
|
||||
reg = CP_PACKET0_GET_REG(header);
|
||||
mutex_lock(&p->rdev->ddev->mode_config.mutex);
|
||||
obj = drm_mode_object_find(p->rdev->ddev, crtc_id, DRM_MODE_OBJECT_CRTC);
|
||||
if (!obj) {
|
||||
DRM_ERROR("cannot find crtc %d\n", crtc_id);
|
||||
|
|
@ -368,7 +367,6 @@ static int evergreen_cs_packet_parse_vline(struct radeon_cs_parser *p)
|
|||
}
|
||||
}
|
||||
out:
|
||||
mutex_unlock(&p->rdev->ddev->mode_config.mutex);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -61,6 +61,11 @@
|
|||
# define EVERGREEN_GRPH_FORMAT_8B_BGRA1010102 5
|
||||
# define EVERGREEN_GRPH_FORMAT_RGB111110 6
|
||||
# define EVERGREEN_GRPH_FORMAT_BGR101111 7
|
||||
# define EVERGREEN_GRPH_ARRAY_MODE(x) (((x) & 0x7) << 20)
|
||||
# define EVERGREEN_GRPH_ARRAY_LINEAR_GENERAL 0
|
||||
# define EVERGREEN_GRPH_ARRAY_LINEAR_ALIGNED 1
|
||||
# define EVERGREEN_GRPH_ARRAY_1D_TILED_THIN1 2
|
||||
# define EVERGREEN_GRPH_ARRAY_2D_TILED_THIN1 4
|
||||
#define EVERGREEN_GRPH_SWAP_CONTROL 0x680c
|
||||
# define EVERGREEN_GRPH_ENDIAN_SWAP(x) (((x) & 0x3) << 0)
|
||||
# define EVERGREEN_GRPH_ENDIAN_NONE 0
|
||||
|
|
|
|||
|
|
@ -165,6 +165,11 @@
|
|||
#define SE_DB_BUSY (1 << 30)
|
||||
#define SE_CB_BUSY (1 << 31)
|
||||
|
||||
#define CG_MULT_THERMAL_STATUS 0x740
|
||||
#define ASIC_T(x) ((x) << 16)
|
||||
#define ASIC_T_MASK 0x7FF0000
|
||||
#define ASIC_T_SHIFT 16
|
||||
|
||||
#define HDP_HOST_PATH_CNTL 0x2C00
|
||||
#define HDP_NONSURFACE_BASE 0x2C04
|
||||
#define HDP_NONSURFACE_INFO 0x2C08
|
||||
|
|
|
|||
|
|
@ -1230,7 +1230,6 @@ int r100_cs_packet_parse_vline(struct radeon_cs_parser *p)
|
|||
header = radeon_get_ib_value(p, h_idx);
|
||||
crtc_id = radeon_get_ib_value(p, h_idx + 5);
|
||||
reg = CP_PACKET0_GET_REG(header);
|
||||
mutex_lock(&p->rdev->ddev->mode_config.mutex);
|
||||
obj = drm_mode_object_find(p->rdev->ddev, crtc_id, DRM_MODE_OBJECT_CRTC);
|
||||
if (!obj) {
|
||||
DRM_ERROR("cannot find crtc %d\n", crtc_id);
|
||||
|
|
@ -1264,7 +1263,6 @@ int r100_cs_packet_parse_vline(struct radeon_cs_parser *p)
|
|||
ib[h_idx + 3] |= RADEON_ENG_DISPLAY_SELECT_CRTC1;
|
||||
}
|
||||
out:
|
||||
mutex_unlock(&p->rdev->ddev->mode_config.mutex);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
|
@ -2354,6 +2352,7 @@ void r100_mc_init(struct radeon_device *rdev)
|
|||
if (rdev->flags & RADEON_IS_IGP)
|
||||
base = (RREG32(RADEON_NB_TOM) & 0xffff) << 16;
|
||||
radeon_vram_location(rdev, &rdev->mc, base);
|
||||
rdev->mc.gtt_base_align = 0;
|
||||
if (!(rdev->flags & RADEON_IS_AGP))
|
||||
radeon_gtt_location(rdev, &rdev->mc);
|
||||
radeon_update_bandwidth_info(rdev);
|
||||
|
|
@ -2365,11 +2364,10 @@ void r100_mc_init(struct radeon_device *rdev)
|
|||
*/
|
||||
void r100_pll_errata_after_index(struct radeon_device *rdev)
|
||||
{
|
||||
if (!(rdev->pll_errata & CHIP_ERRATA_PLL_DUMMYREADS)) {
|
||||
return;
|
||||
if (rdev->pll_errata & CHIP_ERRATA_PLL_DUMMYREADS) {
|
||||
(void)RREG32(RADEON_CLOCK_CNTL_DATA);
|
||||
(void)RREG32(RADEON_CRTC_GEN_CNTL);
|
||||
}
|
||||
(void)RREG32(RADEON_CLOCK_CNTL_DATA);
|
||||
(void)RREG32(RADEON_CRTC_GEN_CNTL);
|
||||
}
|
||||
|
||||
static void r100_pll_errata_after_data(struct radeon_device *rdev)
|
||||
|
|
@ -3810,6 +3808,31 @@ void r100_fini(struct radeon_device *rdev)
|
|||
rdev->bios = NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Due to how kexec works, it can leave the hw fully initialised when it
|
||||
* boots the new kernel. However doing our init sequence with the CP and
|
||||
* WB stuff setup causes GPU hangs on the RN50 at least. So at startup
|
||||
* do some quick sanity checks and restore sane values to avoid this
|
||||
* problem.
|
||||
*/
|
||||
void r100_restore_sanity(struct radeon_device *rdev)
|
||||
{
|
||||
u32 tmp;
|
||||
|
||||
tmp = RREG32(RADEON_CP_CSQ_CNTL);
|
||||
if (tmp) {
|
||||
WREG32(RADEON_CP_CSQ_CNTL, 0);
|
||||
}
|
||||
tmp = RREG32(RADEON_CP_RB_CNTL);
|
||||
if (tmp) {
|
||||
WREG32(RADEON_CP_RB_CNTL, 0);
|
||||
}
|
||||
tmp = RREG32(RADEON_SCRATCH_UMSK);
|
||||
if (tmp) {
|
||||
WREG32(RADEON_SCRATCH_UMSK, 0);
|
||||
}
|
||||
}
|
||||
|
||||
int r100_init(struct radeon_device *rdev)
|
||||
{
|
||||
int r;
|
||||
|
|
@ -3822,6 +3845,8 @@ int r100_init(struct radeon_device *rdev)
|
|||
radeon_scratch_init(rdev);
|
||||
/* Initialize surface registers */
|
||||
radeon_surface_init(rdev);
|
||||
/* sanity check some register to avoid hangs like after kexec */
|
||||
r100_restore_sanity(rdev);
|
||||
/* TODO: disable VGA need to use VGA request */
|
||||
/* BIOS*/
|
||||
if (!radeon_get_bios(rdev)) {
|
||||
|
|
|
|||
|
|
@ -481,6 +481,7 @@ void r300_mc_init(struct radeon_device *rdev)
|
|||
if (rdev->flags & RADEON_IS_IGP)
|
||||
base = (RREG32(RADEON_NB_TOM) & 0xffff) << 16;
|
||||
radeon_vram_location(rdev, &rdev->mc, base);
|
||||
rdev->mc.gtt_base_align = 0;
|
||||
if (!(rdev->flags & RADEON_IS_AGP))
|
||||
radeon_gtt_location(rdev, &rdev->mc);
|
||||
radeon_update_bandwidth_info(rdev);
|
||||
|
|
@ -1176,6 +1177,8 @@ int r300_cs_parse(struct radeon_cs_parser *p)
|
|||
int r;
|
||||
|
||||
track = kzalloc(sizeof(*track), GFP_KERNEL);
|
||||
if (track == NULL)
|
||||
return -ENOMEM;
|
||||
r100_cs_track_clear(p->rdev, track);
|
||||
p->track = track;
|
||||
do {
|
||||
|
|
@ -1377,6 +1380,8 @@ int r300_init(struct radeon_device *rdev)
|
|||
/* Initialize surface registers */
|
||||
radeon_surface_init(rdev);
|
||||
/* TODO: disable VGA need to use VGA request */
|
||||
/* restore some register to sane defaults */
|
||||
r100_restore_sanity(rdev);
|
||||
/* BIOS*/
|
||||
if (!radeon_get_bios(rdev)) {
|
||||
if (ASIC_IS_AVIVO(rdev))
|
||||
|
|
|
|||
|
|
@ -343,6 +343,8 @@ int r420_init(struct radeon_device *rdev)
|
|||
/* Initialize surface registers */
|
||||
radeon_surface_init(rdev);
|
||||
/* TODO: disable VGA need to use VGA request */
|
||||
/* restore some register to sane defaults */
|
||||
r100_restore_sanity(rdev);
|
||||
/* BIOS*/
|
||||
if (!radeon_get_bios(rdev)) {
|
||||
if (ASIC_IS_AVIVO(rdev))
|
||||
|
|
|
|||
|
|
@ -386,6 +386,11 @@
|
|||
# define AVIVO_D1GRPH_TILED (1 << 20)
|
||||
# define AVIVO_D1GRPH_MACRO_ADDRESS_MODE (1 << 21)
|
||||
|
||||
# define R600_D1GRPH_ARRAY_MODE_LINEAR_GENERAL (0 << 20)
|
||||
# define R600_D1GRPH_ARRAY_MODE_LINEAR_ALIGNED (1 << 20)
|
||||
# define R600_D1GRPH_ARRAY_MODE_1D_TILED_THIN1 (2 << 20)
|
||||
# define R600_D1GRPH_ARRAY_MODE_2D_TILED_THIN1 (4 << 20)
|
||||
|
||||
/* The R7xx *_HIGH surface regs are backwards; the D1 regs are in the D2
|
||||
* block and vice versa. This applies to GRPH, CUR, etc.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -125,6 +125,7 @@ void r520_mc_init(struct radeon_device *rdev)
|
|||
r520_vram_get_type(rdev);
|
||||
r100_vram_init_sizes(rdev);
|
||||
radeon_vram_location(rdev, &rdev->mc, 0);
|
||||
rdev->mc.gtt_base_align = 0;
|
||||
if (!(rdev->flags & RADEON_IS_AGP))
|
||||
radeon_gtt_location(rdev, &rdev->mc);
|
||||
radeon_update_bandwidth_info(rdev);
|
||||
|
|
@ -230,6 +231,8 @@ int r520_init(struct radeon_device *rdev)
|
|||
radeon_scratch_init(rdev);
|
||||
/* Initialize surface registers */
|
||||
radeon_surface_init(rdev);
|
||||
/* restore some register to sane defaults */
|
||||
r100_restore_sanity(rdev);
|
||||
/* TODO: disable VGA need to use VGA request */
|
||||
/* BIOS*/
|
||||
if (!radeon_get_bios(rdev)) {
|
||||
|
|
|
|||
|
|
@ -92,6 +92,21 @@ void r600_gpu_init(struct radeon_device *rdev);
|
|||
void r600_fini(struct radeon_device *rdev);
|
||||
void r600_irq_disable(struct radeon_device *rdev);
|
||||
|
||||
/* get temperature in millidegrees */
|
||||
u32 rv6xx_get_temp(struct radeon_device *rdev)
|
||||
{
|
||||
u32 temp = (RREG32(CG_THERMAL_STATUS) & ASIC_T_MASK) >>
|
||||
ASIC_T_SHIFT;
|
||||
u32 actual_temp = 0;
|
||||
|
||||
if ((temp >> 7) & 1)
|
||||
actual_temp = 0;
|
||||
else
|
||||
actual_temp = (temp >> 1) & 0xff;
|
||||
|
||||
return actual_temp * 1000;
|
||||
}
|
||||
|
||||
void r600_pm_get_dynpm_state(struct radeon_device *rdev)
|
||||
{
|
||||
int i;
|
||||
|
|
@ -869,7 +884,17 @@ void r600_pcie_gart_tlb_flush(struct radeon_device *rdev)
|
|||
u32 tmp;
|
||||
|
||||
/* flush hdp cache so updates hit vram */
|
||||
WREG32(R_005480_HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1);
|
||||
if ((rdev->family >= CHIP_RV770) && (rdev->family <= CHIP_RV740)) {
|
||||
void __iomem *ptr = (void *)rdev->gart.table.vram.ptr;
|
||||
u32 tmp;
|
||||
|
||||
/* r7xx hw bug. write to HDP_DEBUG1 followed by fb read
|
||||
* rather than write to HDP_REG_COHERENCY_FLUSH_CNTL
|
||||
*/
|
||||
WREG32(HDP_DEBUG1, 0);
|
||||
tmp = readl((void __iomem *)ptr);
|
||||
} else
|
||||
WREG32(R_005480_HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1);
|
||||
|
||||
WREG32(VM_CONTEXT0_INVALIDATION_LOW_ADDR, rdev->mc.gtt_start >> 12);
|
||||
WREG32(VM_CONTEXT0_INVALIDATION_HIGH_ADDR, (rdev->mc.gtt_end - 1) >> 12);
|
||||
|
|
@ -1179,6 +1204,7 @@ void r600_vram_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc)
|
|||
if (rdev->flags & RADEON_IS_IGP)
|
||||
base = (RREG32(MC_VM_FB_LOCATION) & 0xFFFF) << 24;
|
||||
radeon_vram_location(rdev, &rdev->mc, base);
|
||||
rdev->mc.gtt_base_align = 0;
|
||||
radeon_gtt_location(rdev, mc);
|
||||
}
|
||||
}
|
||||
|
|
@ -1608,7 +1634,7 @@ void r600_gpu_init(struct radeon_device *rdev)
|
|||
r600_count_pipe_bits((cc_rb_backend_disable &
|
||||
R6XX_MAX_BACKENDS_MASK) >> 16)),
|
||||
(cc_rb_backend_disable >> 16));
|
||||
|
||||
rdev->config.r600.tile_config = tiling_config;
|
||||
tiling_config |= BACKEND_MAP(backend_map);
|
||||
WREG32(GB_TILING_CONFIG, tiling_config);
|
||||
WREG32(DCP_TILING_CONFIG, tiling_config & 0xffff);
|
||||
|
|
@ -3511,5 +3537,15 @@ int r600_debugfs_mc_info_init(struct radeon_device *rdev)
|
|||
*/
|
||||
void r600_ioctl_wait_idle(struct radeon_device *rdev, struct radeon_bo *bo)
|
||||
{
|
||||
WREG32(R_005480_HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1);
|
||||
/* r7xx hw bug. write to HDP_DEBUG1 followed by fb read
|
||||
* rather than write to HDP_REG_COHERENCY_FLUSH_CNTL
|
||||
*/
|
||||
if ((rdev->family >= CHIP_RV770) && (rdev->family <= CHIP_RV740)) {
|
||||
void __iomem *ptr = (void *)rdev->gart.table.vram.ptr;
|
||||
u32 tmp;
|
||||
|
||||
WREG32(HDP_DEBUG1, 0);
|
||||
tmp = readl((void __iomem *)ptr);
|
||||
} else
|
||||
WREG32(R_005480_HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -63,7 +63,8 @@ int r600_audio_bits_per_sample(struct radeon_device *rdev)
|
|||
case 0x4: return 32;
|
||||
}
|
||||
|
||||
DRM_ERROR("Unknown bits per sample 0x%x using 16 instead.\n", (int)value);
|
||||
dev_err(rdev->dev, "Unknown bits per sample 0x%x using 16 instead\n",
|
||||
(int)value);
|
||||
|
||||
return 16;
|
||||
}
|
||||
|
|
@ -150,7 +151,8 @@ static void r600_audio_update_hdmi(unsigned long param)
|
|||
r600_hdmi_update_audio_settings(encoder);
|
||||
}
|
||||
|
||||
if(still_going) r600_audio_schedule_polling(rdev);
|
||||
if (still_going)
|
||||
r600_audio_schedule_polling(rdev);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -158,8 +160,9 @@ static void r600_audio_update_hdmi(unsigned long param)
|
|||
*/
|
||||
static void r600_audio_engine_enable(struct radeon_device *rdev, bool enable)
|
||||
{
|
||||
DRM_INFO("%s audio support", enable ? "Enabling" : "Disabling");
|
||||
DRM_INFO("%s audio support\n", enable ? "Enabling" : "Disabling");
|
||||
WREG32_P(R600_AUDIO_ENABLE, enable ? 0x81000000 : 0x0, ~0x81000000);
|
||||
rdev->audio_enabled = enable;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -195,12 +198,14 @@ void r600_audio_enable_polling(struct drm_encoder *encoder)
|
|||
struct radeon_device *rdev = dev->dev_private;
|
||||
struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
|
||||
|
||||
DRM_DEBUG("r600_audio_enable_polling: %d", radeon_encoder->audio_polling_active);
|
||||
DRM_DEBUG("r600_audio_enable_polling: %d\n",
|
||||
radeon_encoder->audio_polling_active);
|
||||
if (radeon_encoder->audio_polling_active)
|
||||
return;
|
||||
|
||||
radeon_encoder->audio_polling_active = 1;
|
||||
mod_timer(&rdev->audio_timer, jiffies + 1);
|
||||
if (rdev->audio_enabled)
|
||||
mod_timer(&rdev->audio_timer, jiffies + 1);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -209,7 +214,8 @@ void r600_audio_enable_polling(struct drm_encoder *encoder)
|
|||
void r600_audio_disable_polling(struct drm_encoder *encoder)
|
||||
{
|
||||
struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
|
||||
DRM_DEBUG("r600_audio_disable_polling: %d", radeon_encoder->audio_polling_active);
|
||||
DRM_DEBUG("r600_audio_disable_polling: %d\n",
|
||||
radeon_encoder->audio_polling_active);
|
||||
radeon_encoder->audio_polling_active = 0;
|
||||
}
|
||||
|
||||
|
|
@ -236,7 +242,7 @@ void r600_audio_set_clock(struct drm_encoder *encoder, int clock)
|
|||
WREG32_P(R600_AUDIO_TIMING, 0x100, ~0x301);
|
||||
break;
|
||||
default:
|
||||
DRM_ERROR("Unsupported encoder type 0x%02X\n",
|
||||
dev_err(rdev->dev, "Unsupported encoder type 0x%02X\n",
|
||||
radeon_encoder->encoder_id);
|
||||
return;
|
||||
}
|
||||
|
|
@ -266,7 +272,7 @@ void r600_audio_set_clock(struct drm_encoder *encoder, int clock)
|
|||
*/
|
||||
void r600_audio_fini(struct radeon_device *rdev)
|
||||
{
|
||||
if (!radeon_audio || !r600_audio_chipset_supported(rdev))
|
||||
if (!rdev->audio_enabled)
|
||||
return;
|
||||
|
||||
del_timer(&rdev->audio_timer);
|
||||
|
|
|
|||
|
|
@ -538,9 +538,12 @@ int
|
|||
r600_prepare_blit_copy(struct drm_device *dev, struct drm_file *file_priv)
|
||||
{
|
||||
drm_radeon_private_t *dev_priv = dev->dev_private;
|
||||
int ret;
|
||||
DRM_DEBUG("\n");
|
||||
|
||||
r600_nomm_get_vb(dev);
|
||||
ret = r600_nomm_get_vb(dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
dev_priv->blit_vb->file_priv = file_priv;
|
||||
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -25,6 +25,7 @@
|
|||
* Alex Deucher
|
||||
* Jerome Glisse
|
||||
*/
|
||||
#include <linux/kernel.h>
|
||||
#include "drmP.h"
|
||||
#include "radeon.h"
|
||||
#include "r600d.h"
|
||||
|
|
@ -166,7 +167,7 @@ static void r600_cs_track_init(struct r600_cs_track *track)
|
|||
static inline int r600_cs_track_validate_cb(struct radeon_cs_parser *p, int i)
|
||||
{
|
||||
struct r600_cs_track *track = p->track;
|
||||
u32 bpe = 0, pitch, slice_tile_max, size, tmp, height;
|
||||
u32 bpe = 0, pitch, slice_tile_max, size, tmp, height, pitch_align;
|
||||
volatile u32 *ib = p->ib->ptr;
|
||||
|
||||
if (G_0280A0_TILE_MODE(track->cb_color_info[i])) {
|
||||
|
|
@ -180,56 +181,57 @@ static inline int r600_cs_track_validate_cb(struct radeon_cs_parser *p, int i)
|
|||
i, track->cb_color_info[i]);
|
||||
return -EINVAL;
|
||||
}
|
||||
pitch = (G_028060_PITCH_TILE_MAX(track->cb_color_size[i]) + 1) << 3;
|
||||
/* pitch is the number of 8x8 tiles per row */
|
||||
pitch = G_028060_PITCH_TILE_MAX(track->cb_color_size[i]) + 1;
|
||||
slice_tile_max = G_028060_SLICE_TILE_MAX(track->cb_color_size[i]) + 1;
|
||||
if (!pitch) {
|
||||
dev_warn(p->dev, "%s:%d cb pitch (%d) for %d invalid (0x%08X)\n",
|
||||
__func__, __LINE__, pitch, i, track->cb_color_size[i]);
|
||||
return -EINVAL;
|
||||
}
|
||||
height = size / (pitch * bpe);
|
||||
height = size / (pitch * 8 * bpe);
|
||||
if (height > 8192)
|
||||
height = 8192;
|
||||
if (height > 7)
|
||||
height &= ~0x7;
|
||||
switch (G_0280A0_ARRAY_MODE(track->cb_color_info[i])) {
|
||||
case V_0280A0_ARRAY_LINEAR_GENERAL:
|
||||
/* technically height & 0x7 */
|
||||
break;
|
||||
case V_0280A0_ARRAY_LINEAR_ALIGNED:
|
||||
if (pitch & 0x3f) {
|
||||
dev_warn(p->dev, "%s:%d cb pitch (%d x %d = %d) invalid\n",
|
||||
__func__, __LINE__, pitch, bpe, pitch * bpe);
|
||||
pitch_align = max((u32)64, (u32)(track->group_size / bpe)) / 8;
|
||||
if (!IS_ALIGNED(pitch, pitch_align)) {
|
||||
dev_warn(p->dev, "%s:%d cb pitch (%d) invalid\n",
|
||||
__func__, __LINE__, pitch);
|
||||
return -EINVAL;
|
||||
}
|
||||
if ((pitch * bpe) & (track->group_size - 1)) {
|
||||
dev_warn(p->dev, "%s:%d cb pitch (%d) invalid\n",
|
||||
__func__, __LINE__, pitch);
|
||||
if (!IS_ALIGNED(height, 8)) {
|
||||
dev_warn(p->dev, "%s:%d cb height (%d) invalid\n",
|
||||
__func__, __LINE__, height);
|
||||
return -EINVAL;
|
||||
}
|
||||
break;
|
||||
case V_0280A0_ARRAY_1D_TILED_THIN1:
|
||||
if ((pitch * 8 * bpe * track->nsamples) & (track->group_size - 1)) {
|
||||
pitch_align = max((u32)8, (u32)(track->group_size / (8 * bpe * track->nsamples))) / 8;
|
||||
if (!IS_ALIGNED(pitch, pitch_align)) {
|
||||
dev_warn(p->dev, "%s:%d cb pitch (%d) invalid\n",
|
||||
__func__, __LINE__, pitch);
|
||||
__func__, __LINE__, pitch);
|
||||
return -EINVAL;
|
||||
}
|
||||
if (!IS_ALIGNED(height, 8)) {
|
||||
dev_warn(p->dev, "%s:%d cb height (%d) invalid\n",
|
||||
__func__, __LINE__, height);
|
||||
return -EINVAL;
|
||||
}
|
||||
height &= ~0x7;
|
||||
if (!height)
|
||||
height = 8;
|
||||
break;
|
||||
case V_0280A0_ARRAY_2D_TILED_THIN1:
|
||||
if (pitch & ((8 * track->nbanks) - 1)) {
|
||||
pitch_align = max((u32)track->nbanks,
|
||||
(u32)(((track->group_size / 8) / (bpe * track->nsamples)) * track->nbanks));
|
||||
if (!IS_ALIGNED(pitch, pitch_align)) {
|
||||
dev_warn(p->dev, "%s:%d cb pitch (%d) invalid\n",
|
||||
__func__, __LINE__, pitch);
|
||||
return -EINVAL;
|
||||
}
|
||||
tmp = pitch * 8 * bpe * track->nsamples;
|
||||
tmp = tmp / track->nbanks;
|
||||
if (tmp & (track->group_size - 1)) {
|
||||
dev_warn(p->dev, "%s:%d cb pitch (%d) invalid\n",
|
||||
__func__, __LINE__, pitch);
|
||||
if (!IS_ALIGNED((height / 8), track->nbanks)) {
|
||||
dev_warn(p->dev, "%s:%d cb height (%d) invalid\n",
|
||||
__func__, __LINE__, height);
|
||||
return -EINVAL;
|
||||
}
|
||||
height &= ~((16 * track->npipes) - 1);
|
||||
if (!height)
|
||||
height = 16 * track->npipes;
|
||||
break;
|
||||
default:
|
||||
dev_warn(p->dev, "%s invalid tiling %d for %d (0x%08X)\n", __func__,
|
||||
|
|
@ -238,16 +240,20 @@ static inline int r600_cs_track_validate_cb(struct radeon_cs_parser *p, int i)
|
|||
return -EINVAL;
|
||||
}
|
||||
/* check offset */
|
||||
tmp = height * pitch;
|
||||
tmp = height * pitch * 8 * bpe;
|
||||
if ((tmp + track->cb_color_bo_offset[i]) > radeon_bo_size(track->cb_color_bo[i])) {
|
||||
dev_warn(p->dev, "%s offset[%d] %d to big\n", __func__, i, track->cb_color_bo_offset[i]);
|
||||
dev_warn(p->dev, "%s offset[%d] %d too big\n", __func__, i, track->cb_color_bo_offset[i]);
|
||||
return -EINVAL;
|
||||
}
|
||||
if (!IS_ALIGNED(track->cb_color_bo_offset[i], track->group_size)) {
|
||||
dev_warn(p->dev, "%s offset[%d] %d not aligned\n", __func__, i, track->cb_color_bo_offset[i]);
|
||||
return -EINVAL;
|
||||
}
|
||||
/* limit max tile */
|
||||
tmp = (height * pitch) >> 6;
|
||||
tmp = (height * pitch * 8) >> 6;
|
||||
if (tmp < slice_tile_max)
|
||||
slice_tile_max = tmp;
|
||||
tmp = S_028060_PITCH_TILE_MAX((pitch >> 3) - 1) |
|
||||
tmp = S_028060_PITCH_TILE_MAX(pitch - 1) |
|
||||
S_028060_SLICE_TILE_MAX(slice_tile_max - 1);
|
||||
ib[track->cb_color_size_idx[i]] = tmp;
|
||||
return 0;
|
||||
|
|
@ -289,7 +295,7 @@ static int r600_cs_track_check(struct radeon_cs_parser *p)
|
|||
/* Check depth buffer */
|
||||
if (G_028800_STENCIL_ENABLE(track->db_depth_control) ||
|
||||
G_028800_Z_ENABLE(track->db_depth_control)) {
|
||||
u32 nviews, bpe, ntiles;
|
||||
u32 nviews, bpe, ntiles, pitch, pitch_align, height, size;
|
||||
if (track->db_bo == NULL) {
|
||||
dev_warn(p->dev, "z/stencil with no depth buffer\n");
|
||||
return -EINVAL;
|
||||
|
|
@ -332,6 +338,51 @@ static int r600_cs_track_check(struct radeon_cs_parser *p)
|
|||
}
|
||||
ib[track->db_depth_size_idx] = S_028000_SLICE_TILE_MAX(tmp - 1) | (track->db_depth_size & 0x3FF);
|
||||
} else {
|
||||
size = radeon_bo_size(track->db_bo);
|
||||
pitch = G_028000_PITCH_TILE_MAX(track->db_depth_size) + 1;
|
||||
height = size / (pitch * 8 * bpe);
|
||||
height &= ~0x7;
|
||||
if (!height)
|
||||
height = 8;
|
||||
|
||||
switch (G_028010_ARRAY_MODE(track->db_depth_info)) {
|
||||
case V_028010_ARRAY_1D_TILED_THIN1:
|
||||
pitch_align = (max((u32)8, (u32)(track->group_size / (8 * bpe))) / 8);
|
||||
if (!IS_ALIGNED(pitch, pitch_align)) {
|
||||
dev_warn(p->dev, "%s:%d db pitch (%d) invalid\n",
|
||||
__func__, __LINE__, pitch);
|
||||
return -EINVAL;
|
||||
}
|
||||
if (!IS_ALIGNED(height, 8)) {
|
||||
dev_warn(p->dev, "%s:%d db height (%d) invalid\n",
|
||||
__func__, __LINE__, height);
|
||||
return -EINVAL;
|
||||
}
|
||||
break;
|
||||
case V_028010_ARRAY_2D_TILED_THIN1:
|
||||
pitch_align = max((u32)track->nbanks,
|
||||
(u32)(((track->group_size / 8) / bpe) * track->nbanks));
|
||||
if (!IS_ALIGNED(pitch, pitch_align)) {
|
||||
dev_warn(p->dev, "%s:%d db pitch (%d) invalid\n",
|
||||
__func__, __LINE__, pitch);
|
||||
return -EINVAL;
|
||||
}
|
||||
if ((height / 8) & (track->nbanks - 1)) {
|
||||
dev_warn(p->dev, "%s:%d db height (%d) invalid\n",
|
||||
__func__, __LINE__, height);
|
||||
return -EINVAL;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
dev_warn(p->dev, "%s invalid tiling %d (0x%08X)\n", __func__,
|
||||
G_028010_ARRAY_MODE(track->db_depth_info),
|
||||
track->db_depth_info);
|
||||
return -EINVAL;
|
||||
}
|
||||
if (!IS_ALIGNED(track->db_offset, track->group_size)) {
|
||||
dev_warn(p->dev, "%s offset[%d] %d not aligned\n", __func__, i, track->db_offset);
|
||||
return -EINVAL;
|
||||
}
|
||||
ntiles = G_028000_SLICE_TILE_MAX(track->db_depth_size) + 1;
|
||||
nviews = G_028004_SLICE_MAX(track->db_depth_view) + 1;
|
||||
tmp = ntiles * bpe * 64 * nviews;
|
||||
|
|
@ -585,7 +636,7 @@ static int r600_cs_packet_parse_vline(struct radeon_cs_parser *p)
|
|||
header = radeon_get_ib_value(p, h_idx);
|
||||
crtc_id = radeon_get_ib_value(p, h_idx + 2 + 7 + 1);
|
||||
reg = CP_PACKET0_GET_REG(header);
|
||||
mutex_lock(&p->rdev->ddev->mode_config.mutex);
|
||||
|
||||
obj = drm_mode_object_find(p->rdev->ddev, crtc_id, DRM_MODE_OBJECT_CRTC);
|
||||
if (!obj) {
|
||||
DRM_ERROR("cannot find crtc %d\n", crtc_id);
|
||||
|
|
@ -620,7 +671,6 @@ static int r600_cs_packet_parse_vline(struct radeon_cs_parser *p)
|
|||
ib[h_idx + 4] = AVIVO_D2MODE_VLINE_STATUS >> 2;
|
||||
}
|
||||
out:
|
||||
mutex_unlock(&p->rdev->ddev->mode_config.mutex);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
|
@ -725,7 +775,25 @@ static inline int r600_cs_check_reg(struct radeon_cs_parser *p, u32 reg, u32 idx
|
|||
track->db_depth_control = radeon_get_ib_value(p, idx);
|
||||
break;
|
||||
case R_028010_DB_DEPTH_INFO:
|
||||
track->db_depth_info = radeon_get_ib_value(p, idx);
|
||||
if (r600_cs_packet_next_is_pkt3_nop(p)) {
|
||||
r = r600_cs_packet_next_reloc(p, &reloc);
|
||||
if (r) {
|
||||
dev_warn(p->dev, "bad SET_CONTEXT_REG "
|
||||
"0x%04X\n", reg);
|
||||
return -EINVAL;
|
||||
}
|
||||
track->db_depth_info = radeon_get_ib_value(p, idx);
|
||||
ib[idx] &= C_028010_ARRAY_MODE;
|
||||
track->db_depth_info &= C_028010_ARRAY_MODE;
|
||||
if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO) {
|
||||
ib[idx] |= S_028010_ARRAY_MODE(V_028010_ARRAY_2D_TILED_THIN1);
|
||||
track->db_depth_info |= S_028010_ARRAY_MODE(V_028010_ARRAY_2D_TILED_THIN1);
|
||||
} else {
|
||||
ib[idx] |= S_028010_ARRAY_MODE(V_028010_ARRAY_1D_TILED_THIN1);
|
||||
track->db_depth_info |= S_028010_ARRAY_MODE(V_028010_ARRAY_1D_TILED_THIN1);
|
||||
}
|
||||
} else
|
||||
track->db_depth_info = radeon_get_ib_value(p, idx);
|
||||
break;
|
||||
case R_028004_DB_DEPTH_VIEW:
|
||||
track->db_depth_view = radeon_get_ib_value(p, idx);
|
||||
|
|
@ -758,8 +826,25 @@ static inline int r600_cs_check_reg(struct radeon_cs_parser *p, u32 reg, u32 idx
|
|||
case R_0280B4_CB_COLOR5_INFO:
|
||||
case R_0280B8_CB_COLOR6_INFO:
|
||||
case R_0280BC_CB_COLOR7_INFO:
|
||||
tmp = (reg - R_0280A0_CB_COLOR0_INFO) / 4;
|
||||
track->cb_color_info[tmp] = radeon_get_ib_value(p, idx);
|
||||
if (r600_cs_packet_next_is_pkt3_nop(p)) {
|
||||
r = r600_cs_packet_next_reloc(p, &reloc);
|
||||
if (r) {
|
||||
dev_err(p->dev, "bad SET_CONTEXT_REG 0x%04X\n", reg);
|
||||
return -EINVAL;
|
||||
}
|
||||
tmp = (reg - R_0280A0_CB_COLOR0_INFO) / 4;
|
||||
track->cb_color_info[tmp] = radeon_get_ib_value(p, idx);
|
||||
if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO) {
|
||||
ib[idx] |= S_0280A0_ARRAY_MODE(V_0280A0_ARRAY_2D_TILED_THIN1);
|
||||
track->cb_color_info[tmp] |= S_0280A0_ARRAY_MODE(V_0280A0_ARRAY_2D_TILED_THIN1);
|
||||
} else if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO) {
|
||||
ib[idx] |= S_0280A0_ARRAY_MODE(V_0280A0_ARRAY_1D_TILED_THIN1);
|
||||
track->cb_color_info[tmp] |= S_0280A0_ARRAY_MODE(V_0280A0_ARRAY_1D_TILED_THIN1);
|
||||
}
|
||||
} else {
|
||||
tmp = (reg - R_0280A0_CB_COLOR0_INFO) / 4;
|
||||
track->cb_color_info[tmp] = radeon_get_ib_value(p, idx);
|
||||
}
|
||||
break;
|
||||
case R_028060_CB_COLOR0_SIZE:
|
||||
case R_028064_CB_COLOR1_SIZE:
|
||||
|
|
@ -947,8 +1032,9 @@ static inline unsigned minify(unsigned size, unsigned levels)
|
|||
}
|
||||
|
||||
static void r600_texture_size(unsigned nfaces, unsigned blevel, unsigned nlevels,
|
||||
unsigned w0, unsigned h0, unsigned d0, unsigned bpe,
|
||||
unsigned *l0_size, unsigned *mipmap_size)
|
||||
unsigned w0, unsigned h0, unsigned d0, unsigned bpe,
|
||||
unsigned pitch_align,
|
||||
unsigned *l0_size, unsigned *mipmap_size)
|
||||
{
|
||||
unsigned offset, i, level, face;
|
||||
unsigned width, height, depth, rowstride, size;
|
||||
|
|
@ -961,13 +1047,13 @@ static void r600_texture_size(unsigned nfaces, unsigned blevel, unsigned nlevels
|
|||
height = minify(h0, i);
|
||||
depth = minify(d0, i);
|
||||
for(face = 0; face < nfaces; face++) {
|
||||
rowstride = ((width * bpe) + 255) & ~255;
|
||||
rowstride = ALIGN((width * bpe), pitch_align);
|
||||
size = height * rowstride * depth;
|
||||
offset += size;
|
||||
offset = (offset + 0x1f) & ~0x1f;
|
||||
}
|
||||
}
|
||||
*l0_size = (((w0 * bpe) + 255) & ~255) * h0 * d0;
|
||||
*l0_size = ALIGN((w0 * bpe), pitch_align) * h0 * d0;
|
||||
*mipmap_size = offset;
|
||||
if (!blevel)
|
||||
*mipmap_size -= *l0_size;
|
||||
|
|
@ -986,16 +1072,23 @@ static void r600_texture_size(unsigned nfaces, unsigned blevel, unsigned nlevels
|
|||
* the texture and mipmap bo object are big enough to cover this resource.
|
||||
*/
|
||||
static inline int r600_check_texture_resource(struct radeon_cs_parser *p, u32 idx,
|
||||
struct radeon_bo *texture,
|
||||
struct radeon_bo *mipmap)
|
||||
struct radeon_bo *texture,
|
||||
struct radeon_bo *mipmap,
|
||||
u32 tiling_flags)
|
||||
{
|
||||
struct r600_cs_track *track = p->track;
|
||||
u32 nfaces, nlevels, blevel, w0, h0, d0, bpe = 0;
|
||||
u32 word0, word1, l0_size, mipmap_size;
|
||||
u32 word0, word1, l0_size, mipmap_size, pitch, pitch_align;
|
||||
|
||||
/* on legacy kernel we don't perform advanced check */
|
||||
if (p->rdev == NULL)
|
||||
return 0;
|
||||
|
||||
word0 = radeon_get_ib_value(p, idx + 0);
|
||||
if (tiling_flags & RADEON_TILING_MACRO)
|
||||
word0 |= S_038000_TILE_MODE(V_038000_ARRAY_2D_TILED_THIN1);
|
||||
else if (tiling_flags & RADEON_TILING_MICRO)
|
||||
word0 |= S_038000_TILE_MODE(V_038000_ARRAY_1D_TILED_THIN1);
|
||||
word1 = radeon_get_ib_value(p, idx + 1);
|
||||
w0 = G_038000_TEX_WIDTH(word0) + 1;
|
||||
h0 = G_038004_TEX_HEIGHT(word1) + 1;
|
||||
|
|
@ -1022,11 +1115,55 @@ static inline int r600_check_texture_resource(struct radeon_cs_parser *p, u32 i
|
|||
__func__, __LINE__, G_038004_DATA_FORMAT(word1));
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
pitch = G_038000_PITCH(word0) + 1;
|
||||
switch (G_038000_TILE_MODE(word0)) {
|
||||
case V_038000_ARRAY_LINEAR_GENERAL:
|
||||
pitch_align = 1;
|
||||
/* XXX check height align */
|
||||
break;
|
||||
case V_038000_ARRAY_LINEAR_ALIGNED:
|
||||
pitch_align = max((u32)64, (u32)(track->group_size / bpe)) / 8;
|
||||
if (!IS_ALIGNED(pitch, pitch_align)) {
|
||||
dev_warn(p->dev, "%s:%d tex pitch (%d) invalid\n",
|
||||
__func__, __LINE__, pitch);
|
||||
return -EINVAL;
|
||||
}
|
||||
/* XXX check height align */
|
||||
break;
|
||||
case V_038000_ARRAY_1D_TILED_THIN1:
|
||||
pitch_align = max((u32)8, (u32)(track->group_size / (8 * bpe))) / 8;
|
||||
if (!IS_ALIGNED(pitch, pitch_align)) {
|
||||
dev_warn(p->dev, "%s:%d tex pitch (%d) invalid\n",
|
||||
__func__, __LINE__, pitch);
|
||||
return -EINVAL;
|
||||
}
|
||||
/* XXX check height align */
|
||||
break;
|
||||
case V_038000_ARRAY_2D_TILED_THIN1:
|
||||
pitch_align = max((u32)track->nbanks,
|
||||
(u32)(((track->group_size / 8) / bpe) * track->nbanks));
|
||||
if (!IS_ALIGNED(pitch, pitch_align)) {
|
||||
dev_warn(p->dev, "%s:%d tex pitch (%d) invalid\n",
|
||||
__func__, __LINE__, pitch);
|
||||
return -EINVAL;
|
||||
}
|
||||
/* XXX check height align */
|
||||
break;
|
||||
default:
|
||||
dev_warn(p->dev, "%s invalid tiling %d (0x%08X)\n", __func__,
|
||||
G_038000_TILE_MODE(word0), word0);
|
||||
return -EINVAL;
|
||||
}
|
||||
/* XXX check offset align */
|
||||
|
||||
word0 = radeon_get_ib_value(p, idx + 4);
|
||||
word1 = radeon_get_ib_value(p, idx + 5);
|
||||
blevel = G_038010_BASE_LEVEL(word0);
|
||||
nlevels = G_038014_LAST_LEVEL(word1);
|
||||
r600_texture_size(nfaces, blevel, nlevels, w0, h0, d0, bpe, &l0_size, &mipmap_size);
|
||||
r600_texture_size(nfaces, blevel, nlevels, w0, h0, d0, bpe,
|
||||
(pitch_align * bpe),
|
||||
&l0_size, &mipmap_size);
|
||||
/* using get ib will give us the offset into the texture bo */
|
||||
word0 = radeon_get_ib_value(p, idx + 2);
|
||||
if ((l0_size + word0) > radeon_bo_size(texture)) {
|
||||
|
|
@ -1240,6 +1377,10 @@ static int r600_packet3_check(struct radeon_cs_parser *p,
|
|||
return -EINVAL;
|
||||
}
|
||||
ib[idx+1+(i*7)+2] += (u32)((reloc->lobj.gpu_offset >> 8) & 0xffffffff);
|
||||
if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO)
|
||||
ib[idx+1+(i*7)+0] |= S_038000_TILE_MODE(V_038000_ARRAY_2D_TILED_THIN1);
|
||||
else if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO)
|
||||
ib[idx+1+(i*7)+0] |= S_038000_TILE_MODE(V_038000_ARRAY_1D_TILED_THIN1);
|
||||
texture = reloc->robj;
|
||||
/* tex mip base */
|
||||
r = r600_cs_packet_next_reloc(p, &reloc);
|
||||
|
|
@ -1250,7 +1391,7 @@ static int r600_packet3_check(struct radeon_cs_parser *p,
|
|||
ib[idx+1+(i*7)+3] += (u32)((reloc->lobj.gpu_offset >> 8) & 0xffffffff);
|
||||
mipmap = reloc->robj;
|
||||
r = r600_check_texture_resource(p, idx+(i*7)+1,
|
||||
texture, mipmap);
|
||||
texture, mipmap, reloc->lobj.tiling_flags);
|
||||
if (r)
|
||||
return r;
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -435,7 +435,8 @@ static int r600_hdmi_find_free_block(struct drm_device *dev)
|
|||
}
|
||||
}
|
||||
|
||||
if (rdev->family == CHIP_RS600 || rdev->family == CHIP_RS690) {
|
||||
if (rdev->family == CHIP_RS600 || rdev->family == CHIP_RS690 ||
|
||||
rdev->family == CHIP_RS740) {
|
||||
return free_blocks[0] ? R600_HDMI_BLOCK1 : 0;
|
||||
} else if (rdev->family >= CHIP_R600) {
|
||||
if (free_blocks[0])
|
||||
|
|
@ -466,7 +467,8 @@ static void r600_hdmi_assign_block(struct drm_encoder *encoder)
|
|||
if (ASIC_IS_DCE32(rdev))
|
||||
radeon_encoder->hdmi_config_offset = dig->dig_encoder ?
|
||||
R600_HDMI_CONFIG2 : R600_HDMI_CONFIG1;
|
||||
} else if (rdev->family >= CHIP_R600) {
|
||||
} else if (rdev->family >= CHIP_R600 || rdev->family == CHIP_RS600 ||
|
||||
rdev->family == CHIP_RS690 || rdev->family == CHIP_RS740) {
|
||||
radeon_encoder->hdmi_offset = r600_hdmi_find_free_block(dev);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -239,12 +239,18 @@
|
|||
#define GRBM_SOFT_RESET 0x8020
|
||||
#define SOFT_RESET_CP (1<<0)
|
||||
|
||||
#define CG_THERMAL_STATUS 0x7F4
|
||||
#define ASIC_T(x) ((x) << 0)
|
||||
#define ASIC_T_MASK 0x1FF
|
||||
#define ASIC_T_SHIFT 0
|
||||
|
||||
#define HDP_HOST_PATH_CNTL 0x2C00
|
||||
#define HDP_NONSURFACE_BASE 0x2C04
|
||||
#define HDP_NONSURFACE_INFO 0x2C08
|
||||
#define HDP_NONSURFACE_SIZE 0x2C0C
|
||||
#define HDP_REG_COHERENCY_FLUSH_CNTL 0x54A0
|
||||
#define HDP_TILING_CONFIG 0x2F3C
|
||||
#define HDP_DEBUG1 0x2F34
|
||||
|
||||
#define MC_VM_AGP_TOP 0x2184
|
||||
#define MC_VM_AGP_BOT 0x2188
|
||||
|
|
@ -1154,6 +1160,10 @@
|
|||
#define S_038000_TILE_MODE(x) (((x) & 0xF) << 3)
|
||||
#define G_038000_TILE_MODE(x) (((x) >> 3) & 0xF)
|
||||
#define C_038000_TILE_MODE 0xFFFFFF87
|
||||
#define V_038000_ARRAY_LINEAR_GENERAL 0x00000000
|
||||
#define V_038000_ARRAY_LINEAR_ALIGNED 0x00000001
|
||||
#define V_038000_ARRAY_1D_TILED_THIN1 0x00000002
|
||||
#define V_038000_ARRAY_2D_TILED_THIN1 0x00000004
|
||||
#define S_038000_TILE_TYPE(x) (((x) & 0x1) << 7)
|
||||
#define G_038000_TILE_TYPE(x) (((x) >> 7) & 0x1)
|
||||
#define C_038000_TILE_TYPE 0xFFFFFF7F
|
||||
|
|
@ -1357,6 +1367,8 @@
|
|||
#define S_028010_ARRAY_MODE(x) (((x) & 0xF) << 15)
|
||||
#define G_028010_ARRAY_MODE(x) (((x) >> 15) & 0xF)
|
||||
#define C_028010_ARRAY_MODE 0xFFF87FFF
|
||||
#define V_028010_ARRAY_1D_TILED_THIN1 0x00000002
|
||||
#define V_028010_ARRAY_2D_TILED_THIN1 0x00000004
|
||||
#define S_028010_TILE_SURFACE_ENABLE(x) (((x) & 0x1) << 25)
|
||||
#define G_028010_TILE_SURFACE_ENABLE(x) (((x) >> 25) & 0x1)
|
||||
#define C_028010_TILE_SURFACE_ENABLE 0xFDFFFFFF
|
||||
|
|
|
|||
|
|
@ -178,6 +178,9 @@ void radeon_combios_get_power_modes(struct radeon_device *rdev);
|
|||
void radeon_atombios_get_power_modes(struct radeon_device *rdev);
|
||||
void radeon_atom_set_voltage(struct radeon_device *rdev, u16 level);
|
||||
void rs690_pm_info(struct radeon_device *rdev);
|
||||
extern u32 rv6xx_get_temp(struct radeon_device *rdev);
|
||||
extern u32 rv770_get_temp(struct radeon_device *rdev);
|
||||
extern u32 evergreen_get_temp(struct radeon_device *rdev);
|
||||
|
||||
/*
|
||||
* Fences.
|
||||
|
|
@ -351,6 +354,7 @@ struct radeon_mc {
|
|||
int vram_mtrr;
|
||||
bool vram_is_ddr;
|
||||
bool igp_sideport_enabled;
|
||||
u64 gtt_base_align;
|
||||
};
|
||||
|
||||
bool radeon_combios_sideport_present(struct radeon_device *rdev);
|
||||
|
|
@ -670,6 +674,13 @@ struct radeon_pm_profile {
|
|||
int dpms_on_cm_idx;
|
||||
};
|
||||
|
||||
enum radeon_int_thermal_type {
|
||||
THERMAL_TYPE_NONE,
|
||||
THERMAL_TYPE_RV6XX,
|
||||
THERMAL_TYPE_RV770,
|
||||
THERMAL_TYPE_EVERGREEN,
|
||||
};
|
||||
|
||||
struct radeon_voltage {
|
||||
enum radeon_voltage_type type;
|
||||
/* gpio voltage */
|
||||
|
|
@ -765,6 +776,9 @@ struct radeon_pm {
|
|||
enum radeon_pm_profile_type profile;
|
||||
int profile_index;
|
||||
struct radeon_pm_profile profiles[PM_PROFILE_MAX];
|
||||
/* internal thermal controller on rv6xx+ */
|
||||
enum radeon_int_thermal_type int_thermal_type;
|
||||
struct device *int_hwmon_dev;
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -901,6 +915,7 @@ struct r600_asic {
|
|||
unsigned tiling_nbanks;
|
||||
unsigned tiling_npipes;
|
||||
unsigned tiling_group_size;
|
||||
unsigned tile_config;
|
||||
struct r100_gpu_lockup lockup;
|
||||
};
|
||||
|
||||
|
|
@ -925,6 +940,7 @@ struct rv770_asic {
|
|||
unsigned tiling_nbanks;
|
||||
unsigned tiling_npipes;
|
||||
unsigned tiling_group_size;
|
||||
unsigned tile_config;
|
||||
struct r100_gpu_lockup lockup;
|
||||
};
|
||||
|
||||
|
|
@ -950,6 +966,7 @@ struct evergreen_asic {
|
|||
unsigned tiling_nbanks;
|
||||
unsigned tiling_npipes;
|
||||
unsigned tiling_group_size;
|
||||
unsigned tile_config;
|
||||
};
|
||||
|
||||
union radeon_asic_config {
|
||||
|
|
@ -1032,6 +1049,9 @@ struct radeon_device {
|
|||
uint32_t pcie_reg_mask;
|
||||
radeon_rreg_t pciep_rreg;
|
||||
radeon_wreg_t pciep_wreg;
|
||||
/* io port */
|
||||
void __iomem *rio_mem;
|
||||
resource_size_t rio_mem_size;
|
||||
struct radeon_clock clock;
|
||||
struct radeon_mc mc;
|
||||
struct radeon_gart gart;
|
||||
|
|
@ -1068,6 +1088,7 @@ struct radeon_device {
|
|||
struct mutex vram_mutex;
|
||||
|
||||
/* audio stuff */
|
||||
bool audio_enabled;
|
||||
struct timer_list audio_timer;
|
||||
int audio_channels;
|
||||
int audio_rate;
|
||||
|
|
@ -1113,6 +1134,26 @@ static inline void r100_mm_wreg(struct radeon_device *rdev, uint32_t reg, uint32
|
|||
}
|
||||
}
|
||||
|
||||
static inline u32 r100_io_rreg(struct radeon_device *rdev, u32 reg)
|
||||
{
|
||||
if (reg < rdev->rio_mem_size)
|
||||
return ioread32(rdev->rio_mem + reg);
|
||||
else {
|
||||
iowrite32(reg, rdev->rio_mem + RADEON_MM_INDEX);
|
||||
return ioread32(rdev->rio_mem + RADEON_MM_DATA);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void r100_io_wreg(struct radeon_device *rdev, u32 reg, u32 v)
|
||||
{
|
||||
if (reg < rdev->rio_mem_size)
|
||||
iowrite32(v, rdev->rio_mem + reg);
|
||||
else {
|
||||
iowrite32(reg, rdev->rio_mem + RADEON_MM_INDEX);
|
||||
iowrite32(v, rdev->rio_mem + RADEON_MM_DATA);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Cast helper
|
||||
*/
|
||||
|
|
@ -1151,6 +1192,8 @@ static inline void r100_mm_wreg(struct radeon_device *rdev, uint32_t reg, uint32
|
|||
WREG32_PLL(reg, tmp_); \
|
||||
} while (0)
|
||||
#define DREG32_SYS(sqf, rdev, reg) seq_printf((sqf), #reg " : 0x%08X\n", r100_mm_rreg((rdev), (reg)))
|
||||
#define RREG32_IO(reg) r100_io_rreg(rdev, (reg))
|
||||
#define WREG32_IO(reg, v) r100_io_wreg(rdev, (reg), (v))
|
||||
|
||||
/*
|
||||
* Indirect registers accessor
|
||||
|
|
@ -1414,6 +1457,13 @@ extern void r700_cp_fini(struct radeon_device *rdev);
|
|||
extern void evergreen_disable_interrupt_state(struct radeon_device *rdev);
|
||||
extern int evergreen_irq_set(struct radeon_device *rdev);
|
||||
|
||||
/* radeon_acpi.c */
|
||||
#if defined(CONFIG_ACPI)
|
||||
extern int radeon_acpi_init(struct radeon_device *rdev);
|
||||
#else
|
||||
static inline int radeon_acpi_init(struct radeon_device *rdev) { return 0; }
|
||||
#endif
|
||||
|
||||
/* evergreen */
|
||||
struct evergreen_mc_save {
|
||||
u32 vga_control[6];
|
||||
|
|
|
|||
67
drivers/gpu/drm/radeon/radeon_acpi.c
Normal file
67
drivers/gpu/drm/radeon/radeon_acpi.c
Normal file
|
|
@ -0,0 +1,67 @@
|
|||
#include <linux/pci.h>
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/slab.h>
|
||||
#include <acpi/acpi_drivers.h>
|
||||
#include <acpi/acpi_bus.h>
|
||||
|
||||
#include "drmP.h"
|
||||
#include "drm.h"
|
||||
#include "drm_sarea.h"
|
||||
#include "drm_crtc_helper.h"
|
||||
#include "radeon.h"
|
||||
|
||||
#include <linux/vga_switcheroo.h>
|
||||
|
||||
/* Call the ATIF method
|
||||
*
|
||||
* Note: currently we discard the output
|
||||
*/
|
||||
static int radeon_atif_call(acpi_handle handle)
|
||||
{
|
||||
acpi_status status;
|
||||
union acpi_object atif_arg_elements[2];
|
||||
struct acpi_object_list atif_arg;
|
||||
struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL};
|
||||
|
||||
atif_arg.count = 2;
|
||||
atif_arg.pointer = &atif_arg_elements[0];
|
||||
|
||||
atif_arg_elements[0].type = ACPI_TYPE_INTEGER;
|
||||
atif_arg_elements[0].integer.value = 0;
|
||||
atif_arg_elements[1].type = ACPI_TYPE_INTEGER;
|
||||
atif_arg_elements[1].integer.value = 0;
|
||||
|
||||
status = acpi_evaluate_object(handle, "ATIF", &atif_arg, &buffer);
|
||||
|
||||
/* Fail only if calling the method fails and ATIF is supported */
|
||||
if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {
|
||||
printk(KERN_INFO "failed to evaluate ATIF got %s\n", acpi_format_exception(status));
|
||||
kfree(buffer.pointer);
|
||||
return 1;
|
||||
}
|
||||
|
||||
kfree(buffer.pointer);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Call all ACPI methods here */
|
||||
int radeon_acpi_init(struct radeon_device *rdev)
|
||||
{
|
||||
acpi_handle handle;
|
||||
int ret;
|
||||
|
||||
/* No need to proceed if we're sure that ATIF is not supported */
|
||||
if (!ASIC_IS_AVIVO(rdev) || !rdev->bios)
|
||||
return 0;
|
||||
|
||||
/* Get the device handle */
|
||||
handle = DEVICE_ACPI_HANDLE(&rdev->pdev->dev);
|
||||
|
||||
/* Call the ATIF method */
|
||||
ret = radeon_atif_call(handle);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -113,6 +113,7 @@ void r100_wb_fini(struct radeon_device *rdev);
|
|||
int r100_wb_init(struct radeon_device *rdev);
|
||||
int r100_cp_reset(struct radeon_device *rdev);
|
||||
void r100_vga_render_disable(struct radeon_device *rdev);
|
||||
void r100_restore_sanity(struct radeon_device *rdev);
|
||||
int r100_cs_track_check_pkt3_indx_buffer(struct radeon_cs_parser *p,
|
||||
struct radeon_cs_packet *pkt,
|
||||
struct radeon_bo *robj);
|
||||
|
|
|
|||
|
|
@ -280,6 +280,15 @@ static bool radeon_atom_apply_quirks(struct drm_device *dev,
|
|||
}
|
||||
}
|
||||
|
||||
/* ASUS HD 3600 board lists the DVI port as HDMI */
|
||||
if ((dev->pdev->device == 0x9598) &&
|
||||
(dev->pdev->subsystem_vendor == 0x1043) &&
|
||||
(dev->pdev->subsystem_device == 0x01e4)) {
|
||||
if (*connector_type == DRM_MODE_CONNECTOR_HDMIA) {
|
||||
*connector_type = DRM_MODE_CONNECTOR_DVII;
|
||||
}
|
||||
}
|
||||
|
||||
/* ASUS HD 3450 board lists the DVI port as HDMI */
|
||||
if ((dev->pdev->device == 0x95C5) &&
|
||||
(dev->pdev->subsystem_vendor == 0x1043) &&
|
||||
|
|
@ -1029,8 +1038,15 @@ bool radeon_atombios_sideport_present(struct radeon_device *rdev)
|
|||
data_offset);
|
||||
switch (crev) {
|
||||
case 1:
|
||||
if (igp_info->info.ucMemoryType & 0xf0)
|
||||
return true;
|
||||
/* AMD IGPS */
|
||||
if ((rdev->family == CHIP_RS690) ||
|
||||
(rdev->family == CHIP_RS740)) {
|
||||
if (igp_info->info.ulBootUpMemoryClock)
|
||||
return true;
|
||||
} else {
|
||||
if (igp_info->info.ucMemoryType & 0xf0)
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if (igp_info->info_2.ucMemoryType & 0x0f)
|
||||
|
|
@ -1773,14 +1789,22 @@ void radeon_atombios_get_power_modes(struct radeon_device *rdev)
|
|||
}
|
||||
|
||||
/* add the i2c bus for thermal/fan chip */
|
||||
/* no support for internal controller yet */
|
||||
if (controller->ucType > 0) {
|
||||
if ((controller->ucType == ATOM_PP_THERMALCONTROLLER_RV6xx) ||
|
||||
(controller->ucType == ATOM_PP_THERMALCONTROLLER_RV770) ||
|
||||
(controller->ucType == ATOM_PP_THERMALCONTROLLER_EVERGREEN)) {
|
||||
if (controller->ucType == ATOM_PP_THERMALCONTROLLER_RV6xx) {
|
||||
DRM_INFO("Internal thermal controller %s fan control\n",
|
||||
(controller->ucFanParameters &
|
||||
ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with");
|
||||
rdev->pm.int_thermal_type = THERMAL_TYPE_RV6XX;
|
||||
} else if (controller->ucType == ATOM_PP_THERMALCONTROLLER_RV770) {
|
||||
DRM_INFO("Internal thermal controller %s fan control\n",
|
||||
(controller->ucFanParameters &
|
||||
ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with");
|
||||
rdev->pm.int_thermal_type = THERMAL_TYPE_RV770;
|
||||
} else if (controller->ucType == ATOM_PP_THERMALCONTROLLER_EVERGREEN) {
|
||||
DRM_INFO("Internal thermal controller %s fan control\n",
|
||||
(controller->ucFanParameters &
|
||||
ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with");
|
||||
rdev->pm.int_thermal_type = THERMAL_TYPE_EVERGREEN;
|
||||
} else if ((controller->ucType ==
|
||||
ATOM_PP_THERMALCONTROLLER_EXTERNAL_GPIO) ||
|
||||
(controller->ucType ==
|
||||
|
|
|
|||
|
|
@ -2941,9 +2941,8 @@ static void combios_write_ram_size(struct drm_device *dev)
|
|||
if (rev < 3) {
|
||||
mem_cntl = RBIOS32(offset + 1);
|
||||
mem_size = RBIOS16(offset + 5);
|
||||
if (((rdev->flags & RADEON_FAMILY_MASK) < CHIP_R200) &&
|
||||
((dev->pdev->device != 0x515e)
|
||||
&& (dev->pdev->device != 0x5969)))
|
||||
if ((rdev->family < CHIP_R200) &&
|
||||
!ASIC_IS_RN50(rdev))
|
||||
WREG32(RADEON_MEM_CNTL, mem_cntl);
|
||||
}
|
||||
}
|
||||
|
|
@ -2954,10 +2953,8 @@ static void combios_write_ram_size(struct drm_device *dev)
|
|||
if (offset) {
|
||||
rev = RBIOS8(offset - 1);
|
||||
if (rev < 1) {
|
||||
if (((rdev->flags & RADEON_FAMILY_MASK) <
|
||||
CHIP_R200)
|
||||
&& ((dev->pdev->device != 0x515e)
|
||||
&& (dev->pdev->device != 0x5969))) {
|
||||
if ((rdev->family < CHIP_R200)
|
||||
&& !ASIC_IS_RN50(rdev)) {
|
||||
int ram = 0;
|
||||
int mem_addr_mapping = 0;
|
||||
|
||||
|
|
@ -3050,6 +3047,14 @@ void radeon_combios_asic_init(struct drm_device *dev)
|
|||
rdev->pdev->subsystem_device == 0x308b)
|
||||
return;
|
||||
|
||||
/* quirk for rs4xx HP dv5000 laptop to make it resume
|
||||
* - it hangs on resume inside the dynclk 1 table.
|
||||
*/
|
||||
if (rdev->family == CHIP_RS480 &&
|
||||
rdev->pdev->subsystem_vendor == 0x103c &&
|
||||
rdev->pdev->subsystem_device == 0x30a4)
|
||||
return;
|
||||
|
||||
/* DYN CLK 1 */
|
||||
table = combios_get_table_offset(dev, COMBIOS_DYN_CLK_1_TABLE);
|
||||
if (table)
|
||||
|
|
|
|||
|
|
@ -771,14 +771,14 @@ static enum drm_connector_status radeon_dvi_detect(struct drm_connector *connect
|
|||
} else
|
||||
ret = connector_status_connected;
|
||||
|
||||
/* multiple connectors on the same encoder with the same ddc line
|
||||
* This tends to be HDMI and DVI on the same encoder with the
|
||||
* same ddc line. If the edid says HDMI, consider the HDMI port
|
||||
* connected and the DVI port disconnected. If the edid doesn't
|
||||
* say HDMI, vice versa.
|
||||
/* This gets complicated. We have boards with VGA + HDMI with a
|
||||
* shared DDC line and we have boards with DVI-D + HDMI with a shared
|
||||
* DDC line. The latter is more complex because with DVI<->HDMI adapters
|
||||
* you don't really know what's connected to which port as both are digital.
|
||||
*/
|
||||
if (radeon_connector->shared_ddc && (ret == connector_status_connected)) {
|
||||
struct drm_device *dev = connector->dev;
|
||||
struct radeon_device *rdev = dev->dev_private;
|
||||
struct drm_connector *list_connector;
|
||||
struct radeon_connector *list_radeon_connector;
|
||||
list_for_each_entry(list_connector, &dev->mode_config.connector_list, head) {
|
||||
|
|
@ -788,15 +788,10 @@ static enum drm_connector_status radeon_dvi_detect(struct drm_connector *connect
|
|||
if (list_radeon_connector->shared_ddc &&
|
||||
(list_radeon_connector->ddc_bus->rec.i2c_id ==
|
||||
radeon_connector->ddc_bus->rec.i2c_id)) {
|
||||
if (drm_detect_hdmi_monitor(radeon_connector->edid)) {
|
||||
if (connector->connector_type == DRM_MODE_CONNECTOR_DVID) {
|
||||
kfree(radeon_connector->edid);
|
||||
radeon_connector->edid = NULL;
|
||||
ret = connector_status_disconnected;
|
||||
}
|
||||
} else {
|
||||
if ((connector->connector_type == DRM_MODE_CONNECTOR_HDMIA) ||
|
||||
(connector->connector_type == DRM_MODE_CONNECTOR_HDMIB)) {
|
||||
/* cases where both connectors are digital */
|
||||
if (list_connector->connector_type != DRM_MODE_CONNECTOR_VGA) {
|
||||
/* hpd is our only option in this case */
|
||||
if (!radeon_hpd_sense(rdev, radeon_connector->hpd.hpd)) {
|
||||
kfree(radeon_connector->edid);
|
||||
radeon_connector->edid = NULL;
|
||||
ret = connector_status_disconnected;
|
||||
|
|
|
|||
|
|
@ -226,20 +226,20 @@ void radeon_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc)
|
|||
{
|
||||
u64 size_af, size_bf;
|
||||
|
||||
size_af = 0xFFFFFFFF - mc->vram_end;
|
||||
size_bf = mc->vram_start;
|
||||
size_af = ((0xFFFFFFFF - mc->vram_end) + mc->gtt_base_align) & ~mc->gtt_base_align;
|
||||
size_bf = mc->vram_start & ~mc->gtt_base_align;
|
||||
if (size_bf > size_af) {
|
||||
if (mc->gtt_size > size_bf) {
|
||||
dev_warn(rdev->dev, "limiting GTT\n");
|
||||
mc->gtt_size = size_bf;
|
||||
}
|
||||
mc->gtt_start = mc->vram_start - mc->gtt_size;
|
||||
mc->gtt_start = (mc->vram_start & ~mc->gtt_base_align) - mc->gtt_size;
|
||||
} else {
|
||||
if (mc->gtt_size > size_af) {
|
||||
dev_warn(rdev->dev, "limiting GTT\n");
|
||||
mc->gtt_size = size_af;
|
||||
}
|
||||
mc->gtt_start = mc->vram_end + 1;
|
||||
mc->gtt_start = (mc->vram_end + 1 + mc->gtt_base_align) & ~mc->gtt_base_align;
|
||||
}
|
||||
mc->gtt_end = mc->gtt_start + mc->gtt_size - 1;
|
||||
dev_info(rdev->dev, "GTT: %lluM 0x%08llX - 0x%08llX\n",
|
||||
|
|
@ -415,6 +415,22 @@ static uint32_t cail_reg_read(struct card_info *info, uint32_t reg)
|
|||
return r;
|
||||
}
|
||||
|
||||
static void cail_ioreg_write(struct card_info *info, uint32_t reg, uint32_t val)
|
||||
{
|
||||
struct radeon_device *rdev = info->dev->dev_private;
|
||||
|
||||
WREG32_IO(reg*4, val);
|
||||
}
|
||||
|
||||
static uint32_t cail_ioreg_read(struct card_info *info, uint32_t reg)
|
||||
{
|
||||
struct radeon_device *rdev = info->dev->dev_private;
|
||||
uint32_t r;
|
||||
|
||||
r = RREG32_IO(reg*4);
|
||||
return r;
|
||||
}
|
||||
|
||||
int radeon_atombios_init(struct radeon_device *rdev)
|
||||
{
|
||||
struct card_info *atom_card_info =
|
||||
|
|
@ -427,6 +443,15 @@ int radeon_atombios_init(struct radeon_device *rdev)
|
|||
atom_card_info->dev = rdev->ddev;
|
||||
atom_card_info->reg_read = cail_reg_read;
|
||||
atom_card_info->reg_write = cail_reg_write;
|
||||
/* needed for iio ops */
|
||||
if (rdev->rio_mem) {
|
||||
atom_card_info->ioreg_read = cail_ioreg_read;
|
||||
atom_card_info->ioreg_write = cail_ioreg_write;
|
||||
} else {
|
||||
DRM_ERROR("Unable to find PCI I/O BAR; using MMIO for ATOM IIO\n");
|
||||
atom_card_info->ioreg_read = cail_reg_read;
|
||||
atom_card_info->ioreg_write = cail_reg_write;
|
||||
}
|
||||
atom_card_info->mc_read = cail_mc_read;
|
||||
atom_card_info->mc_write = cail_mc_write;
|
||||
atom_card_info->pll_read = cail_pll_read;
|
||||
|
|
@ -573,7 +598,7 @@ int radeon_device_init(struct radeon_device *rdev,
|
|||
struct pci_dev *pdev,
|
||||
uint32_t flags)
|
||||
{
|
||||
int r;
|
||||
int r, i;
|
||||
int dma_bits;
|
||||
|
||||
rdev->shutdown = false;
|
||||
|
|
@ -659,6 +684,17 @@ int radeon_device_init(struct radeon_device *rdev,
|
|||
DRM_INFO("register mmio base: 0x%08X\n", (uint32_t)rdev->rmmio_base);
|
||||
DRM_INFO("register mmio size: %u\n", (unsigned)rdev->rmmio_size);
|
||||
|
||||
/* io port mapping */
|
||||
for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
|
||||
if (pci_resource_flags(rdev->pdev, i) & IORESOURCE_IO) {
|
||||
rdev->rio_mem_size = pci_resource_len(rdev->pdev, i);
|
||||
rdev->rio_mem = pci_iomap(rdev->pdev, i, rdev->rio_mem_size);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (rdev->rio_mem == NULL)
|
||||
DRM_ERROR("Unable to find PCI I/O BAR\n");
|
||||
|
||||
/* if we have > 1 VGA cards, then disable the radeon VGA resources */
|
||||
/* this will fail for cards that aren't VGA class devices, just
|
||||
* ignore it */
|
||||
|
|
@ -701,6 +737,8 @@ void radeon_device_fini(struct radeon_device *rdev)
|
|||
destroy_workqueue(rdev->wq);
|
||||
vga_switcheroo_unregister_client(rdev->pdev);
|
||||
vga_client_register(rdev->pdev, NULL, NULL, NULL);
|
||||
pci_iounmap(rdev->pdev, rdev->rio_mem);
|
||||
rdev->rio_mem = NULL;
|
||||
iounmap(rdev->rmmio);
|
||||
rdev->rmmio = NULL;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -558,15 +558,17 @@ static void radeon_compute_pll_legacy(struct radeon_pll *pll,
|
|||
current_freq = radeon_div(tmp, ref_div * post_div);
|
||||
|
||||
if (pll->flags & RADEON_PLL_PREFER_CLOSEST_LOWER) {
|
||||
error = freq - current_freq;
|
||||
error = error < 0 ? 0xffffffff : error;
|
||||
if (freq < current_freq)
|
||||
error = 0xffffffff;
|
||||
else
|
||||
error = freq - current_freq;
|
||||
} else
|
||||
error = abs(current_freq - freq);
|
||||
vco_diff = abs(vco - best_vco);
|
||||
|
||||
if ((best_vco == 0 && error < best_error) ||
|
||||
(best_vco != 0 &&
|
||||
(error < best_error - 100 ||
|
||||
((best_error > 100 && error < best_error - 100) ||
|
||||
(abs(error - best_error) < 100 && vco_diff < best_vco_diff)))) {
|
||||
best_post_div = post_div;
|
||||
best_ref_div = ref_div;
|
||||
|
|
|
|||
|
|
@ -46,9 +46,10 @@
|
|||
* - 2.3.0 - add MSPOS + 3D texture + r500 VAP regs
|
||||
* - 2.4.0 - add crtc id query
|
||||
* - 2.5.0 - add get accel 2 to work around ddx breakage for evergreen
|
||||
* - 2.6.0 - add tiling config query (r6xx+)
|
||||
*/
|
||||
#define KMS_DRIVER_MAJOR 2
|
||||
#define KMS_DRIVER_MINOR 5
|
||||
#define KMS_DRIVER_MINOR 6
|
||||
#define KMS_DRIVER_PATCHLEVEL 0
|
||||
int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags);
|
||||
int radeon_driver_unload_kms(struct drm_device *dev);
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@ int radeon_driver_unload_kms(struct drm_device *dev)
|
|||
int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags)
|
||||
{
|
||||
struct radeon_device *rdev;
|
||||
int r;
|
||||
int r, acpi_status;
|
||||
|
||||
rdev = kzalloc(sizeof(struct radeon_device), GFP_KERNEL);
|
||||
if (rdev == NULL) {
|
||||
|
|
@ -77,6 +77,12 @@ int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags)
|
|||
dev_err(&dev->pdev->dev, "Fatal error during GPU init\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Call ACPI methods */
|
||||
acpi_status = radeon_acpi_init(rdev);
|
||||
if (acpi_status)
|
||||
dev_err(&dev->pdev->dev, "Error during ACPI methods call\n");
|
||||
|
||||
/* Again modeset_init should fail only on fatal error
|
||||
* otherwise it should provide enough functionalities
|
||||
* for shadowfb to run
|
||||
|
|
@ -128,7 +134,8 @@ int radeon_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
|
|||
for (i = 0, found = 0; i < rdev->num_crtc; i++) {
|
||||
crtc = (struct drm_crtc *)minfo->crtcs[i];
|
||||
if (crtc && crtc->base.id == value) {
|
||||
value = i;
|
||||
struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
|
||||
value = radeon_crtc->crtc_id;
|
||||
found = 1;
|
||||
break;
|
||||
}
|
||||
|
|
@ -141,6 +148,18 @@ int radeon_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
|
|||
case RADEON_INFO_ACCEL_WORKING2:
|
||||
value = rdev->accel_working;
|
||||
break;
|
||||
case RADEON_INFO_TILING_CONFIG:
|
||||
if (rdev->family >= CHIP_CEDAR)
|
||||
value = rdev->config.evergreen.tile_config;
|
||||
else if (rdev->family >= CHIP_RV770)
|
||||
value = rdev->config.rv770.tile_config;
|
||||
else if (rdev->family >= CHIP_R600)
|
||||
value = rdev->config.r600.tile_config;
|
||||
else {
|
||||
DRM_DEBUG("tiling config is r6xx+ only!\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
DRM_DEBUG("Invalid request %d\n", info->request);
|
||||
return -EINVAL;
|
||||
|
|
|
|||
|
|
@ -108,6 +108,7 @@ static void radeon_legacy_lvds_dpms(struct drm_encoder *encoder, int mode)
|
|||
udelay(panel_pwr_delay * 1000);
|
||||
WREG32(RADEON_LVDS_GEN_CNTL, lvds_gen_cntl);
|
||||
WREG32_PLL(RADEON_PIXCLKS_CNTL, pixclks_cntl);
|
||||
udelay(panel_pwr_delay * 1000);
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -642,8 +642,8 @@ void radeon_legacy_tv_mode_set(struct drm_encoder *encoder,
|
|||
}
|
||||
flicker_removal = (tmp + 500) / 1000;
|
||||
|
||||
if (flicker_removal < 2)
|
||||
flicker_removal = 2;
|
||||
if (flicker_removal < 3)
|
||||
flicker_removal = 3;
|
||||
for (i = 0; i < ARRAY_SIZE(SLOPE_limit); ++i) {
|
||||
if (flicker_removal == SLOPE_limit[i])
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -110,6 +110,7 @@ int radeon_bo_create(struct radeon_device *rdev, struct drm_gem_object *gobj,
|
|||
bo->surface_reg = -1;
|
||||
INIT_LIST_HEAD(&bo->list);
|
||||
|
||||
retry:
|
||||
radeon_ttm_placement_from_domain(bo, domain);
|
||||
/* Kernel allocation are uninterruptible */
|
||||
mutex_lock(&rdev->vram_mutex);
|
||||
|
|
@ -118,10 +119,15 @@ int radeon_bo_create(struct radeon_device *rdev, struct drm_gem_object *gobj,
|
|||
&radeon_ttm_bo_destroy);
|
||||
mutex_unlock(&rdev->vram_mutex);
|
||||
if (unlikely(r != 0)) {
|
||||
if (r != -ERESTARTSYS)
|
||||
if (r != -ERESTARTSYS) {
|
||||
if (domain == RADEON_GEM_DOMAIN_VRAM) {
|
||||
domain |= RADEON_GEM_DOMAIN_GTT;
|
||||
goto retry;
|
||||
}
|
||||
dev_err(rdev->dev,
|
||||
"object_init failed for (%lu, 0x%08X)\n",
|
||||
size, domain);
|
||||
}
|
||||
return r;
|
||||
}
|
||||
*bo_ptr = bo;
|
||||
|
|
@ -321,6 +327,7 @@ int radeon_bo_list_validate(struct list_head *head)
|
|||
{
|
||||
struct radeon_bo_list *lobj;
|
||||
struct radeon_bo *bo;
|
||||
u32 domain;
|
||||
int r;
|
||||
|
||||
list_for_each_entry(lobj, head, list) {
|
||||
|
|
@ -333,17 +340,19 @@ int radeon_bo_list_validate(struct list_head *head)
|
|||
list_for_each_entry(lobj, head, list) {
|
||||
bo = lobj->bo;
|
||||
if (!bo->pin_count) {
|
||||
if (lobj->wdomain) {
|
||||
radeon_ttm_placement_from_domain(bo,
|
||||
lobj->wdomain);
|
||||
} else {
|
||||
radeon_ttm_placement_from_domain(bo,
|
||||
lobj->rdomain);
|
||||
}
|
||||
domain = lobj->wdomain ? lobj->wdomain : lobj->rdomain;
|
||||
|
||||
retry:
|
||||
radeon_ttm_placement_from_domain(bo, domain);
|
||||
r = ttm_bo_validate(&bo->tbo, &bo->placement,
|
||||
true, false, false);
|
||||
if (unlikely(r))
|
||||
if (unlikely(r)) {
|
||||
if (r != -ERESTARTSYS && domain == RADEON_GEM_DOMAIN_VRAM) {
|
||||
domain |= RADEON_GEM_DOMAIN_GTT;
|
||||
goto retry;
|
||||
}
|
||||
return r;
|
||||
}
|
||||
}
|
||||
lobj->gpu_offset = radeon_bo_gpu_offset(bo);
|
||||
lobj->tiling_flags = bo->tiling_flags;
|
||||
|
|
|
|||
|
|
@ -27,6 +27,8 @@
|
|||
#include <linux/acpi.h>
|
||||
#endif
|
||||
#include <linux/power_supply.h>
|
||||
#include <linux/hwmon.h>
|
||||
#include <linux/hwmon-sysfs.h>
|
||||
|
||||
#define RADEON_IDLE_LOOP_MS 100
|
||||
#define RADEON_RECLOCK_DELAY_MS 200
|
||||
|
|
@ -423,6 +425,82 @@ fail:
|
|||
static DEVICE_ATTR(power_profile, S_IRUGO | S_IWUSR, radeon_get_pm_profile, radeon_set_pm_profile);
|
||||
static DEVICE_ATTR(power_method, S_IRUGO | S_IWUSR, radeon_get_pm_method, radeon_set_pm_method);
|
||||
|
||||
static ssize_t radeon_hwmon_show_temp(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct drm_device *ddev = pci_get_drvdata(to_pci_dev(dev));
|
||||
struct radeon_device *rdev = ddev->dev_private;
|
||||
u32 temp;
|
||||
|
||||
switch (rdev->pm.int_thermal_type) {
|
||||
case THERMAL_TYPE_RV6XX:
|
||||
temp = rv6xx_get_temp(rdev);
|
||||
break;
|
||||
case THERMAL_TYPE_RV770:
|
||||
temp = rv770_get_temp(rdev);
|
||||
break;
|
||||
case THERMAL_TYPE_EVERGREEN:
|
||||
temp = evergreen_get_temp(rdev);
|
||||
break;
|
||||
default:
|
||||
temp = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
return snprintf(buf, PAGE_SIZE, "%d\n", temp);
|
||||
}
|
||||
|
||||
static ssize_t radeon_hwmon_show_name(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
return sprintf(buf, "radeon\n");
|
||||
}
|
||||
|
||||
static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, radeon_hwmon_show_temp, NULL, 0);
|
||||
static SENSOR_DEVICE_ATTR(name, S_IRUGO, radeon_hwmon_show_name, NULL, 0);
|
||||
|
||||
static struct attribute *hwmon_attributes[] = {
|
||||
&sensor_dev_attr_temp1_input.dev_attr.attr,
|
||||
&sensor_dev_attr_name.dev_attr.attr,
|
||||
NULL
|
||||
};
|
||||
|
||||
static const struct attribute_group hwmon_attrgroup = {
|
||||
.attrs = hwmon_attributes,
|
||||
};
|
||||
|
||||
static void radeon_hwmon_init(struct radeon_device *rdev)
|
||||
{
|
||||
int err;
|
||||
|
||||
rdev->pm.int_hwmon_dev = NULL;
|
||||
|
||||
switch (rdev->pm.int_thermal_type) {
|
||||
case THERMAL_TYPE_RV6XX:
|
||||
case THERMAL_TYPE_RV770:
|
||||
case THERMAL_TYPE_EVERGREEN:
|
||||
rdev->pm.int_hwmon_dev = hwmon_device_register(rdev->dev);
|
||||
dev_set_drvdata(rdev->pm.int_hwmon_dev, rdev->ddev);
|
||||
err = sysfs_create_group(&rdev->pm.int_hwmon_dev->kobj,
|
||||
&hwmon_attrgroup);
|
||||
if (err)
|
||||
DRM_ERROR("Unable to create hwmon sysfs file: %d\n", err);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void radeon_hwmon_fini(struct radeon_device *rdev)
|
||||
{
|
||||
if (rdev->pm.int_hwmon_dev) {
|
||||
sysfs_remove_group(&rdev->pm.int_hwmon_dev->kobj, &hwmon_attrgroup);
|
||||
hwmon_device_unregister(rdev->pm.int_hwmon_dev);
|
||||
}
|
||||
}
|
||||
|
||||
void radeon_pm_suspend(struct radeon_device *rdev)
|
||||
{
|
||||
bool flush_wq = false;
|
||||
|
|
@ -470,6 +548,7 @@ int radeon_pm_init(struct radeon_device *rdev)
|
|||
rdev->pm.dynpm_can_downclock = true;
|
||||
rdev->pm.current_sclk = rdev->clock.default_sclk;
|
||||
rdev->pm.current_mclk = rdev->clock.default_mclk;
|
||||
rdev->pm.int_thermal_type = THERMAL_TYPE_NONE;
|
||||
|
||||
if (rdev->bios) {
|
||||
if (rdev->is_atom_bios)
|
||||
|
|
@ -480,6 +559,8 @@ int radeon_pm_init(struct radeon_device *rdev)
|
|||
radeon_pm_init_profile(rdev);
|
||||
}
|
||||
|
||||
/* set up the internal thermal sensor if applicable */
|
||||
radeon_hwmon_init(rdev);
|
||||
if (rdev->pm.num_power_states > 1) {
|
||||
/* where's the best place to put these? */
|
||||
ret = device_create_file(rdev->dev, &dev_attr_power_profile);
|
||||
|
|
@ -535,6 +616,7 @@ void radeon_pm_fini(struct radeon_device *rdev)
|
|||
#endif
|
||||
}
|
||||
|
||||
radeon_hwmon_fini(rdev);
|
||||
if (rdev->pm.i2c_bus)
|
||||
radeon_i2c_destroy(rdev->pm.i2c_bus);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -55,12 +55,6 @@ void rs400_gart_adjust_size(struct radeon_device *rdev)
|
|||
rdev->mc.gtt_size = 32 * 1024 * 1024;
|
||||
return;
|
||||
}
|
||||
if (rdev->family == CHIP_RS400 || rdev->family == CHIP_RS480) {
|
||||
/* FIXME: RS400 & RS480 seems to have issue with GART size
|
||||
* if 4G of system memory (needs more testing) */
|
||||
rdev->mc.gtt_size = 32 * 1024 * 1024;
|
||||
DRM_ERROR("Forcing to 32M GART size (because of ASIC bug ?)\n");
|
||||
}
|
||||
}
|
||||
|
||||
void rs400_gart_tlb_flush(struct radeon_device *rdev)
|
||||
|
|
@ -263,6 +257,7 @@ void rs400_mc_init(struct radeon_device *rdev)
|
|||
r100_vram_init_sizes(rdev);
|
||||
base = (RREG32(RADEON_NB_TOM) & 0xffff) << 16;
|
||||
radeon_vram_location(rdev, &rdev->mc, base);
|
||||
rdev->mc.gtt_base_align = rdev->mc.gtt_size - 1;
|
||||
radeon_gtt_location(rdev, &rdev->mc);
|
||||
radeon_update_bandwidth_info(rdev);
|
||||
}
|
||||
|
|
@ -480,6 +475,8 @@ int rs400_init(struct radeon_device *rdev)
|
|||
/* Initialize surface registers */
|
||||
radeon_surface_init(rdev);
|
||||
/* TODO: disable VGA need to use VGA request */
|
||||
/* restore some register to sane defaults */
|
||||
r100_restore_sanity(rdev);
|
||||
/* BIOS*/
|
||||
if (!radeon_get_bios(rdev)) {
|
||||
if (ASIC_IS_AVIVO(rdev))
|
||||
|
|
|
|||
|
|
@ -698,6 +698,7 @@ void rs600_mc_init(struct radeon_device *rdev)
|
|||
base = G_000004_MC_FB_START(base) << 16;
|
||||
rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev);
|
||||
radeon_vram_location(rdev, &rdev->mc, base);
|
||||
rdev->mc.gtt_base_align = 0;
|
||||
radeon_gtt_location(rdev, &rdev->mc);
|
||||
radeon_update_bandwidth_info(rdev);
|
||||
}
|
||||
|
|
@ -812,6 +813,13 @@ static int rs600_startup(struct radeon_device *rdev)
|
|||
dev_err(rdev->dev, "failled initializing IB (%d).\n", r);
|
||||
return r;
|
||||
}
|
||||
|
||||
r = r600_audio_init(rdev);
|
||||
if (r) {
|
||||
dev_err(rdev->dev, "failed initializing audio\n");
|
||||
return r;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -838,6 +846,7 @@ int rs600_resume(struct radeon_device *rdev)
|
|||
|
||||
int rs600_suspend(struct radeon_device *rdev)
|
||||
{
|
||||
r600_audio_fini(rdev);
|
||||
r100_cp_disable(rdev);
|
||||
r100_wb_disable(rdev);
|
||||
rs600_irq_disable(rdev);
|
||||
|
|
@ -847,6 +856,7 @@ int rs600_suspend(struct radeon_device *rdev)
|
|||
|
||||
void rs600_fini(struct radeon_device *rdev)
|
||||
{
|
||||
r600_audio_fini(rdev);
|
||||
r100_cp_fini(rdev);
|
||||
r100_wb_fini(rdev);
|
||||
r100_ib_fini(rdev);
|
||||
|
|
@ -870,6 +880,8 @@ int rs600_init(struct radeon_device *rdev)
|
|||
radeon_scratch_init(rdev);
|
||||
/* Initialize surface registers */
|
||||
radeon_surface_init(rdev);
|
||||
/* restore some register to sane defaults */
|
||||
r100_restore_sanity(rdev);
|
||||
/* BIOS */
|
||||
if (!radeon_get_bios(rdev)) {
|
||||
if (ASIC_IS_AVIVO(rdev))
|
||||
|
|
|
|||
|
|
@ -162,6 +162,7 @@ void rs690_mc_init(struct radeon_device *rdev)
|
|||
rs690_pm_info(rdev);
|
||||
rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev);
|
||||
radeon_vram_location(rdev, &rdev->mc, base);
|
||||
rdev->mc.gtt_base_align = rdev->mc.gtt_size - 1;
|
||||
radeon_gtt_location(rdev, &rdev->mc);
|
||||
radeon_update_bandwidth_info(rdev);
|
||||
}
|
||||
|
|
@ -640,6 +641,13 @@ static int rs690_startup(struct radeon_device *rdev)
|
|||
dev_err(rdev->dev, "failled initializing IB (%d).\n", r);
|
||||
return r;
|
||||
}
|
||||
|
||||
r = r600_audio_init(rdev);
|
||||
if (r) {
|
||||
dev_err(rdev->dev, "failed initializing audio\n");
|
||||
return r;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -666,6 +674,7 @@ int rs690_resume(struct radeon_device *rdev)
|
|||
|
||||
int rs690_suspend(struct radeon_device *rdev)
|
||||
{
|
||||
r600_audio_fini(rdev);
|
||||
r100_cp_disable(rdev);
|
||||
r100_wb_disable(rdev);
|
||||
rs600_irq_disable(rdev);
|
||||
|
|
@ -675,6 +684,7 @@ int rs690_suspend(struct radeon_device *rdev)
|
|||
|
||||
void rs690_fini(struct radeon_device *rdev)
|
||||
{
|
||||
r600_audio_fini(rdev);
|
||||
r100_cp_fini(rdev);
|
||||
r100_wb_fini(rdev);
|
||||
r100_ib_fini(rdev);
|
||||
|
|
@ -698,6 +708,8 @@ int rs690_init(struct radeon_device *rdev)
|
|||
radeon_scratch_init(rdev);
|
||||
/* Initialize surface registers */
|
||||
radeon_surface_init(rdev);
|
||||
/* restore some register to sane defaults */
|
||||
r100_restore_sanity(rdev);
|
||||
/* TODO: disable VGA need to use VGA request */
|
||||
/* BIOS*/
|
||||
if (!radeon_get_bios(rdev)) {
|
||||
|
|
|
|||
|
|
@ -195,6 +195,7 @@ void rv515_mc_init(struct radeon_device *rdev)
|
|||
rv515_vram_get_type(rdev);
|
||||
r100_vram_init_sizes(rdev);
|
||||
radeon_vram_location(rdev, &rdev->mc, 0);
|
||||
rdev->mc.gtt_base_align = 0;
|
||||
if (!(rdev->flags & RADEON_IS_AGP))
|
||||
radeon_gtt_location(rdev, &rdev->mc);
|
||||
radeon_update_bandwidth_info(rdev);
|
||||
|
|
@ -468,6 +469,8 @@ int rv515_init(struct radeon_device *rdev)
|
|||
/* Initialize surface registers */
|
||||
radeon_surface_init(rdev);
|
||||
/* TODO: disable VGA need to use VGA request */
|
||||
/* restore some register to sane defaults */
|
||||
r100_restore_sanity(rdev);
|
||||
/* BIOS*/
|
||||
if (!radeon_get_bios(rdev)) {
|
||||
if (ASIC_IS_AVIVO(rdev))
|
||||
|
|
|
|||
|
|
@ -42,6 +42,21 @@
|
|||
static void rv770_gpu_init(struct radeon_device *rdev);
|
||||
void rv770_fini(struct radeon_device *rdev);
|
||||
|
||||
/* get temperature in millidegrees */
|
||||
u32 rv770_get_temp(struct radeon_device *rdev)
|
||||
{
|
||||
u32 temp = (RREG32(CG_MULT_THERMAL_STATUS) & ASIC_T_MASK) >>
|
||||
ASIC_T_SHIFT;
|
||||
u32 actual_temp = 0;
|
||||
|
||||
if ((temp >> 9) & 1)
|
||||
actual_temp = 0;
|
||||
else
|
||||
actual_temp = (temp >> 1) & 0xff;
|
||||
|
||||
return actual_temp * 1000;
|
||||
}
|
||||
|
||||
void rv770_pm_misc(struct radeon_device *rdev)
|
||||
{
|
||||
int req_ps_idx = rdev->pm.requested_power_state_index;
|
||||
|
|
@ -189,7 +204,10 @@ static void rv770_mc_program(struct radeon_device *rdev)
|
|||
WREG32((0x2c20 + j), 0x00000000);
|
||||
WREG32((0x2c24 + j), 0x00000000);
|
||||
}
|
||||
WREG32(HDP_REG_COHERENCY_FLUSH_CNTL, 0);
|
||||
/* r7xx hw bug. Read from HDP_DEBUG1 rather
|
||||
* than writing to HDP_REG_COHERENCY_FLUSH_CNTL
|
||||
*/
|
||||
tmp = RREG32(HDP_DEBUG1);
|
||||
|
||||
rv515_mc_stop(rdev, &save);
|
||||
if (r600_mc_wait_for_idle(rdev)) {
|
||||
|
|
@ -659,8 +677,9 @@ static void rv770_gpu_init(struct radeon_device *rdev)
|
|||
r600_count_pipe_bits((cc_rb_backend_disable &
|
||||
R7XX_MAX_BACKENDS_MASK) >> 16)),
|
||||
(cc_rb_backend_disable >> 16));
|
||||
gb_tiling_config |= BACKEND_MAP(backend_map);
|
||||
|
||||
rdev->config.rv770.tile_config = gb_tiling_config;
|
||||
gb_tiling_config |= BACKEND_MAP(backend_map);
|
||||
|
||||
WREG32(GB_TILING_CONFIG, gb_tiling_config);
|
||||
WREG32(DCP_TILING_CONFIG, (gb_tiling_config & 0xffff));
|
||||
|
|
|
|||
|
|
@ -122,12 +122,18 @@
|
|||
#define GUI_ACTIVE (1<<31)
|
||||
#define GRBM_STATUS2 0x8014
|
||||
|
||||
#define CG_MULT_THERMAL_STATUS 0x740
|
||||
#define ASIC_T(x) ((x) << 16)
|
||||
#define ASIC_T_MASK 0x3FF0000
|
||||
#define ASIC_T_SHIFT 16
|
||||
|
||||
#define HDP_HOST_PATH_CNTL 0x2C00
|
||||
#define HDP_NONSURFACE_BASE 0x2C04
|
||||
#define HDP_NONSURFACE_INFO 0x2C08
|
||||
#define HDP_NONSURFACE_SIZE 0x2C0C
|
||||
#define HDP_REG_COHERENCY_FLUSH_CNTL 0x54A0
|
||||
#define HDP_TILING_CONFIG 0x2F3C
|
||||
#define HDP_DEBUG1 0x2F34
|
||||
|
||||
#define MC_SHARED_CHMAP 0x2004
|
||||
#define NOOFCHAN_SHIFT 12
|
||||
|
|
|
|||
|
|
@ -40,11 +40,13 @@
|
|||
#include <linux/slab.h>
|
||||
|
||||
#include <asm/atomic.h>
|
||||
#include <asm/agp.h>
|
||||
|
||||
#include "ttm/ttm_bo_driver.h"
|
||||
#include "ttm/ttm_page_alloc.h"
|
||||
|
||||
#ifdef TTM_HAS_AGP
|
||||
#include <asm/agp.h>
|
||||
#endif
|
||||
|
||||
#define NUM_PAGES_TO_ALLOC (PAGE_SIZE/sizeof(struct page *))
|
||||
#define SMALL_ALLOCATION 16
|
||||
|
|
@ -392,7 +394,7 @@ static int ttm_pool_get_num_unused_pages(void)
|
|||
/**
|
||||
* Callback for mm to request pool to reduce number of page held.
|
||||
*/
|
||||
static int ttm_pool_mm_shrink(int shrink_pages, gfp_t gfp_mask)
|
||||
static int ttm_pool_mm_shrink(struct shrinker *shrink, int shrink_pages, gfp_t gfp_mask)
|
||||
{
|
||||
static atomic_t start_pool = ATOMIC_INIT(0);
|
||||
unsigned i;
|
||||
|
|
|
|||
|
|
@ -972,6 +972,7 @@ int vmw_kms_update_layout_ioctl(struct drm_device *dev, void *data,
|
|||
ret = copy_from_user(rects, user_rects, rects_size);
|
||||
if (unlikely(ret != 0)) {
|
||||
DRM_ERROR("Failed to get rects.\n");
|
||||
ret = -EFAULT;
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue