[PATCH 1/3] drm/amdgpu: create amdgpu_vkms

kernel test robot lkp at intel.com
Tue Jul 13 00:44:59 UTC 2021


Hi Ryan,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on next-20210712]
[also build test WARNING on v5.14-rc1]
[cannot apply to drm-intel/for-linux-next drm-tip/drm-tip drm-exynos/exynos-drm-next tegra-drm/drm/tegra/for-next linus/master drm/drm-next v5.14-rc1 v5.13 v5.13-rc7]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Ryan-Taylor/drm-amdgpu-modernize-virtual-display-feature/20210713-034827
base:    db503865b9ba6284edfee3825846a464cc4f4c61
config: i386-randconfig-r013-20210712 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-22) 9.3.0
reproduce (this is a W=1 build):
        # https://github.com/0day-ci/linux/commit/96f64e3b91a195cc37720de206b86c3f0378abbb
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Ryan-Taylor/drm-amdgpu-modernize-virtual-display-feature/20210713-034827
        git checkout 96f64e3b91a195cc37720de206b86c3f0378abbb
        # save the attached .config to linux build tree
        make W=1 ARCH=i386 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp at intel.com>

All warnings (new ones prefixed by >>):

>> drivers/gpu/drm/amd/amdgpu/amdgpu_vkms.c:156:5: warning: no previous prototype for 'amdgpu_vkms_crtc_init' [-Wmissing-prototypes]
     156 | int amdgpu_vkms_crtc_init(struct drm_device *dev, struct drm_crtc *crtc,
         |     ^~~~~~~~~~~~~~~~~~~~~
   drivers/gpu/drm/amd/amdgpu/amdgpu_vkms.c:323:20: error: initialization of 'void (*)(struct drm_plane *, struct drm_atomic_state *)' from incompatible pointer type 'void (*)(struct drm_plane *, struct drm_plane_state *)' [-Werror=incompatible-pointer-types]
     323 |  .atomic_update  = amdgpu_vkms_plane_atomic_update,
         |                    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/gpu/drm/amd/amdgpu/amdgpu_vkms.c:323:20: note: (near initialization for 'amdgpu_vkms_primary_helper_funcs.atomic_update')
   drivers/gpu/drm/amd/amdgpu/amdgpu_vkms.c:324:19: error: initialization of 'int (*)(struct drm_plane *, struct drm_atomic_state *)' from incompatible pointer type 'int (*)(struct drm_plane *, struct drm_plane_state *)' [-Werror=incompatible-pointer-types]
     324 |  .atomic_check  = amdgpu_vkms_plane_atomic_check,
         |                   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/gpu/drm/amd/amdgpu/amdgpu_vkms.c:324:19: note: (near initialization for 'amdgpu_vkms_primary_helper_funcs.atomic_check')
>> drivers/gpu/drm/amd/amdgpu/amdgpu_vkms.c:329:19: warning: no previous prototype for 'amdgpu_vkms_plane_init' [-Wmissing-prototypes]
     329 | struct drm_plane *amdgpu_vkms_plane_init(struct drm_device *dev,
         |                   ^~~~~~~~~~~~~~~~~~~~~~
   cc1: some warnings being treated as errors


vim +/amdgpu_vkms_crtc_init +156 drivers/gpu/drm/amd/amdgpu/amdgpu_vkms.c

   155	
 > 156	int amdgpu_vkms_crtc_init(struct drm_device *dev, struct drm_crtc *crtc,
   157				  struct drm_plane *primary, struct drm_plane *cursor)
   158	{
   159		int ret;
   160	
   161		ret = drm_crtc_init_with_planes(dev, crtc, primary, cursor,
   162						&amdgpu_vkms_crtc_funcs, NULL);
   163		if (ret) {
   164			DRM_ERROR("Failed to init CRTC\n");
   165			return ret;
   166		}
   167	
   168		drm_crtc_helper_add(crtc, &amdgpu_vkms_crtc_helper_funcs);
   169	
   170		return ret;
   171	}
   172	
   173	static const struct drm_connector_funcs amdgpu_vkms_connector_funcs = {
   174		.fill_modes = drm_helper_probe_single_connector_modes,
   175		.destroy = drm_connector_cleanup,
   176		.reset = drm_atomic_helper_connector_reset,
   177		.atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
   178		.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
   179	};
   180	
   181	static int amdgpu_vkms_conn_get_modes(struct drm_connector *connector)
   182	{
   183		int count;
   184	
   185		count = drm_add_modes_noedid(connector, XRES_MAX, YRES_MAX);
   186		drm_set_preferred_mode(connector, XRES_DEF, YRES_DEF);
   187	
   188		return count;
   189	}
   190	
   191	static const struct drm_connector_helper_funcs amdgpu_vkms_conn_helper_funcs = {
   192		.get_modes    = amdgpu_vkms_conn_get_modes,
   193	};
   194	
   195	static const struct drm_plane_funcs amdgpu_vkms_plane_funcs = {
   196		.update_plane		= drm_atomic_helper_update_plane,
   197		.disable_plane		= drm_atomic_helper_disable_plane,
   198		.destroy		= drm_plane_cleanup,
   199		.reset			= drm_atomic_helper_plane_reset,
   200		.atomic_duplicate_state = drm_atomic_helper_plane_duplicate_state,
   201		.atomic_destroy_state	= drm_atomic_helper_plane_destroy_state,
   202	};
   203	
   204	static void amdgpu_vkms_plane_atomic_update(struct drm_plane *plane,
   205					     struct drm_plane_state *old_state)
   206	{
   207		return;
   208	}
   209	
   210	static int amdgpu_vkms_plane_atomic_check(struct drm_plane *plane,
   211						  struct drm_plane_state *state)
   212	{
   213		struct drm_crtc_state *crtc_state;
   214		bool can_position = false;
   215		int ret;
   216	
   217		if (!state->fb || WARN_ON(!state->crtc))
   218			return 0;
   219	
   220		crtc_state = drm_atomic_get_crtc_state(state->state, state->crtc);
   221		if (IS_ERR(crtc_state))
   222			return PTR_ERR(crtc_state);
   223	
   224		ret = drm_atomic_helper_check_plane_state(state, crtc_state,
   225							  DRM_PLANE_HELPER_NO_SCALING,
   226							  DRM_PLANE_HELPER_NO_SCALING,
   227							  can_position, true);
   228		if (ret != 0)
   229			return ret;
   230	
   231		/* for now primary plane must be visible and full screen */
   232		if (!state->visible && !can_position)
   233			return -EINVAL;
   234	
   235		return 0;
   236	}
   237	
   238	static int amdgpu_vkms_prepare_fb(struct drm_plane *plane,
   239					  struct drm_plane_state *new_state)
   240	{
   241		struct amdgpu_framebuffer *afb;
   242		struct drm_gem_object *obj;
   243		struct amdgpu_device *adev;
   244		struct amdgpu_bo *rbo;
   245		struct list_head list;
   246		struct ttm_validate_buffer tv;
   247		struct ww_acquire_ctx ticket;
   248		uint32_t domain;
   249		int r;
   250	
   251		if (!new_state->fb) {
   252			DRM_DEBUG_KMS("No FB bound\n");
   253			return 0;
   254		}
   255		afb = to_amdgpu_framebuffer(new_state->fb);
   256		obj = new_state->fb->obj[0];
   257		rbo = gem_to_amdgpu_bo(obj);
   258		adev = amdgpu_ttm_adev(rbo->tbo.bdev);
   259		INIT_LIST_HEAD(&list);
   260	
   261		tv.bo = &rbo->tbo;
   262		tv.num_shared = 1;
   263		list_add(&tv.head, &list);
   264	
   265		r = ttm_eu_reserve_buffers(&ticket, &list, false, NULL);
   266		if (r) {
   267			dev_err(adev->dev, "fail to reserve bo (%d)\n", r);
   268			return r;
   269		}
   270	
   271		if (plane->type != DRM_PLANE_TYPE_CURSOR)
   272			domain = amdgpu_display_supported_domains(adev, rbo->flags);
   273		else
   274			domain = AMDGPU_GEM_DOMAIN_VRAM;
   275	
   276		r = amdgpu_bo_pin(rbo, domain);
   277		if (unlikely(r != 0)) {
   278			if (r != -ERESTARTSYS)
   279				DRM_ERROR("Failed to pin framebuffer with error %d\n", r);
   280			ttm_eu_backoff_reservation(&ticket, &list);
   281			return r;
   282		}
   283	
   284		r = amdgpu_ttm_alloc_gart(&rbo->tbo);
   285		if (unlikely(r != 0)) {
   286			amdgpu_bo_unpin(rbo);
   287			ttm_eu_backoff_reservation(&ticket, &list);
   288			DRM_ERROR("%p bind failed\n", rbo);
   289			return r;
   290		}
   291	
   292		ttm_eu_backoff_reservation(&ticket, &list);
   293	
   294		afb->address = amdgpu_bo_gpu_offset(rbo);
   295	
   296		amdgpu_bo_ref(rbo);
   297	
   298		return 0;
   299	}
   300	
   301	static void amdgpu_vkms_cleanup_fb(struct drm_plane *plane,
   302					   struct drm_plane_state *old_state)
   303	{
   304		struct amdgpu_bo *rbo;
   305		int r;
   306	
   307		if (!old_state->fb)
   308			return;
   309	
   310		rbo = gem_to_amdgpu_bo(old_state->fb->obj[0]);
   311		r = amdgpu_bo_reserve(rbo, false);
   312		if (unlikely(r)) {
   313			DRM_ERROR("failed to reserve rbo before unpin\n");
   314			return;
   315		}
   316	
   317		amdgpu_bo_unpin(rbo);
   318		amdgpu_bo_unreserve(rbo);
   319		amdgpu_bo_unref(&rbo);
   320	}
   321	
   322	static const struct drm_plane_helper_funcs amdgpu_vkms_primary_helper_funcs = {
   323		.atomic_update		= amdgpu_vkms_plane_atomic_update,
   324		.atomic_check		= amdgpu_vkms_plane_atomic_check,
   325		.prepare_fb		= amdgpu_vkms_prepare_fb,
   326		.cleanup_fb		= amdgpu_vkms_cleanup_fb,
   327	};
   328	
 > 329	struct drm_plane *amdgpu_vkms_plane_init(struct drm_device *dev,
   330						 enum drm_plane_type type, int index)
   331	{
   332		struct drm_plane *plane;
   333		int ret;
   334	
   335		plane = kzalloc(sizeof(*plane), GFP_KERNEL);
   336		if (!plane)
   337			return ERR_PTR(-ENOMEM);
   338	
   339		ret = drm_universal_plane_init(dev, plane, 1 << index,
   340					       &amdgpu_vkms_plane_funcs,
   341					       amdgpu_vkms_formats,
   342					       ARRAY_SIZE(amdgpu_vkms_formats),
   343					       NULL, type, NULL);
   344		if (ret) {
   345			kfree(plane);
   346			return ERR_PTR(ret);
   347		}
   348	
   349		drm_plane_helper_add(plane, &amdgpu_vkms_primary_helper_funcs);
   350	
   351		return plane;
   352	}
   353	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
-------------- next part --------------
A non-text attachment was scrubbed...
Name: .config.gz
Type: application/gzip
Size: 46284 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/dri-devel/attachments/20210713/8b4c3717/attachment-0001.gz>


More information about the dri-devel mailing list