[PATCH 06/14] drm/mgag200: Merge VRAM setup into MM initialization

Sam Ravnborg sam at ravnborg.org
Fri Jun 5 14:39:00 UTC 2020


Hi Thomas.

Some parts I did not understand here.

On Fri, Jun 05, 2020 at 03:57:55PM +0200, Thomas Zimmermann wrote:
> The VRAM setup in mgag200_drv.c is part of memory management and
> should be done in the same place. Merge the code into the memory
> management's init function.
> 
> Signed-off-by: Thomas Zimmermann <tzimmermann at suse.de>
> ---
>  drivers/gpu/drm/mgag200/mgag200_main.c | 75 --------------------------
>  drivers/gpu/drm/mgag200/mgag200_mm.c   | 52 ++++++++++++++++++
>  2 files changed, 52 insertions(+), 75 deletions(-)
> 
> diff --git a/drivers/gpu/drm/mgag200/mgag200_main.c b/drivers/gpu/drm/mgag200/mgag200_main.c
> index 3298eff7bd1b4..e9ad783c2b44d 100644
> --- a/drivers/gpu/drm/mgag200/mgag200_main.c
> +++ b/drivers/gpu/drm/mgag200/mgag200_main.c
> @@ -12,77 +12,6 @@
>  
>  #include "mgag200_drv.h"
>  
> -static int mga_probe_vram(struct mga_device *mdev, void __iomem *mem)
> -{
> -	int offset;
> -	int orig;
> -	int test1, test2;
> -	int orig1, orig2;
> -	unsigned int vram_size;
> -
> -	/* Probe */
> -	orig = ioread16(mem);
> -	iowrite16(0, mem);
> -
> -	vram_size = mdev->mc.vram_window;
> -
> -	if ((mdev->type == G200_EW3) && (vram_size >= 0x1000000)) {
> -		vram_size = vram_size - 0x400000;
> -	}
> -
> -	for (offset = 0x100000; offset < vram_size; offset += 0x4000) {
> -		orig1 = ioread8(mem + offset);
> -		orig2 = ioread8(mem + offset + 0x100);
> -
> -		iowrite16(0xaa55, mem + offset);
> -		iowrite16(0xaa55, mem + offset + 0x100);
> -
> -		test1 = ioread16(mem + offset);
> -		test2 = ioread16(mem);
> -
> -		iowrite16(orig1, mem + offset);
> -		iowrite16(orig2, mem + offset + 0x100);
> -
> -		if (test1 != 0xaa55) {
> -			break;
> -		}
> -
> -		if (test2) {
> -			break;
> -		}
> -	}
> -
> -	iowrite16(orig, mem);
> -	return offset - 65536;
> -}
> -
> -/* Map the framebuffer from the card and configure the core */
> -static int mga_vram_init(struct mga_device *mdev)
> -{
> -	struct drm_device *dev = mdev->dev;
> -	void __iomem *mem;
> -
> -	/* BAR 0 is VRAM */
> -	mdev->mc.vram_base = pci_resource_start(dev->pdev, 0);
> -	mdev->mc.vram_window = pci_resource_len(dev->pdev, 0);
> -
> -	if (!devm_request_mem_region(dev->dev, mdev->mc.vram_base,
> -				     mdev->mc.vram_window, "mgadrmfb_vram")) {
> -		DRM_ERROR("can't reserve VRAM\n");
> -		return -ENXIO;
> -	}
> -
> -	mem = pci_iomap(dev->pdev, 0, 0);
> -	if (!mem)
> -		return -ENOMEM;
> -
> -	mdev->mc.vram_size = mga_probe_vram(mdev, mem);
> -
> -	pci_iounmap(dev->pdev, mem);
mem is the result of pci_iomap() - but I do not see any call
to pci_iomap() in the converted code.

mdev->vram is used as argument in new code where mem was used in the old
code.
mdev->vram comes from ioremap(start, len) - will it result in the same?

	Sam


> -
> -	return 0;
> -}
> -
>  int mgag200_driver_load(struct drm_device *dev, unsigned long flags)
>  {
>  	struct mga_device *mdev;
> @@ -121,10 +50,6 @@ int mgag200_driver_load(struct drm_device *dev, unsigned long flags)
>  			mdev->unique_rev_id);
>  	}
>  
> -	ret = mga_vram_init(mdev);
> -	if (ret)
> -		return ret;
> -
>  	ret = mgag200_mm_init(mdev);
>  	if (ret)
>  		goto err_mm;
> diff --git a/drivers/gpu/drm/mgag200/mgag200_mm.c b/drivers/gpu/drm/mgag200/mgag200_mm.c
> index 73e30901e0631..f56b0456994f4 100644
> --- a/drivers/gpu/drm/mgag200/mgag200_mm.c
> +++ b/drivers/gpu/drm/mgag200/mgag200_mm.c
> @@ -30,6 +30,49 @@
>  
>  #include "mgag200_drv.h"
>  
> +static size_t mgag200_probe_vram(struct mga_device *mdev, void __iomem *mem,
> +				 size_t size)
> +{
> +	int offset;
> +	int orig;
> +	int test1, test2;
> +	int orig1, orig2;
> +	size_t vram_size;
> +
> +	/* Probe */
> +	orig = ioread16(mem);
> +	iowrite16(0, mem);
> +
> +	vram_size = size;
> +
> +	if ((mdev->type == G200_EW3) && (vram_size >= 0x1000000))
> +		vram_size = vram_size - 0x400000;
> +
> +	for (offset = 0x100000; offset < vram_size; offset += 0x4000) {
> +		orig1 = ioread8(mem + offset);
> +		orig2 = ioread8(mem + offset + 0x100);
> +
> +		iowrite16(0xaa55, mem + offset);
> +		iowrite16(0xaa55, mem + offset + 0x100);
> +
> +		test1 = ioread16(mem + offset);
> +		test2 = ioread16(mem);
> +
> +		iowrite16(orig1, mem + offset);
> +		iowrite16(orig2, mem + offset + 0x100);
> +
> +		if (test1 != 0xaa55)
> +			break;
> +
> +		if (test2)
> +			break;
> +	}
> +
> +	iowrite16(orig, mem);
> +
> +	return offset - 65536;
> +}
> +
>  int mgag200_mm_init(struct mga_device *mdev)
>  {
>  	struct drm_device *dev = mdev->dev;
> @@ -40,6 +83,11 @@ int mgag200_mm_init(struct mga_device *mdev)
>  	start = pci_resource_start(dev->pdev, 0);
>  	len = pci_resource_len(dev->pdev, 0);
>  
> +	if (!devm_request_mem_region(dev->dev, start, len, "mgadrmfb_vram")) {
> +		drm_err(dev, "can't reserve VRAM\n");
> +		return -ENXIO;
> +	}
> +
>  	arch_io_reserve_memtype_wc(start, len);
>  
>  	mdev->fb_mtrr = arch_phys_wc_add(start, len);
> @@ -50,6 +98,10 @@ int mgag200_mm_init(struct mga_device *mdev)
>  		goto err_arch_phys_wc_del;
>  	}
>  
> +	mdev->mc.vram_size = mgag200_probe_vram(mdev, mdev->vram, len);
> +	mdev->mc.vram_base = start;
> +	mdev->mc.vram_window = len;
> +
>  	mdev->vram_fb_available = mdev->mc.vram_size;
>  
>  	return 0;
> -- 
> 2.26.2


More information about the dri-devel mailing list