Changeset 33356a8 in rtems-libbsd


Ignore:
Timestamp:
Aug 23, 2017, 8:08:16 AM (22 months ago)
Author:
Sebastian Huber <sebastian.huber@…>
Branches:
eeb3fd5d9b07ac9a2e280cff60a1b762bd273a8d, 1e989998de954bef51e6c19cc3d64d39f32100aa
Children:
b1fd51c
Parents:
24866e6
git-author:
Sebastian Huber <sebastian.huber@…> (08/23/17 08:08:16)
git-committer:
Sebastian Huber <sebastian.huber@…> (10/23/17 07:24:08)
Message:

dpaa: Improve QMan portal initialization

Be less dependent on the device tree content.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • linux/drivers/soc/fsl/qbman/qman_portal.c

    r24866e6 r33356a8  
    423423}
    424424
     425static void
     426do_init_pcfg(struct device_node *dn, struct qm_portal_config *pcfg,
     427    int cpu_count)
     428{
     429        struct qman_portal *portal;
     430        struct resource res;
     431        int ret;
     432        u32 val;
     433
     434        ret = of_address_to_resource(dn, 0, &res);
     435        if (ret != 0)
     436                panic("qman: no portal CE address");
     437        pcfg->addr_virt[0] = (__iomem void *)
     438            ((uintptr_t)&qoriq_qman_portal[0][0] + (uintptr_t)res.start);
     439        BSD_ASSERT((uintptr_t)pcfg->addr_virt[0] >=
     440            (uintptr_t)&qoriq_qman_portal[0][0]);
     441        BSD_ASSERT((uintptr_t)pcfg->addr_virt[0] <
     442            (uintptr_t)&qoriq_qman_portal[1][0]);
     443
     444        ret = of_address_to_resource(dn, 1, &res);
     445        if (ret != 0)
     446                panic("qman: no portal CI address");
     447        pcfg->addr_virt[1] = (__iomem void *)
     448            ((uintptr_t)&qoriq_qman_portal[0][0] + (uintptr_t)res.start);
     449        BSD_ASSERT((uintptr_t)pcfg->addr_virt[1] >=
     450            (uintptr_t)&qoriq_qman_portal[1][0]);
     451        BSD_ASSERT((uintptr_t)pcfg->addr_virt[1] <
     452            (uintptr_t)&qoriq_qman_portal[2][0]);
     453
     454        ret = of_property_read_u32(dn, "cell-index", &val);
     455        if (ret != 0)
     456                panic("qman: no cell-index");
     457        pcfg->channel = val;
     458
     459        pcfg->irq = of_irq_to_resource(dn, 0, NULL);
     460        if (pcfg->irq == NO_IRQ)
     461                panic("qman: no portal interrupt");
     462
     463        if (val < cpu_count) {
     464                pcfg->cpu = val;
     465
     466                if (is_dequeue_enabled(dn)) {
     467                        pcfg->pools = qm_get_pools_sdqcr();
     468                }
     469
     470                portal = init_pcfg(pcfg);
     471                if (portal == NULL)
     472                        panic("qman: cannot create portal");
     473
     474                qman_portal_update_sdest(pcfg, val);
     475        } else {
     476                pcfg->cpu = -1;
     477                list_add_tail(&pcfg->node, &qman_free_portals);
     478        }
     479}
     480
    425481void
    426482qman_sysinit_portals(void)
     
    431487        int cpu_count = (int)rtems_get_processor_count();
    432488        int i;
    433         int ret;
    434489        int node;
    435490        int parent;
     
    454509            sizeof(qoriq_qman_portal[1]));
    455510
    456         for (i = 0; node >= 0 && i < MAX_QMAN_PORTALS; ++i) {
    457                 struct qm_portal_config *pcfg = &qman_configs[i];
    458                 struct qman_portal *portal;
    459                 struct resource res;
    460                 u32 val;
    461 
    462                 ret = of_address_to_resource(&dn, 0, &res);
    463                 if (ret != 0)
    464                         panic("qman: no portal CE address");
    465                 pcfg->addr_virt[0] = (__iomem void *)
    466                     ((uintptr_t)&qoriq_qman_portal[0][0] + (uintptr_t)res.start);
    467                 BSD_ASSERT((uintptr_t)pcfg->addr_virt[0] >=
    468                     (uintptr_t)&qoriq_qman_portal[0][0]);
    469                 BSD_ASSERT((uintptr_t)pcfg->addr_virt[0] <
    470                     (uintptr_t)&qoriq_qman_portal[1][0]);
    471 
    472                 ret = of_address_to_resource(&dn, 1, &res);
    473                 if (ret != 0)
    474                         panic("qman: no portal CI address");
    475                 pcfg->addr_virt[1] = (__iomem void *)
    476                     ((uintptr_t)&qoriq_qman_portal[0][0] + (uintptr_t)res.start);
    477                 BSD_ASSERT((uintptr_t)pcfg->addr_virt[1] >=
    478                     (uintptr_t)&qoriq_qman_portal[1][0]);
    479                 BSD_ASSERT((uintptr_t)pcfg->addr_virt[1] <
    480                     (uintptr_t)&qoriq_qman_portal[2][0]);
    481 
    482                 ret = of_property_read_u32(&dn, "cell-index", &val);
    483                 if (ret != 0)
    484                         panic("qman: no cell-index");
    485                 pcfg->channel = val;
    486 
    487                 pcfg->irq = of_irq_to_resource(&dn, 0, NULL);
    488                 if (pcfg->irq == NO_IRQ)
    489                         panic("qman: no portal interrupt");
    490 
    491                 if (val < cpu_count) {
    492                         pcfg->cpu = val;
    493 
    494                         if (is_dequeue_enabled(&dn)) {
    495                                 pcfg->pools = qm_get_pools_sdqcr();
    496                         }
    497 
    498                         portal = init_pcfg(pcfg);
    499                         if (portal == NULL)
    500                                 panic("qman: cannot create portal");
    501 
    502                         qman_portal_update_sdest(pcfg, val);
    503                 } else {
    504                         pcfg->cpu = -1;
    505                         list_add_tail(&pcfg->node, &qman_free_portals);
     511        i = 0;
     512        while (node >= 0 && i < MAX_QMAN_PORTALS) {
     513                if (fdt_node_check_compatible(fdt, node, name) == 0) {
     514                        do_init_pcfg(&dn, &qman_configs[i], cpu_count);
     515                        ++i;
    506516                }
    507517
Note: See TracChangeset for help on using the changeset viewer.