Commit d6c86257 authored by Jani Nikula's avatar Jani Nikula
Browse files

drm/{i915, xe}/stolen: move stolen memory handling to display parent interface



Call the stolen memory interface through the display parent interface.

This makes xe compat gem/i915_gem_stolen.h redundant, and it can be
removed.

v2: Rebase, convert one more call that appeared

Reviewed-by: default avatarVinod Govindapillai <vinod.govindapillai@intel.com>
Link: https://patch.msgid.link/350c82c49fe40f6319d14d309180e2e2752145ac.1764930576.git.jani.nikula@intel.com


Signed-off-by: default avatarJani Nikula <jani.nikula@intel.com>
parent 2397a4c6
Loading
Loading
Loading
Loading
+36 −35
Original line number Diff line number Diff line
@@ -45,8 +45,6 @@
#include <drm/drm_fourcc.h>
#include <drm/drm_print.h>

#include "gem/i915_gem_stolen.h"

#include "i915_vma.h"
#include "i9xx_plane_regs.h"
#include "intel_de.h"
@@ -393,17 +391,17 @@ static void i8xx_fbc_program_cfb(struct intel_fbc *fbc)
	struct intel_display *display = fbc->display;

	drm_WARN_ON(display->drm,
		    range_end_overflows_t(u64, i915_gem_stolen_area_address(display->drm),
					  i915_gem_stolen_node_offset(fbc->compressed_fb),
		    range_end_overflows_t(u64, intel_parent_stolen_area_address(display),
					  intel_parent_stolen_node_offset(display, fbc->compressed_fb),
					  U32_MAX));
	drm_WARN_ON(display->drm,
		    range_end_overflows_t(u64, i915_gem_stolen_area_address(display->drm),
					  i915_gem_stolen_node_offset(fbc->compressed_llb),
		    range_end_overflows_t(u64, intel_parent_stolen_area_address(display),
					  intel_parent_stolen_node_offset(display, fbc->compressed_llb),
					  U32_MAX));
	intel_de_write(display, FBC_CFB_BASE,
		       i915_gem_stolen_node_address(fbc->compressed_fb));
		       intel_parent_stolen_node_address(display, fbc->compressed_fb));
	intel_de_write(display, FBC_LL_BASE,
		       i915_gem_stolen_node_address(fbc->compressed_llb));
		       intel_parent_stolen_node_address(display, fbc->compressed_llb));
}

static const struct intel_fbc_funcs i8xx_fbc_funcs = {
@@ -511,7 +509,7 @@ static void g4x_fbc_program_cfb(struct intel_fbc *fbc)
	struct intel_display *display = fbc->display;

	intel_de_write(display, DPFC_CB_BASE,
		       i915_gem_stolen_node_offset(fbc->compressed_fb));
		       intel_parent_stolen_node_offset(display, fbc->compressed_fb));
}

static const struct intel_fbc_funcs g4x_fbc_funcs = {
@@ -580,7 +578,7 @@ static void ilk_fbc_program_cfb(struct intel_fbc *fbc)
	struct intel_display *display = fbc->display;

	intel_de_write(display, ILK_DPFC_CB_BASE(fbc->id),
		       i915_gem_stolen_node_offset(fbc->compressed_fb));
		       intel_parent_stolen_node_offset(display, fbc->compressed_fb));
}

static const struct intel_fbc_funcs ilk_fbc_funcs = {
@@ -819,7 +817,7 @@ static u64 intel_fbc_stolen_end(struct intel_display *display)
	 * underruns, even if that range is not reserved by the BIOS. */
	if (display->platform.broadwell ||
	    (DISPLAY_VER(display) == 9 && !display->platform.broxton))
		end = i915_gem_stolen_area_size(display->drm) - 8 * 1024 * 1024;
		end = intel_parent_stolen_area_size(display) - 8 * 1024 * 1024;
	else
		end = U64_MAX;

@@ -854,13 +852,13 @@ static int find_compression_limit(struct intel_fbc *fbc,
	size /= limit;

	/* Try to over-allocate to reduce reallocations and fragmentation. */
	ret = i915_gem_stolen_insert_node_in_range(fbc->compressed_fb,
	ret = intel_parent_stolen_insert_node_in_range(display, fbc->compressed_fb,
						       size <<= 1, 4096, 0, end);
	if (ret == 0)
		return limit;

	for (; limit <= intel_fbc_max_limit(display); limit <<= 1) {
		ret = i915_gem_stolen_insert_node_in_range(fbc->compressed_fb,
		ret = intel_parent_stolen_insert_node_in_range(display, fbc->compressed_fb,
							       size >>= 1, 4096, 0, end);
		if (ret == 0)
			return limit;
@@ -876,12 +874,12 @@ static int intel_fbc_alloc_cfb(struct intel_fbc *fbc,
	int ret;

	drm_WARN_ON(display->drm,
		    i915_gem_stolen_node_allocated(fbc->compressed_fb));
		    intel_parent_stolen_node_allocated(display, fbc->compressed_fb));
	drm_WARN_ON(display->drm,
		    i915_gem_stolen_node_allocated(fbc->compressed_llb));
		    intel_parent_stolen_node_allocated(display, fbc->compressed_llb));

	if (DISPLAY_VER(display) < 5 && !display->platform.g4x) {
		ret = i915_gem_stolen_insert_node(fbc->compressed_llb, 4096, 4096);
		ret = intel_parent_stolen_insert_node(display, fbc->compressed_llb, 4096, 4096);
		if (ret)
			goto err;
	}
@@ -897,14 +895,14 @@ static int intel_fbc_alloc_cfb(struct intel_fbc *fbc,

	drm_dbg_kms(display->drm,
		    "reserved %llu bytes of contiguous stolen space for FBC, limit: %d\n",
		    i915_gem_stolen_node_size(fbc->compressed_fb), fbc->limit);
		    intel_parent_stolen_node_size(display, fbc->compressed_fb), fbc->limit);
	return 0;

err_llb:
	if (i915_gem_stolen_node_allocated(fbc->compressed_llb))
		i915_gem_stolen_remove_node(fbc->compressed_llb);
	if (intel_parent_stolen_node_allocated(display, fbc->compressed_llb))
		intel_parent_stolen_remove_node(display, fbc->compressed_llb);
err:
	if (i915_gem_stolen_initialized(display->drm))
	if (intel_parent_stolen_initialized(display))
		drm_info_once(display->drm,
			      "not enough stolen space for compressed buffer (need %d more bytes), disabling. Hint: you may be able to increase stolen memory size in the BIOS to avoid this.\n", size);
	return -ENOSPC;
@@ -1010,7 +1008,7 @@ static void fbc_sys_cache_enable(const struct intel_fbc *fbc)

	range = fbc_sys_cache_limit(display) / (64 * 1024);

	offset = i915_gem_stolen_node_offset(fbc->compressed_fb) / (4 * 1024);
	offset = intel_parent_stolen_node_offset(display, fbc->compressed_fb) / (4 * 1024);

	cfg = FBC_SYS_CACHE_TAG_USE_RES_SPACE | FBC_SYS_CACHEABLE_RANGE(range) |
	      FBC_SYS_CACHE_START_BASE(offset);
@@ -1024,13 +1022,15 @@ static void fbc_sys_cache_enable(const struct intel_fbc *fbc)

static void __intel_fbc_cleanup_cfb(struct intel_fbc *fbc)
{
	struct intel_display *display = fbc->display;

	if (WARN_ON(intel_fbc_hw_is_active(fbc)))
		return;

	if (i915_gem_stolen_node_allocated(fbc->compressed_llb))
		i915_gem_stolen_remove_node(fbc->compressed_llb);
	if (i915_gem_stolen_node_allocated(fbc->compressed_fb))
		i915_gem_stolen_remove_node(fbc->compressed_fb);
	if (intel_parent_stolen_node_allocated(display, fbc->compressed_llb))
		intel_parent_stolen_remove_node(display, fbc->compressed_llb);
	if (intel_parent_stolen_node_allocated(display, fbc->compressed_fb))
		intel_parent_stolen_remove_node(display, fbc->compressed_fb);
}

void intel_fbc_cleanup(struct intel_display *display)
@@ -1043,8 +1043,8 @@ void intel_fbc_cleanup(struct intel_display *display)
		__intel_fbc_cleanup_cfb(fbc);
		mutex_unlock(&fbc->lock);

		i915_gem_stolen_node_free(fbc->compressed_fb);
		i915_gem_stolen_node_free(fbc->compressed_llb);
		intel_parent_stolen_node_free(display, fbc->compressed_fb);
		intel_parent_stolen_node_free(display, fbc->compressed_llb);

		kfree(fbc);
	}
@@ -1480,12 +1480,13 @@ static bool intel_fbc_is_fence_ok(const struct intel_plane_state *plane_state)

static bool intel_fbc_is_cfb_ok(const struct intel_plane_state *plane_state)
{
	struct intel_display *display = to_intel_display(plane_state);
	struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane);
	struct intel_fbc *fbc = plane->fbc;

	return intel_fbc_min_limit(plane_state) <= fbc->limit &&
		intel_fbc_cfb_size(plane_state) <= fbc->limit *
			i915_gem_stolen_node_size(fbc->compressed_fb);
			intel_parent_stolen_node_size(display, fbc->compressed_fb);
}

static bool intel_fbc_is_ok(const struct intel_plane_state *plane_state)
@@ -1577,7 +1578,7 @@ static int intel_fbc_check_plane(struct intel_atomic_state *state,
	if (!fbc)
		return 0;

	if (!i915_gem_stolen_initialized(display->drm)) {
	if (!intel_parent_stolen_initialized(display)) {
		plane_state->no_fbc_reason = "stolen memory not initialised";
		return 0;
	}
@@ -2282,10 +2283,10 @@ static struct intel_fbc *intel_fbc_create(struct intel_display *display,
	if (!fbc)
		return NULL;

	fbc->compressed_fb = i915_gem_stolen_node_alloc(display->drm);
	fbc->compressed_fb = intel_parent_stolen_node_alloc(display);
	if (!fbc->compressed_fb)
		goto err;
	fbc->compressed_llb = i915_gem_stolen_node_alloc(display->drm);
	fbc->compressed_llb = intel_parent_stolen_node_alloc(display);
	if (!fbc->compressed_llb)
		goto err;

@@ -2310,8 +2311,8 @@ static struct intel_fbc *intel_fbc_create(struct intel_display *display,
	return fbc;

err:
	i915_gem_stolen_node_free(fbc->compressed_llb);
	i915_gem_stolen_node_free(fbc->compressed_fb);
	intel_parent_stolen_node_free(display, fbc->compressed_llb);
	intel_parent_stolen_node_free(display, fbc->compressed_fb);
	kfree(fbc);

	return NULL;
+66 −0
Original line number Diff line number Diff line
@@ -79,6 +79,72 @@ void intel_parent_rps_ilk_irq_handler(struct intel_display *display)
		display->parent->rps->ilk_irq_handler(display->drm);
}

int intel_parent_stolen_insert_node_in_range(struct intel_display *display,
					     struct intel_stolen_node *node, u64 size,
					     unsigned int align, u64 start, u64 end)
{
	return display->parent->stolen->insert_node_in_range(node, size, align, start, end);
}

int intel_parent_stolen_insert_node(struct intel_display *display, struct intel_stolen_node *node, u64 size,
				    unsigned int align)
{
	return display->parent->stolen->insert_node(node, size, align);
}

void intel_parent_stolen_remove_node(struct intel_display *display,
				     struct intel_stolen_node *node)
{
	display->parent->stolen->remove_node(node);
}

bool intel_parent_stolen_initialized(struct intel_display *display)
{
	return display->parent->stolen->initialized(display->drm);
}

bool intel_parent_stolen_node_allocated(struct intel_display *display,
					const struct intel_stolen_node *node)
{
	return display->parent->stolen->node_allocated(node);
}

u32 intel_parent_stolen_node_offset(struct intel_display *display, struct intel_stolen_node *node)
{
	return display->parent->stolen->node_offset(node);
}

u64 intel_parent_stolen_area_address(struct intel_display *display)
{
	return display->parent->stolen->area_address(display->drm);
}

u64 intel_parent_stolen_area_size(struct intel_display *display)
{
	return display->parent->stolen->area_size(display->drm);
}

u64 intel_parent_stolen_node_address(struct intel_display *display, struct intel_stolen_node *node)
{
	return display->parent->stolen->node_address(node);
}

u64 intel_parent_stolen_node_size(struct intel_display *display, const struct intel_stolen_node *node)
{
	return display->parent->stolen->node_size(node);
}

struct intel_stolen_node *intel_parent_stolen_node_alloc(struct intel_display *display)
{
	return display->parent->stolen->node_alloc(display->drm);
}

void intel_parent_stolen_node_free(struct intel_display *display, const struct intel_stolen_node *node)
{
	display->parent->stolen->node_free(node);
}


bool intel_parent_vgpu_active(struct intel_display *display)
{
	return display->parent->vgpu_active && display->parent->vgpu_active(display->drm);
+19 −0
Original line number Diff line number Diff line
@@ -9,6 +9,7 @@
struct dma_fence;
struct intel_display;
struct intel_hdcp_gsc_context;
struct intel_stolen_node;

ssize_t intel_parent_hdcp_gsc_msg_send(struct intel_display *display,
				       struct intel_hdcp_gsc_context *gsc_context,
@@ -27,6 +28,24 @@ void intel_parent_rps_boost_if_not_started(struct intel_display *display, struct
void intel_parent_rps_mark_interactive(struct intel_display *display, bool interactive);
void intel_parent_rps_ilk_irq_handler(struct intel_display *display);

int intel_parent_stolen_insert_node_in_range(struct intel_display *display,
					     struct intel_stolen_node *node, u64 size,
					     unsigned int align, u64 start, u64 end);
int intel_parent_stolen_insert_node(struct intel_display *display, struct intel_stolen_node *node, u64 size,
				    unsigned int align);
void intel_parent_stolen_remove_node(struct intel_display *display,
				     struct intel_stolen_node *node);
bool intel_parent_stolen_initialized(struct intel_display *display);
bool intel_parent_stolen_node_allocated(struct intel_display *display,
					const struct intel_stolen_node *node);
u32 intel_parent_stolen_node_offset(struct intel_display *display, struct intel_stolen_node *node);
u64 intel_parent_stolen_area_address(struct intel_display *display);
u64 intel_parent_stolen_area_size(struct intel_display *display);
u64 intel_parent_stolen_node_address(struct intel_display *display, struct intel_stolen_node *node);
u64 intel_parent_stolen_node_size(struct intel_display *display, const struct intel_stolen_node *node);
struct intel_stolen_node *intel_parent_stolen_node_alloc(struct intel_display *display);
void intel_parent_stolen_node_free(struct intel_display *display, const struct intel_stolen_node *node);

bool intel_parent_vgpu_active(struct intel_display *display);

bool intel_parent_has_fenced_regions(struct intel_display *display);
+34 −18
Original line number Diff line number Diff line
@@ -8,6 +8,7 @@

#include <drm/drm_mm.h>
#include <drm/drm_print.h>
#include <drm/intel/display_parent_interface.h>
#include <drm/intel/i915_drm.h>

#include "gem/i915_gem_lmem.h"
@@ -64,7 +65,7 @@ static int __i915_gem_stolen_insert_node_in_range(struct drm_i915_private *i915,
	return ret;
}

int i915_gem_stolen_insert_node_in_range(struct intel_stolen_node *node, u64 size,
static int i915_gem_stolen_insert_node_in_range(struct intel_stolen_node *node, u64 size,
						unsigned int alignment, u64 start, u64 end)
{
	return __i915_gem_stolen_insert_node_in_range(node->i915, &node->node,
@@ -82,7 +83,7 @@ static int __i915_gem_stolen_insert_node(struct drm_i915_private *i915,
						      U64_MAX);
}

int i915_gem_stolen_insert_node(struct intel_stolen_node *node, u64 size,
static int i915_gem_stolen_insert_node(struct intel_stolen_node *node, u64 size,
				       unsigned int alignment)
{
	return __i915_gem_stolen_insert_node(node->i915, &node->node, size, alignment);
@@ -96,7 +97,7 @@ static void __i915_gem_stolen_remove_node(struct drm_i915_private *i915,
	mutex_unlock(&i915->mm.stolen_lock);
}

void i915_gem_stolen_remove_node(struct intel_stolen_node *node)
static void i915_gem_stolen_remove_node(struct intel_stolen_node *node)
{
	__i915_gem_stolen_remove_node(node->i915, &node->node);
}
@@ -1025,50 +1026,50 @@ bool i915_gem_object_is_stolen(const struct drm_i915_gem_object *obj)
	return obj->ops == &i915_gem_object_stolen_ops;
}

bool i915_gem_stolen_initialized(struct drm_device *drm)
static bool i915_gem_stolen_initialized(struct drm_device *drm)
{
	struct drm_i915_private *i915 = to_i915(drm);

	return drm_mm_initialized(&i915->mm.stolen);
}

u64 i915_gem_stolen_area_address(struct drm_device *drm)
static u64 i915_gem_stolen_area_address(struct drm_device *drm)
{
	struct drm_i915_private *i915 = to_i915(drm);

	return i915->dsm.stolen.start;
}

u64 i915_gem_stolen_area_size(struct drm_device *drm)
static u64 i915_gem_stolen_area_size(struct drm_device *drm)
{
	struct drm_i915_private *i915 = to_i915(drm);

	return resource_size(&i915->dsm.stolen);
}

u64 i915_gem_stolen_node_address(const struct intel_stolen_node *node)
static u64 i915_gem_stolen_node_offset(const struct intel_stolen_node *node)
{
	return node->node.start;
}

static u64 i915_gem_stolen_node_address(const struct intel_stolen_node *node)
{
	struct drm_i915_private *i915 = node->i915;

	return i915->dsm.stolen.start + i915_gem_stolen_node_offset(node);
}

bool i915_gem_stolen_node_allocated(const struct intel_stolen_node *node)
static bool i915_gem_stolen_node_allocated(const struct intel_stolen_node *node)
{
	return drm_mm_node_allocated(&node->node);
}

u64 i915_gem_stolen_node_offset(const struct intel_stolen_node *node)
{
	return node->node.start;
}

u64 i915_gem_stolen_node_size(const struct intel_stolen_node *node)
static u64 i915_gem_stolen_node_size(const struct intel_stolen_node *node)
{
	return node->node.size;
}

struct intel_stolen_node *i915_gem_stolen_node_alloc(struct drm_device *drm)
static struct intel_stolen_node *i915_gem_stolen_node_alloc(struct drm_device *drm)
{
	struct drm_i915_private *i915 = to_i915(drm);
	struct intel_stolen_node *node;
@@ -1082,7 +1083,22 @@ struct intel_stolen_node *i915_gem_stolen_node_alloc(struct drm_device *drm)
	return node;
}

void i915_gem_stolen_node_free(const struct intel_stolen_node *node)
static void i915_gem_stolen_node_free(const struct intel_stolen_node *node)
{
	kfree(node);
}

const struct intel_display_stolen_interface i915_display_stolen_interface = {
	.insert_node_in_range = i915_gem_stolen_insert_node_in_range,
	.insert_node = i915_gem_stolen_insert_node,
	.remove_node = i915_gem_stolen_remove_node,
	.initialized = i915_gem_stolen_initialized,
	.node_allocated = i915_gem_stolen_node_allocated,
	.node_offset = i915_gem_stolen_node_offset,
	.area_address = i915_gem_stolen_area_address,
	.area_size = i915_gem_stolen_area_size,
	.node_address = i915_gem_stolen_node_address,
	.node_size = i915_gem_stolen_node_size,
	.node_alloc = i915_gem_stolen_node_alloc,
	.node_free = i915_gem_stolen_node_free,
};
+2 −21
Original line number Diff line number Diff line
@@ -8,17 +8,9 @@

#include <linux/types.h>

struct drm_device;
struct drm_i915_gem_object;
struct drm_i915_private;
struct intel_stolen_node;

int i915_gem_stolen_insert_node(struct intel_stolen_node *node, u64 size,
				unsigned alignment);
int i915_gem_stolen_insert_node_in_range(struct intel_stolen_node *node, u64 size,
					 unsigned alignment, u64 start,
					 u64 end);
void i915_gem_stolen_remove_node(struct intel_stolen_node *node);

struct intel_memory_region *
i915_gem_stolen_smem_setup(struct drm_i915_private *i915, u16 type,
			   u16 instance);
@@ -34,17 +26,6 @@ bool i915_gem_object_is_stolen(const struct drm_i915_gem_object *obj);

#define I915_GEM_STOLEN_BIAS SZ_128K

bool i915_gem_stolen_initialized(struct drm_device *drm);
u64 i915_gem_stolen_area_address(struct drm_device *drm);
u64 i915_gem_stolen_area_size(struct drm_device *drm);

u64 i915_gem_stolen_node_address(const struct intel_stolen_node *node);

bool i915_gem_stolen_node_allocated(const struct intel_stolen_node *node);
u64 i915_gem_stolen_node_offset(const struct intel_stolen_node *node);
u64 i915_gem_stolen_node_size(const struct intel_stolen_node *node);

struct intel_stolen_node *i915_gem_stolen_node_alloc(struct drm_device *drm);
void i915_gem_stolen_node_free(const struct intel_stolen_node *node);
extern const struct intel_display_stolen_interface i915_display_stolen_interface;

#endif /* __I915_GEM_STOLEN_H__ */
Loading