Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 293650
b: refs/heads/master
c: 3ae19b7
h: refs/heads/master
v: v3
  • Loading branch information
Alex Deucher authored and Dave Airlie committed Feb 27, 2012
1 parent 3f90984 commit 37124a6
Show file tree
Hide file tree
Showing 10 changed files with 101 additions and 2 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: e5bcf23443740f741df8e5461ccdad0f10d1a75b
refs/heads/master: 3ae19b750bdc09ce233e1504348320141593ffda
19 changes: 19 additions & 0 deletions trunk/drivers/gpu/drm/radeon/evergreen.c
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,25 @@ void evergreen_fix_pci_max_read_req_size(struct radeon_device *rdev)
}
}

void dce4_wait_for_vblank(struct radeon_device *rdev, int crtc)
{
struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc];
int i;

if (RREG32(EVERGREEN_CRTC_CONTROL + radeon_crtc->crtc_offset) & EVERGREEN_CRTC_MASTER_EN) {
for (i = 0; i < rdev->usec_timeout; i++) {
if (!(RREG32(EVERGREEN_CRTC_STATUS + radeon_crtc->crtc_offset) & EVERGREEN_CRTC_V_BLANK))
break;
udelay(1);
}
for (i = 0; i < rdev->usec_timeout; i++) {
if (RREG32(EVERGREEN_CRTC_STATUS + radeon_crtc->crtc_offset) & EVERGREEN_CRTC_V_BLANK)
break;
udelay(1);
}
}
}

void evergreen_pre_page_flip(struct radeon_device *rdev, int crtc)
{
/* enable the pflip int */
Expand Down
1 change: 1 addition & 0 deletions trunk/drivers/gpu/drm/radeon/evergreen_reg.h
Original file line number Diff line number Diff line change
Expand Up @@ -219,6 +219,7 @@
# define EVERGREEN_CRTC_MASTER_EN (1 << 0)
# define EVERGREEN_CRTC_DISP_READ_REQUEST_DISABLE (1 << 24)
#define EVERGREEN_CRTC_STATUS 0x6e8c
# define EVERGREEN_CRTC_V_BLANK (1 << 0)
#define EVERGREEN_CRTC_STATUS_POSITION 0x6e90
#define EVERGREEN_MASTER_UPDATE_MODE 0x6ef8
#define EVERGREEN_CRTC_UPDATE_LOCK 0x6ed4
Expand Down
34 changes: 34 additions & 0 deletions trunk/drivers/gpu/drm/radeon/r100.c
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,40 @@ MODULE_FIRMWARE(FIRMWARE_R520);

#include "r100_track.h"

void r100_wait_for_vblank(struct radeon_device *rdev, int crtc)
{
struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc];
int i;

if (radeon_crtc->crtc_id == 0) {
if (RREG32(RADEON_CRTC_GEN_CNTL) & RADEON_CRTC_EN) {
for (i = 0; i < rdev->usec_timeout; i++) {
if (!(RREG32(RADEON_CRTC_STATUS) & RADEON_CRTC_VBLANK_CUR))
break;
udelay(1);
}
for (i = 0; i < rdev->usec_timeout; i++) {
if (RREG32(RADEON_CRTC_STATUS) & RADEON_CRTC_VBLANK_CUR)
break;
udelay(1);
}
}
} else {
if (RREG32(RADEON_CRTC2_GEN_CNTL) & RADEON_CRTC2_EN) {
for (i = 0; i < rdev->usec_timeout; i++) {
if (!(RREG32(RADEON_CRTC2_STATUS) & RADEON_CRTC2_VBLANK_CUR))
break;
udelay(1);
}
for (i = 0; i < rdev->usec_timeout; i++) {
if (RREG32(RADEON_CRTC2_STATUS) & RADEON_CRTC2_VBLANK_CUR)
break;
udelay(1);
}
}
}
}

/* This files gather functions specifics to:
* r100,rv100,rs100,rv200,rs200,r200,rv250,rs300,rv280
*/
Expand Down
2 changes: 2 additions & 0 deletions trunk/drivers/gpu/drm/radeon/r500_reg.h
Original file line number Diff line number Diff line change
Expand Up @@ -351,6 +351,8 @@
#define AVIVO_D1CRTC_BLANK_CONTROL 0x6084
#define AVIVO_D1CRTC_INTERLACE_CONTROL 0x6088
#define AVIVO_D1CRTC_INTERLACE_STATUS 0x608c
#define AVIVO_D1CRTC_STATUS 0x609c
# define AVIVO_D1CRTC_V_BLANK (1 << 0)
#define AVIVO_D1CRTC_STATUS_POSITION 0x60a0
#define AVIVO_D1CRTC_FRAME_COUNT 0x60a4
#define AVIVO_D1CRTC_STEREO_CONTROL 0x60c4
Expand Down
3 changes: 3 additions & 0 deletions trunk/drivers/gpu/drm/radeon/radeon.h
Original file line number Diff line number Diff line change
Expand Up @@ -1204,6 +1204,8 @@ struct radeon_asic {
void (*pre_page_flip)(struct radeon_device *rdev, int crtc);
u32 (*page_flip)(struct radeon_device *rdev, int crtc, u64 crtc_base);
void (*post_page_flip)(struct radeon_device *rdev, int crtc);
/* wait for vblank */
void (*wait_for_vblank)(struct radeon_device *rdev, int crtc);
};

/*
Expand Down Expand Up @@ -1692,6 +1694,7 @@ void radeon_ring_write(struct radeon_ring *ring, uint32_t v);
#define radeon_pre_page_flip(rdev, crtc) rdev->asic->pre_page_flip((rdev), (crtc))
#define radeon_page_flip(rdev, crtc, base) rdev->asic->page_flip((rdev), (crtc), (base))
#define radeon_post_page_flip(rdev, crtc) rdev->asic->post_page_flip((rdev), (crtc))
#define radeon_wait_for_vblank(rdev, crtc) rdev->asic->wait_for_vblank((rdev), (crtc))

/* Common functions */
/* AGP */
Expand Down
17 changes: 17 additions & 0 deletions trunk/drivers/gpu/drm/radeon/radeon_asic.c
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,7 @@ static struct radeon_asic r100_asic = {
.pre_page_flip = &r100_pre_page_flip,
.page_flip = &r100_page_flip,
.post_page_flip = &r100_post_page_flip,
.wait_for_vblank = &r100_wait_for_vblank,
};

static struct radeon_asic r200_asic = {
Expand Down Expand Up @@ -229,6 +230,7 @@ static struct radeon_asic r200_asic = {
.pre_page_flip = &r100_pre_page_flip,
.page_flip = &r100_page_flip,
.post_page_flip = &r100_post_page_flip,
.wait_for_vblank = &r100_wait_for_vblank,
};

static struct radeon_asic r300_asic = {
Expand Down Expand Up @@ -281,6 +283,7 @@ static struct radeon_asic r300_asic = {
.pre_page_flip = &r100_pre_page_flip,
.page_flip = &r100_page_flip,
.post_page_flip = &r100_post_page_flip,
.wait_for_vblank = &r100_wait_for_vblank,
};

static struct radeon_asic r300_asic_pcie = {
Expand Down Expand Up @@ -332,6 +335,7 @@ static struct radeon_asic r300_asic_pcie = {
.pre_page_flip = &r100_pre_page_flip,
.page_flip = &r100_page_flip,
.post_page_flip = &r100_post_page_flip,
.wait_for_vblank = &r100_wait_for_vblank,
};

static struct radeon_asic r420_asic = {
Expand Down Expand Up @@ -384,6 +388,7 @@ static struct radeon_asic r420_asic = {
.pre_page_flip = &r100_pre_page_flip,
.page_flip = &r100_page_flip,
.post_page_flip = &r100_post_page_flip,
.wait_for_vblank = &r100_wait_for_vblank,
};

static struct radeon_asic rs400_asic = {
Expand Down Expand Up @@ -436,6 +441,7 @@ static struct radeon_asic rs400_asic = {
.pre_page_flip = &r100_pre_page_flip,
.page_flip = &r100_page_flip,
.post_page_flip = &r100_post_page_flip,
.wait_for_vblank = &r100_wait_for_vblank,
};

static struct radeon_asic rs600_asic = {
Expand Down Expand Up @@ -488,6 +494,7 @@ static struct radeon_asic rs600_asic = {
.pre_page_flip = &rs600_pre_page_flip,
.page_flip = &rs600_page_flip,
.post_page_flip = &rs600_post_page_flip,
.wait_for_vblank = &avivo_wait_for_vblank,
};

static struct radeon_asic rs690_asic = {
Expand Down Expand Up @@ -540,6 +547,7 @@ static struct radeon_asic rs690_asic = {
.pre_page_flip = &rs600_pre_page_flip,
.page_flip = &rs600_page_flip,
.post_page_flip = &rs600_post_page_flip,
.wait_for_vblank = &avivo_wait_for_vblank,
};

static struct radeon_asic rv515_asic = {
Expand Down Expand Up @@ -592,6 +600,7 @@ static struct radeon_asic rv515_asic = {
.pre_page_flip = &rs600_pre_page_flip,
.page_flip = &rs600_page_flip,
.post_page_flip = &rs600_post_page_flip,
.wait_for_vblank = &avivo_wait_for_vblank,
};

static struct radeon_asic r520_asic = {
Expand Down Expand Up @@ -644,6 +653,7 @@ static struct radeon_asic r520_asic = {
.pre_page_flip = &rs600_pre_page_flip,
.page_flip = &rs600_page_flip,
.post_page_flip = &rs600_post_page_flip,
.wait_for_vblank = &avivo_wait_for_vblank,
};

static struct radeon_asic r600_asic = {
Expand Down Expand Up @@ -695,6 +705,7 @@ static struct radeon_asic r600_asic = {
.pre_page_flip = &rs600_pre_page_flip,
.page_flip = &rs600_page_flip,
.post_page_flip = &rs600_post_page_flip,
.wait_for_vblank = &avivo_wait_for_vblank,
};

static struct radeon_asic rs780_asic = {
Expand Down Expand Up @@ -746,6 +757,7 @@ static struct radeon_asic rs780_asic = {
.pre_page_flip = &rs600_pre_page_flip,
.page_flip = &rs600_page_flip,
.post_page_flip = &rs600_post_page_flip,
.wait_for_vblank = &avivo_wait_for_vblank,
};

static struct radeon_asic rv770_asic = {
Expand Down Expand Up @@ -797,6 +809,7 @@ static struct radeon_asic rv770_asic = {
.pre_page_flip = &rs600_pre_page_flip,
.page_flip = &rv770_page_flip,
.post_page_flip = &rs600_post_page_flip,
.wait_for_vblank = &avivo_wait_for_vblank,
};

static struct radeon_asic evergreen_asic = {
Expand Down Expand Up @@ -848,6 +861,7 @@ static struct radeon_asic evergreen_asic = {
.pre_page_flip = &evergreen_pre_page_flip,
.page_flip = &evergreen_page_flip,
.post_page_flip = &evergreen_post_page_flip,
.wait_for_vblank = &dce4_wait_for_vblank,
};

static struct radeon_asic sumo_asic = {
Expand Down Expand Up @@ -899,6 +913,7 @@ static struct radeon_asic sumo_asic = {
.pre_page_flip = &evergreen_pre_page_flip,
.page_flip = &evergreen_page_flip,
.post_page_flip = &evergreen_post_page_flip,
.wait_for_vblank = &dce4_wait_for_vblank,
};

static struct radeon_asic btc_asic = {
Expand Down Expand Up @@ -950,6 +965,7 @@ static struct radeon_asic btc_asic = {
.pre_page_flip = &evergreen_pre_page_flip,
.page_flip = &evergreen_page_flip,
.post_page_flip = &evergreen_post_page_flip,
.wait_for_vblank = &dce4_wait_for_vblank,
};

static const struct radeon_vm_funcs cayman_vm_funcs = {
Expand Down Expand Up @@ -1024,6 +1040,7 @@ static struct radeon_asic cayman_asic = {
.pre_page_flip = &evergreen_pre_page_flip,
.page_flip = &evergreen_page_flip,
.post_page_flip = &evergreen_post_page_flip,
.wait_for_vblank = &dce4_wait_for_vblank,
};

int radeon_asic_init(struct radeon_device *rdev)
Expand Down
4 changes: 3 additions & 1 deletion trunk/drivers/gpu/drm/radeon/radeon_asic.h
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,7 @@ extern void r100_pm_get_dynpm_state(struct radeon_device *rdev);
extern void r100_pre_page_flip(struct radeon_device *rdev, int crtc);
extern u32 r100_page_flip(struct radeon_device *rdev, int crtc, u64 crtc_base);
extern void r100_post_page_flip(struct radeon_device *rdev, int crtc);
extern void r100_wait_for_vblank(struct radeon_device *rdev, int crtc);

/*
* r200,rv250,rs300,rv280
Expand Down Expand Up @@ -236,7 +237,7 @@ extern void rs600_pre_page_flip(struct radeon_device *rdev, int crtc);
extern u32 rs600_page_flip(struct radeon_device *rdev, int crtc, u64 crtc_base);
extern void rs600_post_page_flip(struct radeon_device *rdev, int crtc);
void rs600_set_safe_registers(struct radeon_device *rdev);

extern void avivo_wait_for_vblank(struct radeon_device *rdev, int crtc);

/*
* rs690,rs740
Expand Down Expand Up @@ -423,6 +424,7 @@ extern void sumo_pm_init_profile(struct radeon_device *rdev);
extern void evergreen_pre_page_flip(struct radeon_device *rdev, int crtc);
extern u32 evergreen_page_flip(struct radeon_device *rdev, int crtc, u64 crtc_base);
extern void evergreen_post_page_flip(struct radeon_device *rdev, int crtc);
extern void dce4_wait_for_vblank(struct radeon_device *rdev, int crtc);
void evergreen_disable_interrupt_state(struct radeon_device *rdev);
int evergreen_blit_init(struct radeon_device *rdev);

Expand Down
2 changes: 2 additions & 0 deletions trunk/drivers/gpu/drm/radeon/radeon_reg.h
Original file line number Diff line number Diff line change
Expand Up @@ -539,9 +539,11 @@

#define RADEON_CRTC2_PITCH 0x032c
#define RADEON_CRTC_STATUS 0x005c
# define RADEON_CRTC_VBLANK_CUR (1 << 0)
# define RADEON_CRTC_VBLANK_SAVE (1 << 1)
# define RADEON_CRTC_VBLANK_SAVE_CLEAR (1 << 1)
#define RADEON_CRTC2_STATUS 0x03fc
# define RADEON_CRTC2_VBLANK_CUR (1 << 0)
# define RADEON_CRTC2_VBLANK_SAVE (1 << 1)
# define RADEON_CRTC2_VBLANK_SAVE_CLEAR (1 << 1)
#define RADEON_CRTC_V_SYNC_STRT_WID 0x020c
Expand Down
19 changes: 19 additions & 0 deletions trunk/drivers/gpu/drm/radeon/rs600.c
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,25 @@
void rs600_gpu_init(struct radeon_device *rdev);
int rs600_mc_wait_for_idle(struct radeon_device *rdev);

void avivo_wait_for_vblank(struct radeon_device *rdev, int crtc)
{
struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc];
int i;

if (RREG32(AVIVO_D1CRTC_CONTROL + radeon_crtc->crtc_offset) & AVIVO_CRTC_EN) {
for (i = 0; i < rdev->usec_timeout; i++) {
if (!(RREG32(AVIVO_D1CRTC_STATUS + radeon_crtc->crtc_offset) & AVIVO_D1CRTC_V_BLANK))
break;
udelay(1);
}
for (i = 0; i < rdev->usec_timeout; i++) {
if (RREG32(AVIVO_D1CRTC_STATUS + radeon_crtc->crtc_offset) & AVIVO_D1CRTC_V_BLANK)
break;
udelay(1);
}
}
}

void rs600_pre_page_flip(struct radeon_device *rdev, int crtc)
{
/* enable the pflip int */
Expand Down

0 comments on commit 37124a6

Please sign in to comment.