[PATCH] drm: add kms driver for loongson display controller

kernel test robot lkp at intel.com
Fri Feb 3 07:52:52 UTC 2023


Hi suijingfeng,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on drm-misc/drm-misc-next]
[also build test WARNING on linus/master v6.2-rc6]
[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#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/suijingfeng/drm-add-kms-driver-for-loongson-display-controller/20230202-011138
base:   git://anongit.freedesktop.org/drm/drm-misc drm-misc-next
patch link:    https://lore.kernel.org/r/20230201170403.167665-1-15330273260%40189.cn
patch subject: [PATCH] drm: add kms driver for loongson display controller
config: mips-allyesconfig (https://download.01.org/0day-ci/archive/20230203/202302031525.A4udCUh1-lkp@intel.com/config)
compiler: mips-linux-gcc (GCC) 12.1.0
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/intel-lab-lkp/linux/commit/ff8d5959f6dcf4abbbdbf2951345f552dc3bea46
        git remote add linux-review https://github.com/intel-lab-lkp/linux
        git fetch --no-tags linux-review suijingfeng/drm-add-kms-driver-for-loongson-display-controller/20230202-011138
        git checkout ff8d5959f6dcf4abbbdbf2951345f552dc3bea46
        # save the config file
        mkdir build_dir && cp config build_dir/.config
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=mips olddefconfig
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=mips SHELL=/bin/bash drivers/gpu/drm/lsdc/

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

All warnings (new ones prefixed by >>):

>> drivers/gpu/drm/lsdc/lsdc_drv.c:227:1: warning: no previous prototype for 'lsdc_detect_chip' [-Wmissing-prototypes]
     227 | lsdc_detect_chip(struct pci_dev *pdev, const struct pci_device_id * const ent)
         | ^~~~~~~~~~~~~~~~
>> drivers/gpu/drm/lsdc/lsdc_drv.c:295:21: warning: no previous prototype for 'lsdc_create_device' [-Wmissing-prototypes]
     295 | struct lsdc_device *lsdc_create_device(struct pci_dev *pdev,
         |                     ^~~~~~~~~~~~~~~~~~
   In file included from include/linux/device.h:15,
                    from include/linux/pci.h:37,
                    from drivers/gpu/drm/lsdc/lsdc_drv.c:11:
   drivers/gpu/drm/lsdc/lsdc_drv.c: In function 'lsdc_create_device':
>> drivers/gpu/drm/lsdc/lsdc_drv.c:325:46: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
     325 |         drm_info(ddev, "reg base: 0x%llx\n", (u64)ldev->reg_base);
         |                                              ^
   include/linux/dev_printk.h:110:37: note: in definition of macro 'dev_printk_index_wrap'
     110 |                 _p_func(dev, fmt, ##__VA_ARGS__);                       \
         |                                     ^~~~~~~~~~~
   include/drm/drm_print.h:456:9: note: in expansion of macro 'dev_info'
     456 |         dev_##level##type((drm)->dev, "[drm] " fmt, ##__VA_ARGS__)
         |         ^~~~
   include/drm/drm_print.h:460:9: note: in expansion of macro '__drm_printk'
     460 |         __drm_printk((drm), info,, fmt, ##__VA_ARGS__)
         |         ^~~~~~~~~~~~
   drivers/gpu/drm/lsdc/lsdc_drv.c:325:9: note: in expansion of macro 'drm_info'
     325 |         drm_info(ddev, "reg base: 0x%llx\n", (u64)ldev->reg_base);
         |         ^~~~~~~~
   drivers/gpu/drm/lsdc/lsdc_drv.c: At top level:
   drivers/gpu/drm/lsdc/lsdc_drv.c:52:31: warning: 'dc_in_ls2k1000' defined but not used [-Wunused-const-variable=]
      52 | static const struct lsdc_desc dc_in_ls2k1000 = {
         |                               ^~~~~~~~~~~~~~
   drivers/gpu/drm/lsdc/lsdc_drv.c:34:31: warning: 'dc_in_ls2k0500' defined but not used [-Wunused-const-variable=]
      34 | static const struct lsdc_desc dc_in_ls2k0500 = {
         |                               ^~~~~~~~~~~~~~


vim +/lsdc_detect_chip +227 drivers/gpu/drm/lsdc/lsdc_drv.c

   222	
   223	/*
   224	 * lsdc_detect_chip - a function to tell different chips apart.
   225	 */
   226	const struct lsdc_desc *
 > 227	lsdc_detect_chip(struct pci_dev *pdev, const struct pci_device_id * const ent)
   228	{
   229		if (ent) {
   230			struct lsdc_desc *dc_descp;
   231	
   232			dc_descp = (struct lsdc_desc *)ent->driver_data;
   233			if (dc_descp->chip == CHIP_LS7A1000)
   234				dev_info(&pdev->dev, "LS7A1000 Found, revision: %u\n", pdev->revision);
   235			else if (dc_descp->chip == CHIP_LS7A2000)
   236				dev_info(&pdev->dev, "LS7A2000 Found, revison: %u\n", pdev->revision);
   237	
   238			return dc_descp;
   239		}
   240	
   241		dev_err(&pdev->dev, "No Known Device Found\n");
   242	
   243		return NULL;
   244	}
   245	
   246	static int lsdc_vram_init(struct lsdc_device *ldev,
   247				  const struct lsdc_desc *descp)
   248	{
   249		struct drm_device *ddev = &ldev->base;
   250		struct pci_dev *gpu;
   251		resource_size_t base, size;
   252	
   253		/* The GPU and display controller in LS7A1000/LS7A2000 are separated
   254		 * PCIE devices, they are two devices not one. The DC is a pci device,
   255		 * but it don't have a dedicate VRAM bar, the BIOS engineer choose to
   256		 * assign the VRAM to the gpu device. Sadly, after years application,
   257		 * this decision form as a convention for loongson integrate graphics.
   258		 * For LS7A1000 and LS7A2000, bar 2 of GPU device contain the VRAM,
   259		 * both the GPU and the DC can make use of the VRAM depend on how DRM
   260		 * device driver is written. Therefore, we have to do some tricks here.
   261		 */
   262		if (descp->chip == CHIP_LS7A1000)
   263			gpu = pci_get_device(PCI_VENDOR_ID_LOONGSON, 0x7A15, NULL);
   264		else if (descp->chip == CHIP_LS7A2000)
   265			gpu = pci_get_device(PCI_VENDOR_ID_LOONGSON, 0x7A25, NULL);
   266	
   267		if (!gpu) {
   268			drm_warn(ddev, "No GPU device found\n");
   269			return -ENODEV;
   270		}
   271	
   272		base = pci_resource_start(gpu, 2);
   273		size = pci_resource_len(gpu, 2);
   274	
   275		ldev->vram_base = base;
   276		ldev->vram_size = size;
   277	
   278		drm_info(ddev, "vram start: 0x%llx, size: %uMB\n",
   279			 (u64)base, (u32)(size >> 20));
   280	
   281		return 0;
   282	}
   283	
   284	static int
   285	lsdc_remove_conflicting_framebuffers(const struct drm_driver *pdriver,
   286					     resource_size_t base,
   287					     resource_size_t size)
   288	{
   289		return drm_aperture_remove_conflicting_framebuffers(base,
   290								    size,
   291								    false,
   292								    pdriver);
   293	}
   294	
 > 295	struct lsdc_device *lsdc_create_device(struct pci_dev *pdev,
   296					       const struct pci_device_id *ent,
   297					       const struct drm_driver *drv)
   298	{
   299		struct lsdc_device *ldev;
   300		struct drm_device *ddev;
   301		const struct lsdc_desc *descp;
   302		int ret;
   303	
   304		ldev = devm_drm_dev_alloc(&pdev->dev, drv, struct lsdc_device, base);
   305		if (IS_ERR(ldev))
   306			return ldev;
   307	
   308		ddev = &ldev->base;
   309	
   310		pci_set_drvdata(pdev, ddev);
   311	
   312		descp = lsdc_detect_chip(pdev, ent);
   313		if (!descp)
   314			return NULL;
   315	
   316		ldev->descp = descp;
   317	
   318		spin_lock_init(&ldev->reglock);
   319	
   320		/* BAR 0 the DC device contains registers */
   321		ldev->reg_base = pcim_iomap(pdev, 0, 0);
   322		if (!ldev->reg_base)
   323			return ERR_PTR(-EIO);
   324	
 > 325		drm_info(ddev, "reg base: 0x%llx\n", (u64)ldev->reg_base);
   326	
   327		ret = lsdc_vram_init(ldev, descp);
   328		if (ret)
   329			return ERR_PTR(ret);
   330	
   331		ret = lsdc_remove_conflicting_framebuffers(drv,
   332							   ldev->vram_base,
   333							   ldev->vram_size);
   334		if (ret) {
   335			drm_err(ddev, "remove firmware framebuffers failed: %d\n", ret);
   336			return ERR_PTR(ret);
   337		}
   338	
   339		ret = drmm_vram_helper_init(ddev, ldev->vram_base, ldev->vram_size);
   340		if (ret) {
   341			drm_err(ddev, "vram helper init failed: %d\n", ret);
   342			goto err;
   343		}
   344	
   345		ret = lsdc_mode_config_init(ddev, descp);
   346		if (ret) {
   347			drm_dbg(ddev, "%s: %d\n", __func__, ret);
   348			goto err;
   349		}
   350	
   351		ret = lsdc_modeset_init(ldev, descp);
   352		if (ret)
   353			goto err;
   354	
   355		ret = drm_vblank_init(ddev, descp->num_of_crtc);
   356		if (ret)
   357			goto err;
   358	
   359		ret = request_threaded_irq(pdev->irq,
   360					   lsdc_get_irq_handler(ldev),
   361					   lsdc_irq_thread_handler,
   362					   IRQF_ONESHOT,
   363					   dev_name(ddev->dev),
   364					   ddev);
   365		if (ret) {
   366			drm_err(ddev, "Failed to register lsdc interrupt\n");
   367			goto err;
   368		}
   369	
   370		drm_kms_helper_poll_init(ddev);
   371	
   372		return ldev;
   373	
   374	err:
   375		return ERR_PTR(ret);
   376	}
   377	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests


More information about the dri-devel mailing list