Re: [RFC/PATCH 2/2] usb: dwc3: core: split host address space

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



> This will prevent dwc3.ko from ioremapping
> the entire memory space, thus preventing xHCI
> from requesting its own part of the address.
>
> Signed-off-by: Felipe Balbi <balbi@xxxxxx>
> ---
>  drivers/usb/dwc3/core.c |   26 +++++++---
>  drivers/usb/dwc3/core.h |  122
> +++++++++++++++++++++++------------------------
>  2 files changed, 80 insertions(+), 68 deletions(-)
>
> diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
> index e7c853a..3c69d1a 100644
> --- a/drivers/usb/dwc3/core.c
> +++ b/drivers/usb/dwc3/core.c
> @@ -405,6 +405,7 @@ static void dwc3_core_exit(struct dwc3 *dwc)
>  static int __devinit dwc3_probe(struct platform_device *pdev)
>  {
>  	struct device_node	*node = pdev->dev.of_node;
> +	struct resource		host_resource[2];
>  	struct resource		*res;
>  	struct dwc3		*dwc;
>  	struct device		*dev = &pdev->dev;
> @@ -431,7 +432,24 @@ static int __devinit dwc3_probe(struct
> platform_device *pdev)
>  		return -ENODEV;
>  	}
>
> -	dwc->res = res;
> +	irq = platform_get_irq(pdev, 0);
> +	if (irq < 0) {
> +		dev_err(dev, "missing IRQ\n");
> +		return -ENODEV;
> +	}
> +
> +	host_resource[0].start = res->start;
> +	host_resource[0].end = res->start + 0x7fff;
> +	host_resource[0].flags = IORESOURCE_MEM;

You set the memory end region to end after 0x7fff, but later you assign it
to dwc->res , meaning that this is memory for all the dwc3 core and not
just for the host part.

> +
> +	host_resource[1].start = irq;
> +	host_resource[1].end = irq;
> +	host_resource[1].flags = IORESOURCE_IRQ;

Adding the irq to the dwc->res is nice to have but I don't think it is
related to this patch and I don't see where you use it. Also it seems
redundant since of dwc->irq.

> +
> +	dwc->res = host_resource;

I don't like the name host_resource, this array is the resources of all
the dwc3 not just the host part. Also seems that you set a pointer to
local scoped array, isn't this pointer will be invalid after probe will
finish ?

So, instead, maybe create a local array used for non xhci resource:
struct resource	mem_res_exclude_xhci[1];
...
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
...
mem_res_exclude_xhci[0].start = res->start + 0xc100;
mem_res_exclude_xhci[0].end = res->end;
mem_res_exclude_xhci[0].flags = res.flags;
...
dwc->res = res;
res = mem_res_exclude_xhci;
...

(resource_size(res) - GLOBAL_REGS_START)
> +
> +	/* Skip host address space */
> +	res->start += 0xc100;
>
>  	regs = devm_request_and_ioremap(dev, res);
>  	if (!regs) {
> @@ -439,12 +457,6 @@ static int __devinit dwc3_probe(struct
> platform_device *pdev)
>  		return -ENOMEM;
>  	}
>
> -	irq = platform_get_irq(pdev, 0);
> -	if (irq < 0) {
> -		dev_err(dev, "missing IRQ\n");
> -		return -ENODEV;
> -	}
> -
>  	spin_lock_init(&dwc->lock);
>  	platform_set_drvdata(pdev, dwc);
>
> diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h
> index a32c2b5..0dc4dc4 100644
> --- a/drivers/usb/dwc3/core.h
> +++ b/drivers/usb/dwc3/core.h
> @@ -76,71 +76,71 @@
>  #define DWC3_GSNPSREV_MASK	0xffff
>
>  /* Global Registers */
> -#define DWC3_GSBUSCFG0		0xc100
> -#define DWC3_GSBUSCFG1		0xc104
> -#define DWC3_GTXTHRCFG		0xc108
> -#define DWC3_GRXTHRCFG		0xc10c
> -#define DWC3_GCTL		0xc110
> -#define DWC3_GEVTEN		0xc114
> -#define DWC3_GSTS		0xc118
> -#define DWC3_GSNPSID		0xc120
> -#define DWC3_GGPIO		0xc124
> -#define DWC3_GUID		0xc128
> -#define DWC3_GUCTL		0xc12c
> -#define DWC3_GBUSERRADDR0	0xc130
> -#define DWC3_GBUSERRADDR1	0xc134
> -#define DWC3_GPRTBIMAP0		0xc138
> -#define DWC3_GPRTBIMAP1		0xc13c
> -#define DWC3_GHWPARAMS0		0xc140
> -#define DWC3_GHWPARAMS1		0xc144
> -#define DWC3_GHWPARAMS2		0xc148
> -#define DWC3_GHWPARAMS3		0xc14c
> -#define DWC3_GHWPARAMS4		0xc150
> -#define DWC3_GHWPARAMS5		0xc154
> -#define DWC3_GHWPARAMS6		0xc158
> -#define DWC3_GHWPARAMS7		0xc15c
> -#define DWC3_GDBGFIFOSPACE	0xc160
> -#define DWC3_GDBGLTSSM		0xc164
> -#define DWC3_GPRTBIMAP_HS0	0xc180
> -#define DWC3_GPRTBIMAP_HS1	0xc184
> -#define DWC3_GPRTBIMAP_FS0	0xc188
> -#define DWC3_GPRTBIMAP_FS1	0xc18c
> -
> -#define DWC3_GUSB2PHYCFG(n)	(0xc200 + (n * 0x04))
> -#define DWC3_GUSB2I2CCTL(n)	(0xc240 + (n * 0x04))
> -
> -#define DWC3_GUSB2PHYACC(n)	(0xc280 + (n * 0x04))
> -
> -#define DWC3_GUSB3PIPECTL(n)	(0xc2c0 + (n * 0x04))
> -
> -#define DWC3_GTXFIFOSIZ(n)	(0xc300 + (n * 0x04))
> -#define DWC3_GRXFIFOSIZ(n)	(0xc380 + (n * 0x04))
> -
> -#define DWC3_GEVNTADRLO(n)	(0xc400 + (n * 0x10))
> -#define DWC3_GEVNTADRHI(n)	(0xc404 + (n * 0x10))
> -#define DWC3_GEVNTSIZ(n)	(0xc408 + (n * 0x10))
> -#define DWC3_GEVNTCOUNT(n)	(0xc40c + (n * 0x10))
> -
> -#define DWC3_GHWPARAMS8		0xc600
> +#define DWC3_GSBUSCFG0		0x0000
> +#define DWC3_GSBUSCFG1		0x0004
> +#define DWC3_GTXTHRCFG		0x0008
> +#define DWC3_GRXTHRCFG		0x000c
> +#define DWC3_GCTL		0x0010
> +#define DWC3_GEVTEN		0x0014
> +#define DWC3_GSTS		0x0018
> +#define DWC3_GSNPSID		0x0020
> +#define DWC3_GGPIO		0x0024
> +#define DWC3_GUID		0x0028
> +#define DWC3_GUCTL		0x002c
> +#define DWC3_GBUSERRADDR0	0x0030
> +#define DWC3_GBUSERRADDR1	0x0034
> +#define DWC3_GPRTBIMAP0		0x0038
> +#define DWC3_GPRTBIMAP1		0x003c
> +#define DWC3_GHWPARAMS0		0x0040
> +#define DWC3_GHWPARAMS1		0x0044
> +#define DWC3_GHWPARAMS2		0x0048
> +#define DWC3_GHWPARAMS3		0x004c
> +#define DWC3_GHWPARAMS4		0x0050
> +#define DWC3_GHWPARAMS5		0x0054
> +#define DWC3_GHWPARAMS6		0x0058
> +#define DWC3_GHWPARAMS7		0x005c
> +#define DWC3_GDBGFIFOSPACE	0x0060
> +#define DWC3_GDBGLTSSM		0x0064
> +#define DWC3_GPRTBIMAP_HS0	0x0080
> +#define DWC3_GPRTBIMAP_HS1	0x0084
> +#define DWC3_GPRTBIMAP_FS0	0x0088
> +#define DWC3_GPRTBIMAP_FS1	0x008c
> +
> +#define DWC3_GUSB2PHYCFG(n)	(0x0100 + (n * 0x04))
> +#define DWC3_GUSB2I2CCTL(n)	(0x0140 + (n * 0x04))
> +
> +#define DWC3_GUSB2PHYACC(n)	(0x0180 + (n * 0x04))
> +
> +#define DWC3_GUSB3PIPECTL(n)	(0x01c0 + (n * 0x04))
> +
> +#define DWC3_GTXFIFOSIZ(n)	(0x0200 + (n * 0x04))
> +#define DWC3_GRXFIFOSIZ(n)	(0x0280 + (n * 0x04))
> +
> +#define DWC3_GEVNTADRLO(n)	(0x0300 + (n * 0x10))
> +#define DWC3_GEVNTADRHI(n)	(0x0304 + (n * 0x10))
> +#define DWC3_GEVNTSIZ(n)	(0x0308 + (n * 0x10))
> +#define DWC3_GEVNTCOUNT(n)	(0x030c + (n * 0x10))
> +
> +#define DWC3_GHWPARAMS8		0x0500
>
>  /* Device Registers */
> -#define DWC3_DCFG		0xc700
> -#define DWC3_DCTL		0xc704
> -#define DWC3_DEVTEN		0xc708
> -#define DWC3_DSTS		0xc70c
> -#define DWC3_DGCMDPAR		0xc710
> -#define DWC3_DGCMD		0xc714
> -#define DWC3_DALEPENA		0xc720
> -#define DWC3_DEPCMDPAR2(n)	(0xc800 + (n * 0x10))
> -#define DWC3_DEPCMDPAR1(n)	(0xc804 + (n * 0x10))
> -#define DWC3_DEPCMDPAR0(n)	(0xc808 + (n * 0x10))
> -#define DWC3_DEPCMD(n)		(0xc80c + (n * 0x10))
> +#define DWC3_DCFG		0x0600
> +#define DWC3_DCTL		0x0604
> +#define DWC3_DEVTEN		0x0608
> +#define DWC3_DSTS		0x060c
> +#define DWC3_DGCMDPAR		0x0610
> +#define DWC3_DGCMD		0x0614
> +#define DWC3_DALEPENA		0x0620
> +#define DWC3_DEPCMDPAR2(n)	(0x0700 + (n * 0x10))
> +#define DWC3_DEPCMDPAR1(n)	(0x0704 + (n * 0x10))
> +#define DWC3_DEPCMDPAR0(n)	(0x0708 + (n * 0x10))
> +#define DWC3_DEPCMD(n)		(0x070c + (n * 0x10))
>
>  /* OTG Registers */
> -#define DWC3_OCFG		0xcc00
> -#define DWC3_OCTL		0xcc04
> -#define DWC3_OEVTEN		0xcc08
> -#define DWC3_OSTS		0xcc0C
> +#define DWC3_OCFG		0x0b00
> +#define DWC3_OCTL		0x0b04
> +#define DWC3_OEVTEN		0x0b08
> +#define DWC3_OSTS		0x0b0C
>

I don't like changing all the addresses of the registers.
This is important to keep the registers offsets as they appear
in the dwc3 spec, so it will be possible to follow the spec.

Instead I suggest changing the functions dwc3_readl and dwc3_writel
so these functions will automatically fix the base address...

>  /* Bit fields */
>
> --
> 1.7.10
>
>

Thanks,
Ido
-- 
Consultant for Qualcomm Innovation Center, Inc.
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux