svn commit: r285752 - in head/sys: arm64/arm64 dev/pci
Warner Losh
imp at bsdimp.com
Tue Jul 21 16:24:55 UTC 2015
Hi Zbigniew,
This is a great brief explanation. Perhaps a one or two line comment
to this effect would be useful for others trying to figure it out later?
Warner
> On Jul 21, 2015, at 10:02 AM, Zbigniew Bodek <zbb at semihalf.com> wrote:
>
> Hello Andrew,
>
> Please check in-line.
>
> Best regards
> zbb
>
> 2015-07-21 17:01 GMT+02:00 Andrew Turner <andrew at fubar.geek.nz>:
>> On Tue, 21 Jul 2015 14:47:24 +0000 (UTC)
>> Zbigniew Bodek <zbb at FreeBSD.org> wrote:
>>
>>> Author: zbb
>>> Date: Tue Jul 21 14:47:23 2015
>>> New Revision: 285752
>>> URL: https://svnweb.freebsd.org/changeset/base/285752
>>>
>>> Log:
>>> Add support for vendor specific function for PCI devid acquisition
>>> in ITS
>>> It is possible that some HW will use different PCI devids,
>>> hence allow to replace the default domain:bus:slot:func schema
>>> by implementing and registering custom function.
>>>
>>> Obtained from: Semihalf
>>> Sponsored by: The FreeBSD Foundation
>>> Differential Revision: https://reviews.freebsd.org/D3118
>>>
>>> Modified:
>>> head/sys/arm64/arm64/gic_v3_its.c
>>> head/sys/arm64/arm64/gic_v3_var.h
>>> head/sys/dev/pci/pcireg.h
>>>
>>> Modified: head/sys/arm64/arm64/gic_v3_its.c
>>> ==============================================================================
>>> --- head/sys/arm64/arm64/gic_v3_its.c Tue Jul 21 14:39:34
>>> 2015 (r285751) +++ head/sys/arm64/arm64/gic_v3_its.c
>>> Tue Jul 21 14:47:23 2015 (r285752) @@ -44,6 +44,7 @@
>>> __FBSDID("$FreeBSD$"); #include <sys/lock.h>
>>> #include <sys/mutex.h>
>>>
>>> +#include <dev/pci/pcireg.h>
>>> #include <dev/pci/pcivar.h>
>>>
>>> #include <vm/vm.h>
>>> @@ -89,6 +90,7 @@ static void its_free_tables(struct gic_v
>>> static void its_init_commandq(struct gic_v3_its_softc *);
>>> static int its_init_cpu(struct gic_v3_its_softc *);
>>> static void its_init_cpu_collection(struct gic_v3_its_softc *);
>>> +static uint32_t its_get_devid(device_t);
>>>
>>> static int its_cmd_send(struct gic_v3_its_softc *, struct
>>> its_cmd_desc *);
>>> @@ -133,6 +135,23 @@ const char *its_ptab_type[] = {
>>> [GITS_BASER_TYPE_RES7] = "Reserved (7)",
>>> };
>>>
>>> +/*
>>> + * Vendor specific quirks.
>>> + * One needs to add appropriate entry to its_quirks[]
>>> + * table if the imlementation varies from the generic ARM ITS.
>>> + */
>>> +
>>> +/* Cavium ThunderX PCI devid acquire function */
>>> +static uint32_t its_get_devid_thunder(device_t);
>>> +
>>> +static const struct its_quirks its_quirks[] = {
>>> + {
>>> + .cpuid = CPU_ID_RAW(CPU_IMPL_CAVIUM,
>>> CPU_PART_THUNDER, 0, 0),
>>> + .cpuid_mask = CPU_IMPL_MASK | CPU_PART_MASK,
>>> + .devid_func = its_get_devid_thunder,
>>> + },
>>> +};
>>> +
>>> static struct gic_v3_its_softc *its_sc;
>>>
>>> #define gic_its_read(sc, len, reg) \
>>> @@ -1300,7 +1319,7 @@ its_device_alloc_locked(struct gic_v3_it
>>> if (newdev != NULL)
>>> return (newdev);
>>>
>>> - devid = PCI_DEVID(pci_dev);
>>> + devid = its_get_devid(pci_dev);
>>>
>>> /* There was no previously created device. Create one now */
>>> newdev = malloc(sizeof(*newdev), M_GIC_V3_ITS, (M_WAITOK |
>>> M_ZERO)); @@ -1353,6 +1372,73 @@ its_device_asign_lpi_locked(struct
>>> gic_v its_dev->lpis.lpi_free);
>>> its_dev->lpis.lpi_free--;
>>> }
>>> +
>>> +/*
>>> + * ITS quirks.
>>> + * Add vendor specific PCI devid function here.
>>> + */
>>> +static uint32_t
>>> +its_get_devid_thunder(device_t pci_dev)
>>> +{
>>> + int bsf;
>>> + int pem;
>>> + uint32_t bus;
>>> +
>>> + bus = pci_get_bus(pci_dev);
>>> +
>>> + bsf = PCI_RID(pci_get_bus(pci_dev), pci_get_slot(pci_dev),
>>> + pci_get_function(pci_dev));
>>> +
>>> + /* ECAM is on bus=0 */
>>> + if (bus == 0) {
>>> + return ((pci_get_domain(pci_dev) <<
>>> PCI_RID_DOMAIN_SHIFT) |
>>> + bsf);
>>> + /* PEM otherwise */
>>> + } else {
>>> + /* PEM number is equal to domain */
>>> + pem = pci_get_domain(pci_dev);
>>
>> But what is a PEM number?
>
> PEM == PCI-E MAC.
> This is the number of root complex.
>
>>
>>> +
>>> + /* Hardcode appropriate PEM numbers */
>>> + if (pem < 3 )
>>> + return ((0x1 << PCI_RID_DOMAIN_SHIFT) | bsf);
>>> +
>>> + if (pem < 6 )
>>> + return ((0x3 << PCI_RID_DOMAIN_SHIFT) | bsf);
>>> +
>>> + if (pem < 9 )
>>> + return ((0x9 << PCI_RID_DOMAIN_SHIFT) | bsf);
>>> +
>>> + if (pem < 12 )
>>> + return ((0xB << PCI_RID_DOMAIN_SHIFT) | bsf);
>>
>> What do these magic numbers mean?
>
> This is a domain portion of PCI device ID passed by the HW along with
> the transaction to memory.
> In that case the methodology differs from the genuine (default in this
> driver) ARM implementation and it is Thunder-specific.
>
>>
>>> + }
>>> +
>>> + return (0);
>>> +}
>>> +
>>
>> Andrew
>> _______________________________________________
>> svn-src-all at freebsd.org mailing list
>> http://lists.freebsd.org/mailman/listinfo/svn-src-all
>> To unsubscribe, send any mail to "svn-src-all-unsubscribe at freebsd.org"
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 842 bytes
Desc: Message signed with OpenPGP using GPGMail
URL: <http://lists.freebsd.org/pipermail/svn-src-all/attachments/20150721/9c754165/attachment.bin>
More information about the svn-src-all
mailing list