Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 4370 → Rev 4371

/drivers/video/drm/i915/Makefile.lto
75,10 → 75,12
intel_sprite.c \
intel_uncore.c \
kms_display.c \
kos_gem_fb.c \
utils.c \
../hdmi.c \
Gtt/intel-agp.c \
Gtt/intel-gtt.c \
../drm_cache.c \
../drm_global.c \
../drm_drv.c \
../drm_vma_manager.c \
/drivers/video/drm/i915/i915_gem.c
682,7 → 682,7
if ((page_offset + remain) > PAGE_SIZE)
page_length = PAGE_SIZE - page_offset;
 
MapPage(vaddr, page_base, PG_SW|PG_NOCACHE);
MapPage(vaddr, dev_priv->gtt.mappable_base+page_base, PG_SW|PG_NOCACHE);
 
memcpy(vaddr+page_offset, user_data, page_length);
 
716,7 → 716,7
if (unlikely(page_do_bit17_swizzling))
return -EINVAL;
 
vaddr = (char *)MapIoMem((addr_t)page, 4096, PG_SW);
vaddr = (char *)MapIoMem((addr_t)page, 4096, PG_SW|PG_NOCACHE);
if (needs_clflush_before)
drm_clflush_virt_range(vaddr + shmem_page_offset,
page_length);
/drivers/video/drm/i915/i915_gem_execbuffer.c
37,7 → 37,6
#define I915_EXEC_IS_PINNED (1<<10)
#define I915_EXEC_VEBOX (4<<0)
 
#define wmb() asm volatile ("sfence")
 
struct drm_i915_gem_object *get_fb_obj();
 
206,6 → 205,56
}
 
static int
relocate_entry_cpu(struct drm_i915_gem_object *obj,
struct drm_i915_gem_relocation_entry *reloc)
{
uint32_t page_offset = offset_in_page(reloc->offset);
char *vaddr;
int ret = -EINVAL;
 
ret = i915_gem_object_set_to_cpu_domain(obj, 1);
if (ret)
return ret;
 
vaddr = (char *)MapIoMem((addr_t)i915_gem_object_get_page(obj,
reloc->offset >> PAGE_SHIFT), 4096, 3);
*(uint32_t *)(vaddr + page_offset) = reloc->delta;
FreeKernelSpace(vaddr);
 
return 0;
}
 
static int
relocate_entry_gtt(struct drm_i915_gem_object *obj,
struct drm_i915_gem_relocation_entry *reloc)
{
struct drm_device *dev = obj->base.dev;
struct drm_i915_private *dev_priv = dev->dev_private;
uint32_t __iomem *reloc_entry;
void __iomem *reloc_page;
int ret = -EINVAL;
 
ret = i915_gem_object_set_to_gtt_domain(obj, true);
if (ret)
return ret;
 
ret = i915_gem_object_put_fence(obj);
if (ret)
return ret;
 
/* Map the page containing the relocation we're going to perform. */
reloc->offset += i915_gem_obj_ggtt_offset(obj);
reloc_page = (void*)MapIoMem(dev_priv->gtt.mappable_base +
(reloc->offset & PAGE_MASK), 4096, 0x18|3);
reloc_entry = (uint32_t __iomem *)
(reloc_page + offset_in_page(reloc->offset));
iowrite32(reloc->delta, reloc_entry);
FreeKernelSpace(reloc_page);
 
return 0;
}
 
static int
i915_gem_execbuffer_relocate_entry(struct drm_i915_gem_object *obj,
struct eb_objects *eb,
struct drm_i915_gem_relocation_entry *reloc,
287,40 → 336,14
/* We can't wait for rendering with pagefaults disabled */
 
reloc->delta += target_offset;
if (use_cpu_reloc(obj)) {
uint32_t page_offset = reloc->offset & ~PAGE_MASK;
char *vaddr;
if (use_cpu_reloc(obj))
ret = relocate_entry_cpu(obj, reloc);
else
ret = relocate_entry_gtt(obj, reloc);
 
ret = i915_gem_object_set_to_cpu_domain(obj, 1);
if (ret)
return ret;
 
vaddr = (char *)MapIoMem((addr_t)i915_gem_object_get_page(obj,
reloc->offset >> PAGE_SHIFT), 4096, 3);
*(uint32_t *)(vaddr + page_offset) = reloc->delta;
FreeKernelSpace(vaddr);
} else {
struct drm_i915_private *dev_priv = dev->dev_private;
uint32_t __iomem *reloc_entry;
void __iomem *reloc_page;
 
ret = i915_gem_object_set_to_gtt_domain(obj, true);
if (ret)
return ret;
 
ret = i915_gem_object_put_fence(obj);
if (ret)
return ret;
 
/* Map the page containing the relocation we're going to perform. */
reloc->offset += i915_gem_obj_ggtt_offset(obj);
reloc_page = (void*)MapIoMem(reloc->offset & PAGE_MASK, 4096, 3);
reloc_entry = (uint32_t __iomem *)
(reloc_page + (reloc->offset & ~PAGE_MASK));
iowrite32(reloc->delta, reloc_entry);
FreeKernelSpace(reloc_page);
}
 
/* and update the user's relocation entry */
reloc->presumed_offset = target_offset;
 
/drivers/video/drm/i915/i915_trace.h
18,7 → 18,7
#define trace_i915_gem_request_wait_end(a, b)
#define trace_i915_gem_request_complete(a, b)
#define trace_intel_gpu_freq_change(a)
#define trace_i915_reg_rw(a, b, c, d)
#define trace_i915_reg_rw(a, b, c, d, e)
#define trace_i915_ring_wait_begin(a)
#define trace_i915_gem_object_pwrite(a, b, c)
#define trace_i915_gem_request_add(a, b)
26,6 → 26,5
#define trace_i915_vma_bind(a, b)
#define trace_i915_vma_unbind(a)
#define trace_i915_gem_object_clflush(a)
#define trace_i915_reg_rw(a, b, c, d, e)
 
#endif
/drivers/video/drm/i915/intel_ddi.c
1285,7 → 1285,27
default:
break;
}
 
if (encoder->type == INTEL_OUTPUT_EDP && dev_priv->vbt.edp_bpp &&
pipe_config->pipe_bpp > dev_priv->vbt.edp_bpp) {
/*
* This is a big fat ugly hack.
*
* Some machines in UEFI boot mode provide us a VBT that has 18
* bpp and 1.62 GHz link bandwidth for eDP, which for reasons
* unknown we fail to light up. Yet the same BIOS boots up with
* 24 bpp and 2.7 GHz link. Use the same bpp as the BIOS uses as
* max, not what it tells us to use.
*
* Note: This will still be broken if the eDP panel is not lit
* up by the BIOS, and thus we can't get the mode at module
* load.
*/
DRM_DEBUG_KMS("pipe has %d bpp for eDP panel, overriding BIOS-provided max %d bpp\n",
pipe_config->pipe_bpp, dev_priv->vbt.edp_bpp);
dev_priv->vbt.edp_bpp = pipe_config->pipe_bpp;
}
}
 
static void intel_ddi_destroy(struct drm_encoder *encoder)
{
/drivers/video/drm/i915/intel_display.c
6783,7 → 6783,9
intel_crtc->cursor_visible = visible;
}
/* and commit changes on next vblank */
POSTING_READ(CURCNTR(pipe));
I915_WRITE(CURBASE(pipe), base);
POSTING_READ(CURBASE(pipe));
}
 
static void ivb_update_cursor(struct drm_crtc *crtc, u32 base)
6812,7 → 6814,9
intel_crtc->cursor_visible = visible;
}
/* and commit changes on next vblank */
POSTING_READ(CURCNTR_IVB(pipe));
I915_WRITE(CURBASE_IVB(pipe), base);
POSTING_READ(CURBASE_IVB(pipe));
}
 
/* If no-part of the cursor is visible on the framebuffer, then the GPU may hang... */
/drivers/video/drm/i915/intel_ringbuffer.c
1247,8 → 1247,8
}
 
obj = NULL;
// if (!HAS_LLC(dev))
// obj = i915_gem_object_create_stolen(dev, ring->size);
if (!HAS_LLC(dev))
obj = i915_gem_object_create_stolen(dev, ring->size);
if (obj == NULL)
obj = i915_gem_alloc_object(dev, ring->size);
if (obj == NULL) {
/drivers/video/drm/i915/intel_uncore.c
204,6 → 204,19
gen6_gt_check_fifodbg(dev_priv);
}
 
static void intel_uncore_forcewake_reset(struct drm_device *dev)
{
struct drm_i915_private *dev_priv = dev->dev_private;
 
if (IS_VALLEYVIEW(dev)) {
vlv_force_wake_reset(dev_priv);
} else if (INTEL_INFO(dev)->gen >= 6) {
__gen6_gt_force_wake_reset(dev_priv);
if (IS_IVYBRIDGE(dev) || IS_HASWELL(dev))
__gen6_gt_force_wake_mt_reset(dev_priv);
}
}
 
void intel_uncore_early_sanitize(struct drm_device *dev)
{
struct drm_i915_private *dev_priv = dev->dev_private;
259,20 → 272,9
dev_priv->uncore.funcs.force_wake_put =
__gen6_gt_force_wake_put;
}
}
 
static void intel_uncore_forcewake_reset(struct drm_device *dev)
{
struct drm_i915_private *dev_priv = dev->dev_private;
 
if (IS_VALLEYVIEW(dev)) {
vlv_force_wake_reset(dev_priv);
} else if (INTEL_INFO(dev)->gen >= 6) {
__gen6_gt_force_wake_reset(dev_priv);
if (IS_IVYBRIDGE(dev) || IS_HASWELL(dev))
__gen6_gt_force_wake_mt_reset(dev_priv);
intel_uncore_forcewake_reset(dev);
}
}
 
void intel_uncore_sanitize(struct drm_device *dev)
{
/drivers/video/drm/i915/kms_display.c
108,8 → 108,8
struct drm_encoder *encoder;
struct drm_i915_gem_object *fb_obj;
struct drm_mode_set set;
char *con_name;
char *enc_name;
const char *con_name;
const char *enc_name;
unsigned hdisplay, vdisplay;
int ret;
 
263,56 → 263,39
return def_connector;
};
 
 
int init_display_kms(struct drm_device *dev, videomode_t *usermode)
struct drm_connector *get_active_connector(struct drm_device *dev)
{
struct drm_connector *connector;
struct drm_connector *tmp = NULL;
struct drm_connector_helper_funcs *connector_funcs;
struct drm_encoder *encoder;
struct drm_crtc *crtc = NULL;
struct drm_framebuffer *fb;
 
cursor_t *cursor;
u32_t ifl;
int err;
 
ENTER();
 
mutex_lock(&dev->mode_config.mutex);
 
list_for_each_entry(connector, &dev->mode_config.connector_list, head)
list_for_each_entry(tmp, &dev->mode_config.connector_list, head)
{
if( connector->status != connector_status_connected)
if( tmp->status != connector_status_connected)
continue;
 
connector_funcs = connector->helper_private;
encoder = connector_funcs->best_encoder(connector);
connector_funcs = tmp->helper_private;
encoder = connector_funcs->best_encoder(tmp);
if( encoder == NULL)
{
DRM_DEBUG_KMS("CONNECTOR %x ID: %d no active encoders\n",
connector, connector->base.id);
tmp, tmp->base.id);
continue;
}
connector->encoder = encoder;
crtc = encoder->crtc;
};
 
tmp->encoder = encoder;
 
DRM_DEBUG_KMS("CONNECTOR %p ID:%d status:%d ENCODER %x CRTC %p ID:%d\n",
connector, connector->base.id,
connector->status, connector->encoder,
crtc, crtc->base.id );
break;
};
tmp, tmp->base.id, tmp->status, tmp->encoder,
tmp->encoder->crtc, tmp->encoder->crtc->base.id );
 
if(connector == NULL)
{
DRM_DEBUG_KMS("No active connectors!\n");
mutex_unlock(&dev->mode_config.mutex);
return -1;
return tmp;
};
 
dbgprintf("CRTC %p\n", crtc);
return NULL;
}
 
if(crtc == NULL)
struct drm_crtc *get_possible_crtc(struct drm_device *dev, struct drm_encoder *encoder)
{
struct drm_crtc *tmp_crtc;
int crtc_mask = 1;
319,18 → 302,70
 
list_for_each_entry(tmp_crtc, &dev->mode_config.crtc_list, head)
{
dbgprintf("tmp_crtc %p\n", tmp_crtc);
if (encoder->possible_crtcs & crtc_mask)
{
crtc = tmp_crtc;
encoder->crtc = crtc;
dbgprintf("CRTC %p\n", crtc);
break;
encoder->crtc = tmp_crtc;
dbgprintf("CRTC %p\n", tmp_crtc);
return tmp_crtc;
};
crtc_mask <<= 1;
};
return NULL;
};
 
int get_boot_mode(struct drm_connector *connector, videomode_t *usermode)
{
struct drm_display_mode *mode;
 
list_for_each_entry(mode, &connector->modes, head)
{
dbgprintf("check mode w:%d h:%d %dHz\n",
drm_mode_width(mode), drm_mode_height(mode),
drm_mode_vrefresh(mode));
 
if( os_display->width == drm_mode_width(mode) &&
os_display->height == drm_mode_height(mode) &&
drm_mode_vrefresh(mode) == 60)
{
usermode->width = os_display->width;
usermode->height = os_display->height;
usermode->freq = 60;
return 1;
}
}
return 0;
}
 
int init_display_kms(struct drm_device *dev, videomode_t *usermode)
{
struct drm_connector *connector;
struct drm_connector_helper_funcs *connector_funcs;
struct drm_encoder *encoder;
struct drm_crtc *crtc;
struct drm_framebuffer *fb;
 
cursor_t *cursor;
u32_t ifl;
int err;
 
ENTER();
 
mutex_lock(&dev->mode_config.mutex);
 
connector = get_active_connector(dev) ;
if(connector == NULL)
{
DRM_DEBUG_KMS("No active connectors!\n");
mutex_unlock(&dev->mode_config.mutex);
return -1;
};
 
encoder = connector->encoder;
crtc = encoder->crtc;
 
if(crtc == NULL)
crtc = get_possible_crtc(dev, encoder);
 
dbgprintf("CRTC %p\n", crtc);
 
if(crtc == NULL)
377,31 → 412,11
if( (usermode->width == 0) ||
(usermode->height == 0))
{
if( !get_boot_mode(connector, usermode))
{
struct drm_display_mode *mode;
 
list_for_each_entry(mode, &connector->modes, head)
{
dbgprintf("check mode w:%d h:%d %dHz\n",
drm_mode_width(mode), drm_mode_height(mode),
drm_mode_vrefresh(mode));
 
if( os_display->width == drm_mode_width(mode) &&
os_display->height == drm_mode_height(mode) &&
drm_mode_vrefresh(mode) == 60)
{
usermode->width = os_display->width;
usermode->height = os_display->height;
usermode->freq = 60;
break;
 
}
}
 
if( usermode->width == 0 ||
usermode->height == 0)
{
mode = list_entry(connector->modes.next, typeof(*mode), head);
 
usermode->width = drm_mode_width(mode);
usermode->height = drm_mode_height(mode);
usermode->freq = drm_mode_vrefresh(mode);
483,7 → 498,7
 
void i915_dpms(struct drm_device *dev, int mode)
{
struct drm_connector_funcs *f = os_display->connector->funcs;
const struct drm_connector_funcs *f = os_display->connector->funcs;
 
f->dpms(os_display->connector, mode);
};
684,24 → 699,20
return old;
};
 
struct sna_fb
int i915_fbinfo(struct drm_i915_fb_info *fb)
{
uint32_t width;
uint32_t height;
uint32_t pitch;
uint32_t tiling;
};
struct drm_i915_gem_object *obj = get_fb_obj();
 
int i915_fbinfo(struct sna_fb *fb)
{
fb->name = obj->base.name;
fb->width = os_display->width;
fb->height = os_display->height;
fb->pitch = os_display->pitch;
fb->tiling = 0;
fb->pitch = obj->stride;
fb->tiling = obj->tiling_mode;
 
return 0;
};
}
 
 
typedef struct
{
int left;
710,14 → 721,6
int bottom;
}rect_t;
 
struct drm_i915_mask {
__u32 handle;
__u32 width;
__u32 height;
__u32 bo_size;
__u32 bo_pitch;
__u32 bo_map;
};
 
#define CURRENT_TASK (0x80003000)
 
740,7 → 743,7
static unsigned int mask_seqno[256];
rect_t winrc;
u32 slot;
int ret;
int ret=0;
 
if(mask->handle == -2)
{
788,13 → 791,13
 
ret = i915_mutex_lock_interruptible(dev);
if (ret)
return ret;
goto err1;
 
ret = i915_gem_object_set_to_cpu_domain(to_intel_bo(obj), true);
if(ret !=0 )
{
dbgprintf("%s fail\n", __FUNCTION__);
return ret;
dbgprintf("%s: i915_gem_object_set_to_cpu_domain failed\n", __FUNCTION__);
goto err2;
};
 
// printf("width %d height %d\n", winrc.right, winrc.bottom);
886,13 → 889,20
};
};
safe_sti(ifl);
 
ret = i915_gem_object_set_to_gtt_domain(to_intel_bo(obj), false);
if(ret != 0 )
{
dbgprintf("%s: i915_gem_object_set_to_gtt_domain failed\n", __FUNCTION__);
};
}
 
err2:
mutex_unlock(&dev->struct_mutex);
err1:
drm_gem_object_unreference(obj);
 
mutex_unlock(&dev->struct_mutex);
 
return 0;
return ret;
}
 
 
/drivers/video/drm/i915/kos_gem_fb.c
187,8 → 187,30
list_add_tail(&obj->global_list, &dev_priv->mm.bound_list);
list_add_tail(&vma->mm_list, &ggtt->inactive_list);
 
mutex_lock(&dev->object_name_lock);
idr_preload(GFP_KERNEL);
 
if (!obj->base.name) {
ret = idr_alloc(&dev->object_name_idr, &obj->base, 1, 0, GFP_NOWAIT);
if (ret < 0)
goto err_gem;
 
obj->base.name = ret;
 
/* Allocate a reference for the name table. */
drm_gem_object_reference(&obj->base);
 
printf("%s allocate fb name %d\n", __FUNCTION__, obj->base.name );
}
 
idr_preload_end();
mutex_unlock(&dev->object_name_lock);
drm_gem_object_unreference(&obj->base);
return obj;
 
err_gem:
idr_preload_end();
mutex_unlock(&dev->object_name_lock);
err_vma:
i915_gem_vma_destroy(vma);
err_out: