progetto linux per game con kvm

Sistemi operativi Linux e software open source
Rispondi
mafferri
Messaggi: 809
Iscritto il: martedì 10 gennaio 2012, 4:48

Re: progetto linux per game con kvm

Messaggio da mafferri »

Mi so spiegato male , io intendevo più o meno virtualizzato per i giochi non nativi .
Cmq con l'ultima news che ho postato splitteranno la vga in maniera che linux che ne veda una e dar alla macchina virtuale quella virtuale appunto , ora bisgona capire come funziona e cosa si possa fare , perchè suppongo che non si potrà passare una uscita , vedremo

Appunto jena , ogni tanto bisogna staccare dalle cose serie , e il riavvio è una scocciatura :asd:

mafferri
Messaggi: 809
Iscritto il: martedì 10 gennaio 2012, 4:48

Re: progetto linux per game con kvm

Messaggio da mafferri »

Per risolvere il problema con la gpu e continuare i test , ho trovato questa patch , mi aiutate ad applicarla? please :inchino:

ecco a volte sò un pò nabbo , ma proprio un pò :asd: :asd:

Jena Plisskin
Messaggi: 744
Iscritto il: sabato 9 febbraio 2013, 13:39

Re: progetto linux per game con kvm

Messaggio da Jena Plisskin »

Patchare i sorgenti! La cosa più noiosa da fare :D
Devi assicurarti della versione di lib/exe percui è stata fatta la patch, poi crei un file testo facendo la selezione della diff nel link che hai postato, lo salvi come Nome.diff, scarichi i sorgenti li scompatti. Il file sembra sia hw/vfio/pci.c, ora non ricordo bene la procedura di patching ma devi arrivare alla directory superiore "hw" e da lì lanci il comando

patch -p1 Nome.diff

La pacchettizzazione per debian purtroppo non me la ricordo più, prova checkinstall che crea un pacchetto .deb, non è il massimo perlomeno con un paio di colpi di apt-get rimetti tutto a posto.

mafferri
Messaggi: 809
Iscritto il: martedì 10 gennaio 2012, 4:48

Re: progetto linux per game con kvm

Messaggio da mafferri »

grazie testo e ti dico se ci riesco a farla e se ci riesco ;)

Non uso debian , ma gentoo altrimenti come potrei imparare ad usare linux così velocemente :asd:

ps. non è che mi faresti capire che parte devo prendere di quel log da inserire nel file ? ;)
sò nabbo :doh:

Jena Plisskin
Messaggi: 744
Iscritto il: sabato 9 febbraio 2013, 13:39

Re: progetto linux per game con kvm

Messaggio da Jena Plisskin »

Questo dovrebbe essere il contenuto del file .diff

Codice: Seleziona tutto

diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c
index ebc1e0a..baae98c 100644
--- a/hw/vfio/pci.c
+++ b/hw/vfio/pci.c
@@ -154,6 +154,7 @@ typedef struct VFIOPCIDevice {
     PCIHostDeviceAddress host;
     EventNotifier err_notifier;
     EventNotifier req_notifier;
+    int (*resetfn)(struct VFIOPCIDevice *);
     uint32_t features;
 #define VFIO_FEATURE_ENABLE_VGA_BIT 0
 #define VFIO_FEATURE_ENABLE_VGA (1 << VFIO_FEATURE_ENABLE_VGA_BIT)
@@ -3319,6 +3320,162 @@ static void vfio_unregister_req_notifier(VFIOPCIDevice *vdev)
     vdev->req_enabled = false;
 }
 
+/*
+ * AMD Radeon PCI config reset, based on Linux:
+ *   drivers/gpu/drm/radeon/ci_smc.c:ci_is_smc_running()
+ *   drivers/gpu/drm/radeon/radeon_device.c:radeon_pci_config_reset
+ *   drivers/gpu/drm/radeon/ci_smc.c:ci_reset_smc()
+ *   drivers/gpu/drm/radeon/ci_smc.c:ci_stop_smc_clock()
+ * IDs: include/drm/drm_pciids.h
+ * Registers: http://cgit.freedesktop.org/~agd5f/linux/commit/?id=4e2aa447f6f0
+ *
+ * Bonaire and Hawaii GPUs do not respond to a bus reset.  This is a bug in the
+ * hardware that should be fixed on future ASICs.  The symptom of this is that
+ * once the accerlated driver loads, Windows guests will bsod on subsequent
+ * attmpts to load the driver, such as after VM reset or shutdown/restart.  To
+ * work around this, we do an AMD specific PCI config reset, followed by an SMC
+ * reset.  The PCI config reset only works if SMC firmware is running, so we
+ * have a dependency on the state of the device as to whether this reset will
+ * be effective.  There are still cases where we won't be able to kick the
+ * device into working, but this greatly improves the usability overall.  The
+ * config reset magic is relatively common on AMD GPUs, but the setup and SMC
+ * poking is largely ASIC specific.
+ */
+static bool vfio_radeon_smc_is_running(VFIOPCIDevice *vdev)
+{
+    uint32_t clk, pc_c;
+
+    /*
+     * Registers 200h and 204h are index and data registers for acessing
+     * indirect configuration registers within the device.
+     */
+    vfio_region_write(&vdev->bars[5].region, 0x200, 0x80000004, 4);
+    clk = vfio_region_read(&vdev->bars[5].region, 0x204, 4);
+    vfio_region_write(&vdev->bars[5].region, 0x200, 0x80000370, 4);
+    pc_c = vfio_region_read(&vdev->bars[5].region, 0x204, 4);
+
+    return (!(clk & 1) && (0x20100 <= pc_c));
+}
+
+/*
+ * The scope of a config reset is controlled by a mode bit in the misc register
+ * and a fuse, exposed as a bit in another register.  The fuse is the default
+ * (0 = GFX, 1 = whole GPU), the misc bit is a toggle, with the forumula
+ * scope = !(misc ^ fuse), where the resulting scope is defined the same as
+ * the fuse.  A truth table therefore tells us that if misc == fuse, we need
+ * to flip the value of the bit in the misc register.
+ */
+static void vfio_radeon_set_gfx_only_reset(VFIOPCIDevice *vdev)
+{
+    uint32_t misc, fuse;
+    bool a, b;
+
+    vfio_region_write(&vdev->bars[5].region, 0x200, 0xc00c0000, 4);
+    fuse = vfio_region_read(&vdev->bars[5].region, 0x204, 4);
+    b = fuse & 64;
+
+    vfio_region_write(&vdev->bars[5].region, 0x200, 0xc0000010, 4);
+    misc = vfio_region_read(&vdev->bars[5].region, 0x204, 4);
+    a = misc & 2;
+
+    if (a == b) {
+        vfio_region_write(&vdev->bars[5].region, 0x204, misc ^ 2, 4);
+        vfio_region_read(&vdev->bars[5].region, 0x204, 4); /* flush */
+    }
+}
+
+static int vfio_radeon_reset(VFIOPCIDevice *vdev)
+{
+    PCIDevice *pdev = &vdev->pdev;
+    int i, ret = 0;
+    uint32_t data;
+
+    /* Defer to a kernel implemented reset */
+    if (vdev->vbasedev.reset_works) {
+        return -ENODEV;
+    }
+
+    /* Enable only memory BAR access */
+    vfio_pci_write_config(pdev, PCI_COMMAND, PCI_COMMAND_MEMORY, 2);
+
+    /* Reset only works if SMC firmware is loaded and running */
+    if (!vfio_radeon_smc_is_running(vdev)) {
+        ret = -EINVAL;
+        goto out;
+    }
+
+    /* Make sure only the GFX function is reset */
+    vfio_radeon_set_gfx_only_reset(vdev);
+
+    /* AMD PCI config reset */
+    vfio_pci_write_config(pdev, 0x7c, 0x39d5e86b, 4);
+    usleep(100);
+
+    /* Read back the memory size to make sure we're out of reset */
+    for (i = 0; i < 100000; i++) {
+        if (vfio_region_read(&vdev->bars[5].region, 0x5428, 4) != 0xffffffff) {
+            break;
+        }
+        usleep(1);
+    }
+
+    /* Reset SMC */
+    vfio_region_write(&vdev->bars[5].region, 0x200, 0x80000000, 4);
+    data = vfio_region_read(&vdev->bars[5].region, 0x204, 4);
+    data |= 1;
+    vfio_region_write(&vdev->bars[5].region, 0x204, data, 4);
+
+    /* Disable SMC clock */
+    vfio_region_write(&vdev->bars[5].region, 0x200, 0x80000004, 4);
+    data = vfio_region_read(&vdev->bars[5].region, 0x204, 4);
+    data |= 1;
+    vfio_region_write(&vdev->bars[5].region, 0x204, data, 4);
+
+out:
+    /* Restore PCI command register */
+    vfio_pci_write_config(pdev, PCI_COMMAND, 0, 2);
+
+    return ret;
+}
+
+static void vfio_setup_resetfn(VFIOPCIDevice *vdev)
+{
+    PCIDevice *pdev = &vdev->pdev;
+    uint16_t vendor, device;
+
+    vendor = pci_get_word(pdev->config + PCI_VENDOR_ID);
+    device = pci_get_word(pdev->config + PCI_DEVICE_ID);
+
+    switch (vendor) {
+    case 0x1002:
+        switch (device) {
+        /* Bonaire */
+        case 0x6649: /* Bonaire [FirePro W5100] */
+        case 0x6650:
+        case 0x6651:
+        case 0x6658: /* Bonaire XTX [Radeon R7 260X] */
+        case 0x665c: /* Bonaire XT [Radeon HD 7790/8770 / R9 260 OEM] */
+        case 0x665d: /* Bonaire [Radeon R7 200 Series] */
+        /* Hawaii */
+        case 0x67A0: /* Hawaii XT GL [FirePro W9100] */
+        case 0x67A1: /* Hawaii PRO GL [FirePro W8100] */
+        case 0x67A2:
+        case 0x67A8:
+        case 0x67A9:
+        case 0x67AA:
+        case 0x67B0: /* Hawaii XT [Radeon R9 290X] */
+        case 0x67B1: /* Hawaii PRO [Radeon R9 290] */
+        case 0x67B8:
+        case 0x67B9:
+        case 0x67BA:
+        case 0x67BE:
+            vdev->resetfn = vfio_radeon_reset;
+            break;
+        }
+        break;
+    }
+}
+
 static int vfio_initfn(PCIDevice *pdev)
 {
     VFIOPCIDevice *vdev = DO_UPCAST(VFIOPCIDevice, pdev, pdev);
@@ -3467,6 +3624,7 @@ static int vfio_initfn(PCIDevice *pdev)
 
     vfio_register_err_notifier(vdev);
     vfio_register_req_notifier(vdev);
+    vfio_setup_resetfn(vdev);
 
     return 0;
 
@@ -3514,6 +3672,10 @@ static void vfio_pci_reset(DeviceState *dev)
 
     vfio_pci_pre_reset(vdev);
 
+    if (vdev->resetfn && !vdev->resetfn(vdev)) {
+        goto post_reset;
+    }
+
     if (vdev->vbasedev.reset_works &&
         (vdev->has_flr || !vdev->has_pm_reset) &&
         !ioctl(vdev->vbasedev.fd, VFIO_DEVICE_RESET)) {
Ero rimasto a Debian :D Su Gentoo forse è ancora più facile, gli utenti avanzati usano spesso le patch, dovrebbe esserci un wiki di Gentoo a riguardo.

PS: come detto non ricordo più il sistema di patching esatto, il testo nel riquadro dovrebbe essere corretto, ma non garantisco :rotfl:

mafferri
Messaggi: 809
Iscritto il: martedì 10 gennaio 2012, 4:48

Re: progetto linux per game con kvm

Messaggio da mafferri »

Ah ok , se è esatta , allora ho capito che comincia proprio con "diff" thx ;)

Ho scelto gentoo solo per avere già tutti gli strumenti necessari per la compilazione , vista la mia tendenza ad esplorare :asd: , e sopratutto una cosa o la capisci come funziona o non lo farà mai XD

hw/vfio/pci.c non mi trova nulla , potrebbe essere che sia questo? drivers/vfio/pci/vfio_pci.c

OT:
per le patch metto questo link , che le spiega :P

Jena Plisskin
Messaggi: 744
Iscritto il: sabato 9 febbraio 2013, 13:39

Re: progetto linux per game con kvm

Messaggio da Jena Plisskin »

hw/vfio/pci.c non mi trova nulla , potrebbe essere che sia questo? drivers/vfio/pci/vfio_pci.c
Eh no, il sorgente in tuo possesso deve avere lo stesso tree e revisione usata per fare la patch. Però solo ora mi sono accorto che il link dove viene data la patch è del 2015, non credo sia la stessa versione che hai tu con Gentoo. Detto questo di quale libreria stiamo parlando ? :rotfl: Così mi faccio una idea più esatta.

mafferri
Messaggi: 809
Iscritto il: martedì 10 gennaio 2012, 4:48

Re: progetto linux per game con kvm

Messaggio da mafferri »

Grazie dell'aiuto , la patch è per qemu :rotfl: mi applica solo l'ultima parte delle 4 :\
ho provato a cercare nel file quello che cercava la patch in altre righe ma , mi perdo :asd:

Jena Plisskin
Messaggi: 744
Iscritto il: sabato 9 febbraio 2013, 13:39

Re: progetto linux per game con kvm

Messaggio da Jena Plisskin »

La versione dei sorgenti ? Appena posso gli dò una occhiata. Nel frattempo cercando qualcosa a riguardo ho trovato questo blog, non sò se lo conosci ma sembra utile alla causa del passthrough :D

http://vfio.blogspot.it/

Edit: come non detto. lo conosci perchè in un post su AMD rimanda al tuo stesso link. Sò 'na volpe :rotfl:

Jena Plisskin
Messaggi: 744
Iscritto il: sabato 9 febbraio 2013, 13:39

Re: progetto linux per game con kvm

Messaggio da Jena Plisskin »

Sono andato sul sito di qemu ed ho scaricato i sorgenti di tutte le versioni stabili. Ho trovato il file col giusto path ma:

ver. 2.8.0 mi dà i passi 123 falliti il 4 ok
ver. 2.7.1 passi 1-3 ko 2-4 ok
ver. 2.6.2 idem
ver. 2.5.1.1 idem

Temo che quella è una patch di qualche release unstable non confermata, nella maillist non vedo evoluzioni sull'argomento :( Girocciando ho trovato qesto risalente a 5 msi fà, cprobabilmente le hai già viste ma come detto sono le più recenti che ho trovato (finora):

qui c'è una guida quasi passo passo
http://arseniyshestakov.com/2016/03/31/ ... x-restart/

per ubuntu, ma c'è la persona nominata nel primo link TGiFallen che ha inserito una patch
https://ubuntuforums.org/archive/index. ... 66916.html

la pagina git del tipo del primo blog
https://gist.github.com/ArseniyShestako ... 65ebaa6781

Non parlano proprio del reset bus ma dello switch tra schede, in *teoria* dovrebbe riguardare anche l'azione di nostro interesse ;)

Rispondi