提交 ce580fab 编写于 作者: A Andi Kleen 提交者: Dave Airlie

drm/radeon: Move more code out of line

With this patch I'm only about 50k larger with DRM debugging
enables (why is that enabled by default?!?), and slightly
smaller without.

[airlied: moved r100.c additions to radeon_ring.c]
Signed-off-by: NAndi Kleen <ak@linux.intel.com>
Signed-off-by: NDave Airlie <airlied@redhat.com>
上级 cbdd4501
...@@ -791,7 +791,7 @@ static __inline__ int r300_emit_packet3(drm_radeon_private_t *dev_priv, ...@@ -791,7 +791,7 @@ static __inline__ int r300_emit_packet3(drm_radeon_private_t *dev_priv,
/** /**
* Emit the sequence to pacify R300. * Emit the sequence to pacify R300.
*/ */
static __inline__ void r300_pacify(drm_radeon_private_t *dev_priv) static void r300_pacify(drm_radeon_private_t *dev_priv)
{ {
uint32_t cache_z, cache_3d, cache_2d; uint32_t cache_z, cache_3d, cache_2d;
RING_LOCALS; RING_LOCALS;
......
...@@ -3138,7 +3138,7 @@ int r600_irq_set(struct radeon_device *rdev) ...@@ -3138,7 +3138,7 @@ int r600_irq_set(struct radeon_device *rdev)
return 0; return 0;
} }
static inline void r600_irq_ack(struct radeon_device *rdev) static void r600_irq_ack(struct radeon_device *rdev)
{ {
u32 tmp; u32 tmp;
...@@ -3239,7 +3239,7 @@ void r600_irq_disable(struct radeon_device *rdev) ...@@ -3239,7 +3239,7 @@ void r600_irq_disable(struct radeon_device *rdev)
r600_disable_interrupt_state(rdev); r600_disable_interrupt_state(rdev);
} }
static inline u32 r600_get_ih_wptr(struct radeon_device *rdev) static u32 r600_get_ih_wptr(struct radeon_device *rdev)
{ {
u32 wptr, tmp; u32 wptr, tmp;
......
...@@ -450,7 +450,7 @@ set_default_state(struct radeon_device *rdev) ...@@ -450,7 +450,7 @@ set_default_state(struct radeon_device *rdev)
radeon_ring_write(rdev, sq_stack_resource_mgmt_2); radeon_ring_write(rdev, sq_stack_resource_mgmt_2);
} }
static inline uint32_t i2f(uint32_t input) static uint32_t i2f(uint32_t input)
{ {
u32 result, i, exponent, fraction; u32 result, i, exponent, fraction;
......
...@@ -600,32 +600,7 @@ struct radeon_cs_parser { ...@@ -600,32 +600,7 @@ struct radeon_cs_parser {
extern int radeon_cs_update_pages(struct radeon_cs_parser *p, int pg_idx); extern int radeon_cs_update_pages(struct radeon_cs_parser *p, int pg_idx);
extern int radeon_cs_finish_pages(struct radeon_cs_parser *p); extern int radeon_cs_finish_pages(struct radeon_cs_parser *p);
extern u32 radeon_get_ib_value(struct radeon_cs_parser *p, int idx);
static inline u32 radeon_get_ib_value(struct radeon_cs_parser *p, int idx)
{
struct radeon_cs_chunk *ibc = &p->chunks[p->chunk_ib_idx];
u32 pg_idx, pg_offset;
u32 idx_value = 0;
int new_page;
pg_idx = (idx * 4) / PAGE_SIZE;
pg_offset = (idx * 4) % PAGE_SIZE;
if (ibc->kpage_idx[0] == pg_idx)
return ibc->kpage[0][pg_offset/4];
if (ibc->kpage_idx[1] == pg_idx)
return ibc->kpage[1][pg_offset/4];
new_page = radeon_cs_update_pages(p, pg_idx);
if (new_page < 0) {
p->parser_error = new_page;
return 0;
}
idx_value = ibc->kpage[new_page][pg_offset/4];
return idx_value;
}
struct radeon_cs_packet { struct radeon_cs_packet {
unsigned idx; unsigned idx;
...@@ -1414,19 +1389,19 @@ void radeon_atombios_fini(struct radeon_device *rdev); ...@@ -1414,19 +1389,19 @@ void radeon_atombios_fini(struct radeon_device *rdev);
/* /*
* RING helpers. * RING helpers.
*/ */
#if DRM_DEBUG_CODE == 0
static inline void radeon_ring_write(struct radeon_device *rdev, uint32_t v) static inline void radeon_ring_write(struct radeon_device *rdev, uint32_t v)
{ {
#if DRM_DEBUG_CODE
if (rdev->cp.count_dw <= 0) {
DRM_ERROR("radeon: writting more dword to ring than expected !\n");
}
#endif
rdev->cp.ring[rdev->cp.wptr++] = v; rdev->cp.ring[rdev->cp.wptr++] = v;
rdev->cp.wptr &= rdev->cp.ptr_mask; rdev->cp.wptr &= rdev->cp.ptr_mask;
rdev->cp.count_dw--; rdev->cp.count_dw--;
rdev->cp.ring_free_dw--; rdev->cp.ring_free_dw--;
} }
#else
/* With debugging this is just too big to inline */
void radeon_ring_write(struct radeon_device *rdev, uint32_t v);
#endif
/* /*
* ASICs macro. * ASICs macro.
......
...@@ -62,7 +62,7 @@ union atom_supported_devices { ...@@ -62,7 +62,7 @@ union atom_supported_devices {
struct _ATOM_SUPPORTED_DEVICES_INFO_2d1 info_2d1; struct _ATOM_SUPPORTED_DEVICES_INFO_2d1 info_2d1;
}; };
static inline struct radeon_i2c_bus_rec radeon_lookup_i2c_gpio(struct radeon_device *rdev, static struct radeon_i2c_bus_rec radeon_lookup_i2c_gpio(struct radeon_device *rdev,
uint8_t id) uint8_t id)
{ {
struct atom_context *ctx = rdev->mode_info.atom_context; struct atom_context *ctx = rdev->mode_info.atom_context;
...@@ -228,7 +228,7 @@ void radeon_atombios_i2c_init(struct radeon_device *rdev) ...@@ -228,7 +228,7 @@ void radeon_atombios_i2c_init(struct radeon_device *rdev)
} }
} }
static inline struct radeon_gpio_rec radeon_lookup_gpio(struct radeon_device *rdev, static struct radeon_gpio_rec radeon_lookup_gpio(struct radeon_device *rdev,
u8 id) u8 id)
{ {
struct atom_context *ctx = rdev->mode_info.atom_context; struct atom_context *ctx = rdev->mode_info.atom_context;
......
...@@ -129,7 +129,7 @@ void radeon_disable_vblank(struct drm_device *dev, int crtc) ...@@ -129,7 +129,7 @@ void radeon_disable_vblank(struct drm_device *dev, int crtc)
} }
} }
static inline u32 radeon_acknowledge_irqs(drm_radeon_private_t *dev_priv, u32 *r500_disp_int) static u32 radeon_acknowledge_irqs(drm_radeon_private_t *dev_priv, u32 *r500_disp_int)
{ {
u32 irqs = RADEON_READ(RADEON_GEN_INT_STATUS); u32 irqs = RADEON_READ(RADEON_GEN_INT_STATUS);
u32 irq_mask = RADEON_SW_INT_TEST; u32 irq_mask = RADEON_SW_INT_TEST;
......
...@@ -864,7 +864,7 @@ void radeon_legacy_tv_adjust_crtc_reg(struct drm_encoder *encoder, ...@@ -864,7 +864,7 @@ void radeon_legacy_tv_adjust_crtc_reg(struct drm_encoder *encoder,
*v_sync_strt_wid = tmp; *v_sync_strt_wid = tmp;
} }
static inline int get_post_div(int value) static int get_post_div(int value)
{ {
int post_div; int post_div;
switch (value) { switch (value) {
......
...@@ -515,3 +515,45 @@ int radeon_bo_fault_reserve_notify(struct ttm_buffer_object *bo) ...@@ -515,3 +515,45 @@ int radeon_bo_fault_reserve_notify(struct ttm_buffer_object *bo)
} }
return 0; return 0;
} }
int radeon_bo_wait(struct radeon_bo *bo, u32 *mem_type, bool no_wait,
enum ttm_buffer_usage usage)
{
int r;
r = ttm_bo_reserve(&bo->tbo, true, no_wait, false, 0);
if (unlikely(r != 0))
return r;
spin_lock(&bo->tbo.bdev->fence_lock);
if (mem_type)
*mem_type = bo->tbo.mem.mem_type;
if (bo->tbo.sync_obj)
r = ttm_bo_wait(&bo->tbo, true, true, no_wait, usage);
spin_unlock(&bo->tbo.bdev->fence_lock);
ttm_bo_unreserve(&bo->tbo);
return r;
}
/**
* radeon_bo_reserve - reserve bo
* @bo: bo structure
* @no_wait: don't sleep while trying to reserve (return -EBUSY)
*
* Returns:
* -EBUSY: buffer is busy and @no_wait is true
* -ERESTARTSYS: A wait for the buffer to become unreserved was interrupted by
* a signal. Release all buffer reservations and return to user-space.
*/
int radeon_bo_reserve(struct radeon_bo *bo, bool no_wait)
{
int r;
r = ttm_bo_reserve(&bo->tbo, true, no_wait, false, 0);
if (unlikely(r != 0)) {
if (r != -ERESTARTSYS)
dev_err(bo->rdev->dev, "%p reserve failed\n", bo);
return r;
}
return 0;
}
...@@ -52,28 +52,7 @@ static inline unsigned radeon_mem_type_to_domain(u32 mem_type) ...@@ -52,28 +52,7 @@ static inline unsigned radeon_mem_type_to_domain(u32 mem_type)
return 0; return 0;
} }
/** int radeon_bo_reserve(struct radeon_bo *bo, bool no_wait);
* radeon_bo_reserve - reserve bo
* @bo: bo structure
* @no_wait: don't sleep while trying to reserve (return -EBUSY)
*
* Returns:
* -EBUSY: buffer is busy and @no_wait is true
* -ERESTARTSYS: A wait for the buffer to become unreserved was interrupted by
* a signal. Release all buffer reservations and return to user-space.
*/
static inline int radeon_bo_reserve(struct radeon_bo *bo, bool no_wait)
{
int r;
r = ttm_bo_reserve(&bo->tbo, true, no_wait, false, 0);
if (unlikely(r != 0)) {
if (r != -ERESTARTSYS)
dev_err(bo->rdev->dev, "%p reserve failed\n", bo);
return r;
}
return 0;
}
static inline void radeon_bo_unreserve(struct radeon_bo *bo) static inline void radeon_bo_unreserve(struct radeon_bo *bo)
{ {
...@@ -118,23 +97,8 @@ static inline u64 radeon_bo_mmap_offset(struct radeon_bo *bo) ...@@ -118,23 +97,8 @@ static inline u64 radeon_bo_mmap_offset(struct radeon_bo *bo)
return bo->tbo.addr_space_offset; return bo->tbo.addr_space_offset;
} }
static inline int radeon_bo_wait(struct radeon_bo *bo, u32 *mem_type, extern int radeon_bo_wait(struct radeon_bo *bo, u32 *mem_type,
bool no_wait, enum ttm_buffer_usage usage) bool no_wait, enum ttm_buffer_usage usage);
{
int r;
r = ttm_bo_reserve(&bo->tbo, true, no_wait, false, 0);
if (unlikely(r != 0))
return r;
spin_lock(&bo->tbo.bdev->fence_lock);
if (mem_type)
*mem_type = bo->tbo.mem.mem_type;
if (bo->tbo.sync_obj)
r = ttm_bo_wait(&bo->tbo, true, true, no_wait, usage);
spin_unlock(&bo->tbo.bdev->fence_lock);
ttm_bo_unreserve(&bo->tbo);
return r;
}
extern int radeon_bo_create(struct radeon_device *rdev, extern int radeon_bo_create(struct radeon_device *rdev,
unsigned long size, int byte_align, unsigned long size, int byte_align,
......
...@@ -35,6 +35,44 @@ ...@@ -35,6 +35,44 @@
int radeon_debugfs_ib_init(struct radeon_device *rdev); int radeon_debugfs_ib_init(struct radeon_device *rdev);
u32 radeon_get_ib_value(struct radeon_cs_parser *p, int idx)
{
struct radeon_cs_chunk *ibc = &p->chunks[p->chunk_ib_idx];
u32 pg_idx, pg_offset;
u32 idx_value = 0;
int new_page;
pg_idx = (idx * 4) / PAGE_SIZE;
pg_offset = (idx * 4) % PAGE_SIZE;
if (ibc->kpage_idx[0] == pg_idx)
return ibc->kpage[0][pg_offset/4];
if (ibc->kpage_idx[1] == pg_idx)
return ibc->kpage[1][pg_offset/4];
new_page = radeon_cs_update_pages(p, pg_idx);
if (new_page < 0) {
p->parser_error = new_page;
return 0;
}
idx_value = ibc->kpage[new_page][pg_offset/4];
return idx_value;
}
void radeon_ring_write(struct radeon_device *rdev, uint32_t v)
{
#if DRM_DEBUG_CODE
if (rdev->cp.count_dw <= 0) {
DRM_ERROR("radeon: writting more dword to ring than expected !\n");
}
#endif
rdev->cp.ring[rdev->cp.wptr++] = v;
rdev->cp.wptr &= rdev->cp.ptr_mask;
rdev->cp.count_dw--;
rdev->cp.ring_free_dw--;
}
void radeon_ib_bogus_cleanup(struct radeon_device *rdev) void radeon_ib_bogus_cleanup(struct radeon_device *rdev)
{ {
struct radeon_ib *ib, *n; struct radeon_ib *ib, *n;
......
...@@ -272,12 +272,12 @@ static __inline__ int radeon_check_and_fixup_packets(drm_radeon_private_t * ...@@ -272,12 +272,12 @@ static __inline__ int radeon_check_and_fixup_packets(drm_radeon_private_t *
return 0; return 0;
} }
static __inline__ int radeon_check_and_fixup_packet3(drm_radeon_private_t * static int radeon_check_and_fixup_packet3(drm_radeon_private_t *
dev_priv, dev_priv,
struct drm_file *file_priv, struct drm_file *file_priv,
drm_radeon_kcmd_buffer_t * drm_radeon_kcmd_buffer_t *
cmdbuf, cmdbuf,
unsigned int *cmdsz) unsigned int *cmdsz)
{ {
u32 *cmd = drm_buffer_pointer_to_dword(cmdbuf->buffer, 0); u32 *cmd = drm_buffer_pointer_to_dword(cmdbuf->buffer, 0);
u32 offset, narrays; u32 offset, narrays;
...@@ -446,8 +446,8 @@ static __inline__ int radeon_check_and_fixup_packet3(drm_radeon_private_t * ...@@ -446,8 +446,8 @@ static __inline__ int radeon_check_and_fixup_packet3(drm_radeon_private_t *
* CP hardware state programming functions * CP hardware state programming functions
*/ */
static __inline__ void radeon_emit_clip_rect(drm_radeon_private_t * dev_priv, static void radeon_emit_clip_rect(drm_radeon_private_t * dev_priv,
struct drm_clip_rect * box) struct drm_clip_rect * box)
{ {
RING_LOCALS; RING_LOCALS;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册