Re: [U-Boot] [PATCH 03/11] usb: ehci: generic PCI support

2012-12-13 Thread Simon Glass
Hi Marek,

On Thu, Dec 13, 2012 at 9:30 AM, Marek Vasut  wrote:
> Dear Simon Glass,
>
>> From: Vincent Palatin 
>>
>> Instead of hardcoding the PCI IDs on the USB controller, use the PCI
>> class to detect them.
>>
>> Ensure the busmaster bit is properly set in the PCI configuration.
>>
>> Signed-off-by: Simon Glass 
>> ---
>>  drivers/usb/host/ehci-pci.c |   37 +
>>  1 files changed, 37 insertions(+), 0 deletions(-)
>>
>> diff --git a/drivers/usb/host/ehci-pci.c b/drivers/usb/host/ehci-pci.c
>> index 29af02d..0dc0e6e 100644
>> --- a/drivers/usb/host/ehci-pci.c
>> +++ b/drivers/usb/host/ehci-pci.c
>> @@ -32,6 +32,34 @@ static struct pci_device_id ehci_pci_ids[] = {
>>   {0x12D8, 0x400F},   /* Pericom */
>>   {0, 0}
>>  };
>> +#else
>> +static pci_dev_t ehci_find_class(void)
>> +{
>> + int bus;
>> + int devnum;
>> + pci_dev_t bdf;
>> + uint32_t class;
>> +
>> + for (bus = 0; bus < pci_last_busno(); bus++) {
>> + for (devnum = 0; devnum < PCI_MAX_PCI_DEVICES-1; devnum++) {
>> + pci_read_config_dword(PCI_BDF(bus, devnum, 0),
>> +   PCI_CLASS_REVISION, &class);
>> + if (class >> 16 == 0x)
>> + continue;
>> +
>> + for (bdf = PCI_BDF(bus, devnum, 0);
>> + bdf <= PCI_BDF(bus, devnum,
>> + PCI_MAX_PCI_FUNCTIONS - 1);
>> + bdf += PCI_BDF(0, 0, 1)) {
>> + pci_read_config_dword(bdf, PCI_CLASS_REVISION,
>> +   &class);
>> + if (class >> 8 == 0x0c0320)
>
> Can we at least describe this magic please?

Changed to PCI_CLASS_SERIAL_USB_EHCI.

>
>> + return bdf;
>> + }
>> + }
>> + }
>> + return -1;
>
> Let's try to use errno.h please. It won't be consistent for a while, but we'll
> get there.

Yes, although pci_find_devices() doesn't, so I will just check for < 0 below.

>
>> +}
>>  #endif
>>
>>  /*
>> @@ -41,8 +69,13 @@ static struct pci_device_id ehci_pci_ids[] = {
>>  int ehci_hcd_init(int index, struct ehci_hccr **hccr, struct ehci_hcor
>> **hcor) {
>>   pci_dev_t pdev;
>> + uint32_t cmd;
>>
>> +#ifdef CONFIG_PCI_EHCI_DEVICE
>>   pdev = pci_find_devices(ehci_pci_ids, CONFIG_PCI_EHCI_DEVICE);
>> +#else
>> + pdev = ehci_find_class();
>> +#endif
>>   if (pdev == -1) {
>>   printf("EHCI host controller not found\n");
>>   return -1;
>> @@ -57,6 +90,10 @@ int ehci_hcd_init(int index, struct ehci_hccr **hccr,
>> struct ehci_hcor **hcor) (uint32_t)*hccr, (uint32_t)*hcor,
>>   (uint32_t)HC_LENGTH(ehci_readl(&(*hccr)->cr_capbase)));
>>
>> + /* enable busmaster */
>> + pci_read_config_dword(pdev, PCI_COMMAND, &cmd);
>> + cmd |= PCI_COMMAND_MASTER;
>> + pci_write_config_dword(pdev, PCI_COMMAND, cmd);
>>   return 0;
>>  }
>
> Best regards,
> Marek Vasut

Regards,
Simon
___
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot


Re: [U-Boot] [PATCH 03/11] usb: ehci: generic PCI support

2012-12-13 Thread Marek Vasut
Dear Vincent Palatin,

> On Thu, Dec 13, 2012 at 9:30 AM, Marek Vasut  wrote:
> > Dear Simon Glass,
> > 
> >> From: Vincent Palatin 
> >> 
> >> Instead of hardcoding the PCI IDs on the USB controller, use the PCI
> >> class to detect them.
> >> 
> >> Ensure the busmaster bit is properly set in the PCI configuration.
> >> 
> >> Signed-off-by: Simon Glass 
> >> ---
> >> 
> >>  drivers/usb/host/ehci-pci.c |   37
> >>  + 1 files changed, 37
> >>  insertions(+), 0 deletions(-)
> >> 
> >> diff --git a/drivers/usb/host/ehci-pci.c b/drivers/usb/host/ehci-pci.c
> >> index 29af02d..0dc0e6e 100644
> >> --- a/drivers/usb/host/ehci-pci.c
> >> +++ b/drivers/usb/host/ehci-pci.c
> >> @@ -32,6 +32,34 @@ static struct pci_device_id ehci_pci_ids[] = {
> >> 
> >>   {0x12D8, 0x400F},   /* Pericom */
> >>   {0, 0}
> >>  
> >>  };
> >> 
> >> +#else
> >> +static pci_dev_t ehci_find_class(void)
> >> +{
> >> + int bus;
> >> + int devnum;
> >> + pci_dev_t bdf;
> >> + uint32_t class;
> >> +
> >> + for (bus = 0; bus < pci_last_busno(); bus++) {
> >> + for (devnum = 0; devnum < PCI_MAX_PCI_DEVICES-1; devnum++)
> >> { + pci_read_config_dword(PCI_BDF(bus, devnum, 0),
> >> +   PCI_CLASS_REVISION,
> >> &class); + if (class >> 16 == 0x)
> >> + continue;
> >> +
> >> + for (bdf = PCI_BDF(bus, devnum, 0);
> >> + bdf <= PCI_BDF(bus, devnum,
> >> + PCI_MAX_PCI_FUNCTIONS -
> >> 1); + bdf += PCI_BDF(0, 0, 1)) { + 
> >>pci_read_config_dword(bdf,
> >> PCI_CLASS_REVISION, +  
> >> &class);
> >> + if (class >> 8 == 0x0c0320)
> > 
> > Can we at least describe this magic please?
> 
> The PCI class word is something like that :
> class = [31:24] class code [23:16] subclass [15:8] Prog if [7:0] Revision
> ID For this use case :
> class code = 0x0C (Serial bus controller)
> subclass = 0x03 (USB controller)
> Program interface = 0x20 (EHCI)
> 
> This is available in include/pci_ids.h as "#define
> PCI_CLASS_SERIAL_USB_EHCI   0x0c0320"
> so just replacing the numeric constant by this define should be ok ?

Of course :)
___
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot


Re: [U-Boot] [PATCH 03/11] usb: ehci: generic PCI support

2012-12-13 Thread Vincent Palatin
On Thu, Dec 13, 2012 at 9:30 AM, Marek Vasut  wrote:
> Dear Simon Glass,
>
>> From: Vincent Palatin 
>>
>> Instead of hardcoding the PCI IDs on the USB controller, use the PCI
>> class to detect them.
>>
>> Ensure the busmaster bit is properly set in the PCI configuration.
>>
>> Signed-off-by: Simon Glass 
>> ---
>>  drivers/usb/host/ehci-pci.c |   37 +
>>  1 files changed, 37 insertions(+), 0 deletions(-)
>>
>> diff --git a/drivers/usb/host/ehci-pci.c b/drivers/usb/host/ehci-pci.c
>> index 29af02d..0dc0e6e 100644
>> --- a/drivers/usb/host/ehci-pci.c
>> +++ b/drivers/usb/host/ehci-pci.c
>> @@ -32,6 +32,34 @@ static struct pci_device_id ehci_pci_ids[] = {
>>   {0x12D8, 0x400F},   /* Pericom */
>>   {0, 0}
>>  };
>> +#else
>> +static pci_dev_t ehci_find_class(void)
>> +{
>> + int bus;
>> + int devnum;
>> + pci_dev_t bdf;
>> + uint32_t class;
>> +
>> + for (bus = 0; bus < pci_last_busno(); bus++) {
>> + for (devnum = 0; devnum < PCI_MAX_PCI_DEVICES-1; devnum++) {
>> + pci_read_config_dword(PCI_BDF(bus, devnum, 0),
>> +   PCI_CLASS_REVISION, &class);
>> + if (class >> 16 == 0x)
>> + continue;
>> +
>> + for (bdf = PCI_BDF(bus, devnum, 0);
>> + bdf <= PCI_BDF(bus, devnum,
>> + PCI_MAX_PCI_FUNCTIONS - 1);
>> + bdf += PCI_BDF(0, 0, 1)) {
>> + pci_read_config_dword(bdf, PCI_CLASS_REVISION,
>> +   &class);
>> + if (class >> 8 == 0x0c0320)
>
> Can we at least describe this magic please?

The PCI class word is something like that :
class = [31:24] class code [23:16] subclass [15:8] Prog if [7:0] Revision ID
For this use case :
class code = 0x0C (Serial bus controller)
subclass = 0x03 (USB controller)
Program interface = 0x20 (EHCI)

This is available in include/pci_ids.h as "#define
PCI_CLASS_SERIAL_USB_EHCI   0x0c0320"
so just replacing the numeric constant by this define should be ok ?

>> + return bdf;
>> + }
>> + }
>> + }
>> + return -1;
>
> Let's try to use errno.h please. It won't be consistent for a while, but we'll
> get there.
>
>> +}
>>  #endif
>>
>>  /*
>> @@ -41,8 +69,13 @@ static struct pci_device_id ehci_pci_ids[] = {
>>  int ehci_hcd_init(int index, struct ehci_hccr **hccr, struct ehci_hcor
>> **hcor) {
>>   pci_dev_t pdev;
>> + uint32_t cmd;
>>
>> +#ifdef CONFIG_PCI_EHCI_DEVICE
>>   pdev = pci_find_devices(ehci_pci_ids, CONFIG_PCI_EHCI_DEVICE);
>> +#else
>> + pdev = ehci_find_class();
>> +#endif
>>   if (pdev == -1) {
>>   printf("EHCI host controller not found\n");
>>   return -1;
>> @@ -57,6 +90,10 @@ int ehci_hcd_init(int index, struct ehci_hccr **hccr,
>> struct ehci_hcor **hcor) (uint32_t)*hccr, (uint32_t)*hcor,
>>   (uint32_t)HC_LENGTH(ehci_readl(&(*hccr)->cr_capbase)));
>>
>> + /* enable busmaster */
>> + pci_read_config_dword(pdev, PCI_COMMAND, &cmd);
>> + cmd |= PCI_COMMAND_MASTER;
>> + pci_write_config_dword(pdev, PCI_COMMAND, cmd);
>>   return 0;
>>  }
>
> Best regards,
> Marek Vasut
___
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot


Re: [U-Boot] [PATCH 03/11] usb: ehci: generic PCI support

2012-12-13 Thread Marek Vasut
Dear Simon Glass,

> From: Vincent Palatin 
> 
> Instead of hardcoding the PCI IDs on the USB controller, use the PCI
> class to detect them.
> 
> Ensure the busmaster bit is properly set in the PCI configuration.
> 
> Signed-off-by: Simon Glass 
> ---
>  drivers/usb/host/ehci-pci.c |   37 +
>  1 files changed, 37 insertions(+), 0 deletions(-)
> 
> diff --git a/drivers/usb/host/ehci-pci.c b/drivers/usb/host/ehci-pci.c
> index 29af02d..0dc0e6e 100644
> --- a/drivers/usb/host/ehci-pci.c
> +++ b/drivers/usb/host/ehci-pci.c
> @@ -32,6 +32,34 @@ static struct pci_device_id ehci_pci_ids[] = {
>   {0x12D8, 0x400F},   /* Pericom */
>   {0, 0}
>  };
> +#else
> +static pci_dev_t ehci_find_class(void)
> +{
> + int bus;
> + int devnum;
> + pci_dev_t bdf;
> + uint32_t class;
> +
> + for (bus = 0; bus < pci_last_busno(); bus++) {
> + for (devnum = 0; devnum < PCI_MAX_PCI_DEVICES-1; devnum++) {
> + pci_read_config_dword(PCI_BDF(bus, devnum, 0),
> +   PCI_CLASS_REVISION, &class);
> + if (class >> 16 == 0x)
> + continue;
> +
> + for (bdf = PCI_BDF(bus, devnum, 0);
> + bdf <= PCI_BDF(bus, devnum,
> + PCI_MAX_PCI_FUNCTIONS - 1);
> + bdf += PCI_BDF(0, 0, 1)) {
> + pci_read_config_dword(bdf, PCI_CLASS_REVISION,
> +   &class);
> + if (class >> 8 == 0x0c0320)

Can we at least describe this magic please?

> + return bdf;
> + }
> + }
> + }
> + return -1;

Let's try to use errno.h please. It won't be consistent for a while, but we'll 
get there.

> +}
>  #endif
> 
>  /*
> @@ -41,8 +69,13 @@ static struct pci_device_id ehci_pci_ids[] = {
>  int ehci_hcd_init(int index, struct ehci_hccr **hccr, struct ehci_hcor
> **hcor) {
>   pci_dev_t pdev;
> + uint32_t cmd;
> 
> +#ifdef CONFIG_PCI_EHCI_DEVICE
>   pdev = pci_find_devices(ehci_pci_ids, CONFIG_PCI_EHCI_DEVICE);
> +#else
> + pdev = ehci_find_class();
> +#endif
>   if (pdev == -1) {
>   printf("EHCI host controller not found\n");
>   return -1;
> @@ -57,6 +90,10 @@ int ehci_hcd_init(int index, struct ehci_hccr **hccr,
> struct ehci_hcor **hcor) (uint32_t)*hccr, (uint32_t)*hcor,
>   (uint32_t)HC_LENGTH(ehci_readl(&(*hccr)->cr_capbase)));
> 
> + /* enable busmaster */
> + pci_read_config_dword(pdev, PCI_COMMAND, &cmd);
> + cmd |= PCI_COMMAND_MASTER;
> + pci_write_config_dword(pdev, PCI_COMMAND, cmd);
>   return 0;
>  }

Best regards,
Marek Vasut
___
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot


[U-Boot] [PATCH 03/11] usb: ehci: generic PCI support

2012-12-12 Thread Simon Glass
From: Vincent Palatin 

Instead of hardcoding the PCI IDs on the USB controller, use the PCI
class to detect them.

Ensure the busmaster bit is properly set in the PCI configuration.

Signed-off-by: Simon Glass 
---
 drivers/usb/host/ehci-pci.c |   37 +
 1 files changed, 37 insertions(+), 0 deletions(-)

diff --git a/drivers/usb/host/ehci-pci.c b/drivers/usb/host/ehci-pci.c
index 29af02d..0dc0e6e 100644
--- a/drivers/usb/host/ehci-pci.c
+++ b/drivers/usb/host/ehci-pci.c
@@ -32,6 +32,34 @@ static struct pci_device_id ehci_pci_ids[] = {
{0x12D8, 0x400F},   /* Pericom */
{0, 0}
 };
+#else
+static pci_dev_t ehci_find_class(void)
+{
+   int bus;
+   int devnum;
+   pci_dev_t bdf;
+   uint32_t class;
+
+   for (bus = 0; bus < pci_last_busno(); bus++) {
+   for (devnum = 0; devnum < PCI_MAX_PCI_DEVICES-1; devnum++) {
+   pci_read_config_dword(PCI_BDF(bus, devnum, 0),
+ PCI_CLASS_REVISION, &class);
+   if (class >> 16 == 0x)
+   continue;
+
+   for (bdf = PCI_BDF(bus, devnum, 0);
+   bdf <= PCI_BDF(bus, devnum,
+   PCI_MAX_PCI_FUNCTIONS - 1);
+   bdf += PCI_BDF(0, 0, 1)) {
+   pci_read_config_dword(bdf, PCI_CLASS_REVISION,
+ &class);
+   if (class >> 8 == 0x0c0320)
+   return bdf;
+   }
+   }
+   }
+   return -1;
+}
 #endif
 
 /*
@@ -41,8 +69,13 @@ static struct pci_device_id ehci_pci_ids[] = {
 int ehci_hcd_init(int index, struct ehci_hccr **hccr, struct ehci_hcor **hcor)
 {
pci_dev_t pdev;
+   uint32_t cmd;
 
+#ifdef CONFIG_PCI_EHCI_DEVICE
pdev = pci_find_devices(ehci_pci_ids, CONFIG_PCI_EHCI_DEVICE);
+#else
+   pdev = ehci_find_class();
+#endif
if (pdev == -1) {
printf("EHCI host controller not found\n");
return -1;
@@ -57,6 +90,10 @@ int ehci_hcd_init(int index, struct ehci_hccr **hccr, struct 
ehci_hcor **hcor)
(uint32_t)*hccr, (uint32_t)*hcor,
(uint32_t)HC_LENGTH(ehci_readl(&(*hccr)->cr_capbase)));
 
+   /* enable busmaster */
+   pci_read_config_dword(pdev, PCI_COMMAND, &cmd);
+   cmd |= PCI_COMMAND_MASTER;
+   pci_write_config_dword(pdev, PCI_COMMAND, cmd);
return 0;
 }
 
-- 
1.7.7.3

___
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot