Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 


Quelle  vfio_platform_bcmflexrm.c   Sprache: C

 
// SPDX-License-Identifier: GPL-2.0
/*
 * Copyright (C) 2017 Broadcom
 */


/*
 * This driver provides reset support for Broadcom FlexRM ring manager
 * to VFIO platform.
 */


#include <linux/delay.h>
#include <linux/device.h>
#include <linux/init.h>
#include <linux/io.h>
#include <linux/kernel.h>
#include <linux/module.h>

#include "../vfio_platform_private.h"

/* FlexRM configuration */
#define RING_REGS_SIZE     0x10000
#define RING_VER_MAGIC     0x76303031

/* Per-Ring register offsets */
#define RING_VER     0x000
#define RING_CONTROL     0x034
#define RING_FLUSH_DONE     0x038

/* Register RING_CONTROL fields */
#define CONTROL_FLUSH_SHIFT    5

/* Register RING_FLUSH_DONE fields */
#define FLUSH_DONE_MASK     0x1

static int vfio_platform_bcmflexrm_shutdown(void __iomem *ring)
{
 unsigned int timeout;

 /* Disable/inactivate ring */
 writel_relaxed(0x0, ring + RING_CONTROL);

 /* Set ring flush state */
 timeout = 1000; /* timeout of 1s */
 writel_relaxed(BIT(CONTROL_FLUSH_SHIFT), ring + RING_CONTROL);
 do {
  if (readl_relaxed(ring + RING_FLUSH_DONE) &
      FLUSH_DONE_MASK)
   break;
  mdelay(1);
 } while (--timeout);
 if (!timeout)
  return -ETIMEDOUT;

 /* Clear ring flush state */
 timeout = 1000; /* timeout of 1s */
 writel_relaxed(0x0, ring + RING_CONTROL);
 do {
  if (!(readl_relaxed(ring + RING_FLUSH_DONE) &
        FLUSH_DONE_MASK))
   break;
  mdelay(1);
 } while (--timeout);
 if (!timeout)
  return -ETIMEDOUT;

 return 0;
}

static int vfio_platform_bcmflexrm_reset(struct vfio_platform_device *vdev)
{
 void __iomem *ring;
 int rc = 0, ret = 0, ring_num = 0;
 struct vfio_platform_region *reg = &vdev->regions[0];

 /* Map FlexRM ring registers if not mapped */
 if (!reg->ioaddr) {
  reg->ioaddr = ioremap(reg->addr, reg->size);
  if (!reg->ioaddr)
   return -ENOMEM;
 }

 /* Discover and shutdown each FlexRM ring */
 for (ring = reg->ioaddr;
      ring < (reg->ioaddr + reg->size); ring += RING_REGS_SIZE) {
  if (readl_relaxed(ring + RING_VER) == RING_VER_MAGIC) {
   rc = vfio_platform_bcmflexrm_shutdown(ring);
   if (rc) {
    dev_warn(vdev->device,
      "FlexRM ring%d shutdown error %d\n",
      ring_num, rc);
    ret |= rc;
   }
   ring_num++;
  }
 }

 return ret;
}

module_vfio_reset_handler("brcm,iproc-flexrm-mbox",
     vfio_platform_bcmflexrm_reset);

MODULE_LICENSE("GPL v2");
MODULE_AUTHOR("Anup Patel ");
MODULE_DESCRIPTION("Reset support for Broadcom FlexRM VFIO platform device");

Messung V0.5
C=87 H=68 G=77

¤ Dauer der Verarbeitung: 0.11 Sekunden  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Produkte
     Quellcodebibliothek

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....

Besucherstatistik

Besucherstatistik

Monitoring

Montastic status badge